有时由于某些原因,我们需要将字符、单词或者整个句子设置为半样式。
为此,我们需要使用一些 CSS 和 JavaScript。
下面我们就来学习一下如何操作。
使用 CSS 的半样式
可以仅使用 CSS 将一个字符设置为半样式。
首先,将带有“linear-gradient”值的背景属性设置为我们喜欢的方向,并指定每种颜色的可见度为 50%。
然后,将 background-clip 属性设置为“text”,以便在前景文本中绘制背景。
下一步是设置 text-fill-color 属性,该属性指定元素文本内容的前景填充颜色。
设置 webkit-text-fill-color: 透明;让文本采用背景属性定义的颜色。
添加半样式字符的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<style>
h1 {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 200px;
background: linear-gradient(to right, #1c87c9 50%, #8ebf42 50%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<h1>X</h1>
<p>This is a character with half-style.</p>
</body>
</html>
如果我们只想拥有一个字符的一半并为其设置样式,只需为线性渐变的第二部分设置“透明”值。
添加透明半样式字符的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<style>
h1 {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 200px;
background: linear-gradient(to right, #1c87c9 50%, transparent 50%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<p>这个字符有透明的半样式。 选择它以查看它的隐藏部分。</p>
<h1>X</h1>
</body>
</html>
现在,让我们讨论一种情况,当我们需要一个半样式的单词而不是单个字符时。
这不是那么困难。
在这种情况下,我们只需要在 <span> 元素中设置每个字母,并为 <span> 元素应用上述相同的样式。
添加半样式字的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<style>
span {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to right, #1c87c9 50%, #113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div>
<span>T</span>
<span>E</span>
<span>X</span>
<span>T</span>
</div>
</body>
</html>
使用 JavaScript/jQuery 的半样式
查看另一个示例,其中 CSS ::before 伪元素与 JavaScript 一起使用。
我们还可以为半样式文本设置 text-shadow 属性。
使用 jQuery 添加半样式文本的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 60px;
font-weight: bold;
text-align: center;
}
.half-style > span {
white-space: pre-line;
position: relative;
color: #1c87c9;
}
.half-style > span::before {
content: attr(data-content);
pointer-events: none;
position: absolute;
overflow: hidden;
color: #113155;
width: 50%;
z-index: 1;
}
</style>
</head>
<body>
<div class='half-style'>onitroad</div>
<script>
function wrapString(str) {
var output = [];
str.split('')
.forEach(function(letter) {
var wrapper = document.createElement('span');
wrapper.dataset.content = wrapper.innerHTML = letter;
output.push(wrapper.outerHTML);
});
return output.join('');
}
window.onload = function() {
var el = document.querySelector('.half-style')
, txt = el.innerHTML;
el.innerHTML = wrapString(txt);
}
</script>
</body>
</html>
请参阅另一个示例,其中使用 jQuery 获得三重效果。
使用用于三重效果的 jQuery 添加半样式文本的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossoroirn="anonymous"></script>
<style>
.halfStyle {
/* base char and also the right 1/3 */
position: relative;
display: inline-block;
font-size: 80px;/* or any font size will work */
color: transparent;/* hide the base character */
overflow: hidden;
white-space: pre;/* to preserve the spaces from collapsing */
color: #1c87c9;/* for demo purposes */
text-shadow: 2px 2px 0px #eee;/* for demo purposes */
}
.halfStyle:before {
/* creates the left 1/3 */
display: block;
z-index: 2;
position: absolute;
top: 0;
width: 33.33%;
content: attr(data-content);/* dynamic content for the pseudo element */
overflow: hidden;
pointer-events: none;/* so the base char is selectable by mouse */
color: #8ebf42;/* for demo purposes */
text-shadow: 2px -2px 0px #eee;/* for demo purposes */
}
.halfStyle:after {
/* creates the middle 1/3 */
display: block;
z-index: 1;
position: absolute;
top: 0;
width: 66.66%;
content: attr(data-content);/* dynamic content for the pseudo element */
overflow: hidden;
pointer-events: none;/* so the base char is selectable by mouse */
color: #666;/* for demo purposes */
text-shadow: 2px 2px 0px cyan;/* for demo purposes */
}
</style>
</head>
<body>
<hr/>
<p>Single Characters:</p>
<span class="halfStyle" data-content="T">T</span>
<span class="halfStyle" data-content="E">E</span>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="T">T</span>
<hr/>
<p>Automated on any text:</p>
<span class="textToHalfStyle">Half-style text.</span>
<hr/>
<script>
jQuery(function($) {
var halfstyle_text, halfstyle_chars, $halfstyle_el, halfstyle_i, halfstyle_output, halfstyle_style;
//Iterate over all class occurrences
$('.textToHalfStyle')
.each(function(idx, halfstyle_el) {
$halfstyle_el = $(halfstyle_el);
halfstyle_style = $halfstyle_el.data('halfstyle') || 'hs-base';
halfstyle_text = $halfstyle_el.text();
halfstyle_chars = halfstyle_text.split('');
//Set the screen-reader text
$halfstyle_el.html('<span style="position: absolute;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + halfstyle_text + '</span>');
//Reset output for appending
halfstyle_output = '';
//Iterate over all chars in the text
for (halfstyle_i = 0; halfstyle_i < halfstyle_chars.length; halfstyle_i++) {
//Create a styled element for each character and append to container
halfstyle_output += '<span aria-hidden="true" class="halfStyle ' + halfstyle_style + '" data-content="' + halfstyle_chars[halfstyle_i] + '">' + halfstyle_chars[halfstyle_i] + '</span>';
}
//Chrome 59 and above specific fix - Part 1 - Addresses a Chrome bug where Chrome fails to corectly render and repaint pseudo elements - I came up with this fix after many different tests.
var _applyChromeFix = !!window.chrome && !!navigator.appVersion.match(/.*Chrome\/([0-9\.]+)/) && parseInt(navigator.appVersion.match(/.*Chrome\/([0-9\.]+)/)[1], 10) >= 59;
if (_applyChromeFix) {
halfstyle_output += '<style>.halfStyle{}</style>';
}
//Write to DOM only once
$halfstyle_el.append(halfstyle_output);
//Chrome 59 and above specific fix - Part 2
if (_applyChromeFix) {
setTimeout(function() {
$halfstyle_el.find('style')
.remove();
}, 0);
}
});
});
</script>
</body>
</html>
垂直和水平半样式
定义半样式应该是垂直的还是水平的非常容易。
我们只需要指定线性渐变应该是从右到左还是从上到下。
添加垂直和水平半样式字母的示例:
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
<style>
.vertical {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to right, #1c87c9 50%, #113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.horizontal {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to top, #1c87c9 50%, #113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div>
<h2>I am a vertically half-styled letter.</h2>
<span class="vertical">X</span>
<h2>I am a horizontally half-styled letter.</h2>
<span class="horizontal">X</span>
</div>
</body>
</html>
日期:2020-06-02 22:14:57 来源:oir作者:oir
