我在找什么:
一种设置一半字符样式的方法。 (在这种情况下,一半的字母是透明的)
我目前搜索并尝试过的内容(没有运气):
样式化半个字符/字母的方法
使用 CSS 或 JavaScript 对字符的一部分进行样式设置
将 CSS 应用于 50% 的字符
下面是我试图获得的一个例子。
https://i.stack.imgur.com/SaH8v.png
是否存在 CSS 或 JavaScript 解决方案,或者我将不得不求助于图像?我不想走图像路线,因为这个文本最终会动态生成。
更新:
既然很多人问我为什么要设计角色的一半,这就是原因。我的城市最近花了 250,000 美元为自己定义一个新的“品牌”。这 logo 是他们想出的。许多人抱怨简单和缺乏创造力,并继续这样做。我的目标是想出这个 website 作为一个笑话。输入“哈利法克斯”,你就会明白我的意思。
现在作为插件在 GitHub 上!
https://i.stack.imgur.com/Glo2Q.png
演示 |下载邮编 | Half-Style.com(重定向到 GitHub)
单个字符的纯 CSS
JavaScript 用于跨文本或多个字符的自动化
为盲人或视障者的屏幕阅读器保留文本可访问性
第 1 部分:基本解决方案
https://i.stack.imgur.com/ZYic1.png
演示: http://jsfiddle.net/arbel/pd9yB/1694/
这适用于任何动态文本或单个字符,并且都是自动化的。您需要做的就是在目标文本上添加一个类,剩下的就交给我们了。
此外,为盲人或视障人士的屏幕阅读器保留了原始文本的可访问性。
单个字符的解释:
纯 CSS。您需要做的就是将 .halfStyle
类应用于每个包含您想要半样式化的字符的元素。
对于每个包含字符的 span 元素,您可以创建一个数据属性,例如此处的 data-content="X"
,并在伪元素上使用 content: attr(data-content);
,因此 .halfStyle:before
类将是动态的,您无需对其进行硬编码对于每个实例。
任何文本的解释:
只需将 textToHalfStyle
类添加到包含文本的元素。
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); }); .halfStyle { 位置:相对;显示:内联块;字体大小:80px; /* 或任何字体大小都可以 */ color: black; /* 或透明,任何颜色 */ overflow: hidden;空白:pre; /* 保护空格不折叠 */ } .halfStyle:before { display: block; z-index:1;位置:绝对;顶部:0;左:0;宽度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;颜色:#f00; }
单字符:
X Y Z A自动:
Half-风格,请。
第 2 部分:高级解决方案 - 独立的左右部件
https://i.stack.imgur.com/zYa0F.png
使用此解决方案,您可以单独和独立地设置左右部件的样式。
一切都是一样的,只有更高级的 CSS 才能发挥作用。
jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $el = $(el) ; text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 重置输出以追加 output = ''; // 遍历所有字符the text for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); }); }); .halfStyle { 位置:相对;显示:内联块;字体大小:80px; /* 或任何字体大小都可以 */ color: transparent; /* 隐藏基字符 */ overflow: hidden;空白:pre; /* 保留空格不折叠 */ } .halfStyle:before { /* 创建左侧部分 */ display: block; z-index:1;位置:绝对;顶部:0;宽度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #f00; /* 用于演示 */ text-shadow: 2px -2px 0px #af0; /* 用于演示目的 */ } .halfStyle:after { /* 创建右侧部分 */ display: block;方向:rtl; /* 很重要,会让宽度从右边开始 */ position: absolute; z指数:2;顶部:0;左:50%;宽度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #000; /* 用于演示 */ text-shadow: 2px 2px 0px #0af; /* 用于演示目的 */ }
单字符:
X Y Z A自动化:
半样式,请。
第 3 部分:混合搭配和改进
现在我们知道什么是可能的,让我们创建一些变化。
-水平半部分
没有文字阴影:
每个半部分独立的文本阴影的可能性:
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); }); .halfStyle { 位置:相对;显示:内联块;字体大小:80px; /* 或任何字体大小都可以 */ color: transparent; /* 隐藏基字符 */ overflow: hidden;空白:pre; /* 保留空格不折叠 */ } .halfStyle:before { /* 创建顶部 */ display: block; z指数:2;位置:绝对;顶部:0;高度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #f00; /* 用于演示 */ text-shadow: 2px -2px 0px #af0; /* 用于演示目的 */ } .halfStyle:after { /* 创建底部 */ display: block;位置:绝对; z-index:1;顶部:0;高度:100%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #000; /* 用于演示 */ text-shadow: 2px 2px 0px #0af; /* 用于演示目的 */ }
单字符:
X Y Z A自动化:
半样式,请。
-垂直 1/3 零件
没有文字阴影:
每个 1/3 部分独立的文本阴影的可能性:
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); }); .halfStyle { /* 基本字符和右 1/3 */ 位置:相对;显示:内联块;字体大小:80px; /* 或任何字体大小都可以 */ color: transparent; /* 隐藏基字符 */ overflow: hidden;空白:pre; /* 防止空格折叠 */ color: #f0f; /* 用于演示 */ text-shadow: 2px 2px 0px #0af; /* 用于演示目的 */ } .halfStyle:before { /* 创建左 1/3 */ display: block; z指数:2;位置:绝对;顶部:0;宽度:33.33%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #f00; /* 用于演示 */ text-shadow: 2px -2px 0px #af0; /* 用于演示目的 */ } .halfStyle:after { /* 创建中间 1/3 */ display: block; z-index:1;位置:绝对;顶部:0;宽度:66.66%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #000; /* 用于演示目的 */ text-shadow: 2px 2px 0px #af0; /* 用于演示目的 */ }
单字符:
X Y Z A自动化:
半样式,请。
-水平 1/3 零件
没有文字阴影:
每个 1/3 部分独立的文本阴影的可能性:
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); }); .halfStyle { /* 基本字符和底部 1/3 */ 位置:相对;显示:内联块;字体大小:80px; /* 或任何字体大小都可以 */ color: transparent;溢出:隐藏;空白:pre; /* 防止空格折叠 */ color: #f0f;文字阴影:2px 2px 0px #0af; /* 用于演示目的 */ } .halfStyle:before { /* 创建顶部 1/3 */ display: block; z指数:2;位置:绝对;顶部:0;身高:33.33%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #f00; /* 用于演示目的 */ text-shadow: 2px -2px 0px #fa0; /* 用于演示目的 */ } .halfStyle:after { /* 创建中间 1/3 */ display: block;位置:绝对; z-index:1;顶部:0;身高:66.66%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;指针事件:无; /* 所以基本字符可以通过鼠标选择 */ color: #000; /* 用于演示目的 */ text-shadow: 2px 2px 0px #af0; /* 用于演示目的 */ }
单字符:
X Y Z A自动化:
半样式,请。
-HalfStyle改进@KevinGranger
https://i.stack.imgur.com/PgdJ6.png
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); });身体{背景颜色:黑色; } .textToHalfStyle { 显示:块;边距:200px 0 0 0;文本对齐:居中; } .halfStyle { font-family: 'Libre Baskerville', serif;位置:相对;显示:内联块;宽度:1;字体大小:70px;颜色:黑色;溢出:隐藏;空白:pre;文字阴影:1px 2px 0 白色; } .halfStyle:before { 显示:块; z-index:1;位置:绝对;顶部:0;宽度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow: hidden;白颜色; }
单字符:
X Y Z A自动:
Half-风格,请。
-@SamTremaine 对 HalfStyle 的 PeelingStyle 改进
https://i.stack.imgur.com/r67KC.png
// 用于自动模式的 jQuery jQuery(function($) { var text, chars, $el, i, output; // 遍历所有出现的类 $('.textToHalfStyle').each(function(idx, el) { $ el = $(el); text = $el.text(); chars = text.split(''); // 设置屏幕阅读器文本 $el.html('' + text + ''); // 为追加输出重置输出 = ''; / / 遍历文本中的所有字符 for (i = 0; i < chars.length; i++) { // 为每个字符创建一个样式元素并附加到容器输出 += ' '; } // 只写入 DOM 一次 $el.append(output); } ); }); .halfStyle { 位置:相对;显示:内联块;字体大小:68px;颜色:rgba(0, 0, 0, 0.8);溢出:隐藏;空白:pre;变换:旋转(4度);文字阴影:2px 1px 3px rgba(0, 0, 0, 0.3); } .halfStyle:before { /* 创建左侧部分 */ display: block; z-index:1;位置:绝对;顶部:-0.5px;左:-3px;宽度:100%;内容:attr(数据内容);溢出:隐藏;指针事件:无;颜色:#FFF;变换:旋转(-4度);文字阴影:0px 0px 1px #000; }
单字符:
X Y Z A自动:
Half-风格,请。
(JSFiddle demo 和 samtremaine.co.uk)
第 4 部分:准备生产
可以在同一页面上的所需元素上使用定制的不同 Half-Style 样式集。您可以定义多个样式集并告诉插件使用哪一个。
该插件在目标 .textToHalfStyle
元素上使用数据属性 data-halfstyle="[-CustomClassName-]"
,并自动进行所有必要的更改。
因此,只需在包含文本的元素上添加 textToHalfStyle
类和数据属性 data-halfstyle="[-CustomClassName-]"
。该插件将完成剩下的工作。
https://i.stack.imgur.com/RxjKF.png
此外,CSS 样式集的类定义与上面提到的 [-CustomClassName-]
部分匹配并链接到 .halfStyle
,所以我们将有 .halfStyle.[-CustomClassName-]
jQuery(function($) { var halfstyle_text, halfstyle_chars, $halfstyle_el, halfstyle_i, halfstyle_output, halfstyle_style; // 遍历所有的类 $('.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(''); // 设置屏幕阅读器文本 $ halfstyle_el.html('' + halfstyle_text + ' '); // 为追加而重置输出 halfstyle_output = ''; // 遍历文本中的所有字符 for (halfstyle_i = 0; halfstyle_i < halfstyle_chars.length; halfstyle_i++) { // 为每个字符创建一个样式元素并追加到容器 halfstyle_output += '
半样式,请。
半样式,请。
半风格,请。
https://i.stack.imgur.com/TkwNq.png
我刚刚完成了插件的开发,大家都可以使用了!希望你会喜欢它。
在 GitHub 上查看项目 - 查看项目网站。 (所以你可以看到所有的拆分样式)
用法
首先,确保包含 jQuery
库。获取最新 jQuery 版本的最佳方法是更新您的 head 标签:
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
下载文件后,确保将它们包含在项目中:
<link rel="stylesheet" type="text/css" href="css/splitchar.css">
<script type="text/javascript" src="js/splitchar.js"></script>
标记
您所要做的就是分配类 splitchar
,然后将所需的样式分配给包装您的文本的元素。例如
<h1 class="splitchar horizontal">Splitchar</h1>
完成所有这些之后,只需确保在文档就绪文件中调用 jQuery 函数,如下所示:
$(".splitchar").splitchar();
定制
为了使文本看起来完全符合您的要求,您所要做的就是像这样应用您的设计:
.horizontal { /* Base CSS - e.g font-size */ }
.horizontal:before { /* CSS for the left half */ }
.horizontal:after { /* CSS for the right half */ }
就是这样!现在您已经设置好了 Splitchar
插件。 http://razvanbalosin.com/Splitchar.js/ 上有关它的更多信息。
是的,你可以只用一个字符和 CSS 来做到这一点:
h1 {显示:内联块;边距:0; /* 演示片段 */ line-height: 1em; /* 演示片段 */ font-family: helvetica, arial, sans-serif;字体粗细:粗体;字体大小:300px;背景:线性渐变(向右,#7db9e8 50%,#1e5799 50%);背景剪辑:文本; -webkit-text-fill-color:透明; }
从视觉上看,所有使用两个字符的示例(无论是通过 JS、CSS 伪元素还是只是 HTML)看起来都不错,但请注意,所有这些都向 DOM 添加了可能导致可访问性的内容——以及文本选择/剪切/粘贴问题。
background-clip: text
非常棒,他们应该考虑将它(或类似 text-decoration-background
的东西)用于第 4 级模块。
display: inline-block;
,则选择可以很好地处理多个字符,例如 <h1>X</h1><h1>Y</h1><h1>Z</h1>
。
https://i.stack.imgur.com/oBWFs.png
JSFiddle 演示
我们将只使用 CSS 伪选择器来完成它!
这种技术适用于动态生成的内容和不同的字体大小和宽度。
HTML:
<div class='split-color'>Two is better than one.</div>
CSS:
.split-color > span {
white-space: pre-line;
position: relative;
color: #409FBF;
}
.split-color > span:before {
content: attr(data-content);
pointer-events: none; /* Prevents events from targeting pseudo-element */
position: absolute;
overflow: hidden;
color: #264A73;
width: 50%;
z-index: 1;
}
要包装动态生成的字符串,您可以使用如下函数:
// Wrap each letter in a span tag and return an HTML string
// that can be used to replace the original text
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('');
}
// Replace the original text with the split-color text
window.onload = function() {
var el = document.querySelector('.split-color'),
txt = el.innerHTML;
el.innerHTML = wrapString(txt);
}
这是画布中一个丑陋的实现。我尝试了这个解决方案,但结果比我预期的要差,所以无论如何都是这样。
https://i.stack.imgur.com/ltPQu.png
$("div").each(function() { var CHARS = $(this).text().split(''); $(this).html(""); $.each(CHARS, function( index, char) { var canvas = $("") .css("width", "40px") .css("height", "40px") .get(0); $("div" ).append(canvas); var ctx = canvas.getContext("2d"); var gradient = ctx.createLinearGradient(0, 0, 130, 0); gradient.addColorStop("0", "blue"); 渐变。 addColorStop("0.5", "blue"); gradient.addColorStop("0.51", "red"); gradient.addColorStop("1.0", "red"); ctx.font = '130pt Calibri'; ctx.fillStyle =渐变;ctx.fillText(char, 10, 130); }); });
0.5
作为红色停止。
如果你对此感兴趣,那么 Lucas Bebber 的 Glitch 是一个非常相似且超酷的效果:
https://i.stack.imgur.com/63fkI.gif
使用简单的 SASS Mixin 创建,例如
.example-one {
font-size: 100px;
@include textGlitch("example-one", 17, white, black, red, blue, 450, 115);
}
Chris Coyer's CSS Tricks 和 Lucas Bebber's Codepen page 上的更多详细信息
我能得到的最近的:
$(function(){ $('span').width($('span').width()/2); $('span:nth-child(2)').css('text-indent' , -$('span').width()); });正文{字体系列:宋体; } span{ 显示:内联块;溢出:隐藏; } span:nth-child(2){ 颜色:红色; } XX< /跨度>
演示:http://jsfiddle.net/9wxfY/2/
这是只使用一个跨度的版本:http://jsfiddle.net/9wxfY/4/
$('span').width()
只返回它找到的第一个跨度的宽度;它必须是你为每一对做的事情。这给了我一个想法......
https://i.stack.imgur.com/RftEr.png
我刚刚玩了@Arbel 的解决方案:
var textToHalfStyle = $('.textToHalfStyle').text(); var textToHalfStyleChars = textToHalfStyle.split(''); $('.textToHalfStyle').html(''); $.each(textToHalfStyleChars, function(i,v){ $('.textToHalfStyle').append('' + v + '跨度>'); });身体{背景颜色:黑色; } .textToHalfStyle{ 显示:块;边距:200px 0 0 0;文本对齐:居中; } .halfStyle { font-family: 'Libre Baskerville', serif;位置:相对;显示:内联块;宽度:1;字体大小:70px;颜色:黑色;溢出:隐藏;空白:pre;文字阴影:1px 2px 0 白色; } .halfStyle:before { display:block; z-索引:1;位置:绝对;顶部:0;宽度:50%;内容:attr(数据内容); /* 伪元素的动态内容 */ overflow:hidden;白颜色; } 博士。 Jekyll 和 M. Hide
另一个纯 CSS 解决方案(如果您不想编写特定于字母的 CSS,则需要数据属性)。这个更全面(测试 IE 9/10,Chrome 最新和 FF 最新)
跨度{位置:相对;颜色:rgba(50,50,200,0.5); } span:before { 内容:attr(data-char);位置:绝对;宽度:50%;溢出:隐藏;颜色:RGB(50,50,200); } X
有限的 CSS 和 jQuery 解决方案
我不确定这个解决方案有多优雅,但它把所有东西都减半:http://jsfiddle.net/9wxfY/11/
否则,我已经为您创建了一个很好的解决方案......您需要做的就是为您的 HTML 设置这个:
查看截至 2016 年 6 月 13 日的最新准确编辑:http://jsfiddle.net/9wxfY/43/
至于 CSS,它是非常有限的......您只需将其应用于 :nth-child(even)
$(function(){ var $hc = $('.half-color'); var str = $hc.text(); $hc.html(""); var i = 0; var chars; var dupText; while(i < str.length){ chars = str[i]; if(chars == " ") chars = " "; dupText = "" + chars + ""; var firstHalf = $(dupText); var secondHalf = $(dupText); $hc.append(firstHalf) $hc.append(secondHalf) var width = firstHalf.width()/2; firstHalf.width(width); secondHalf.css( '文本缩进', -width); i++; } }); .half-color span{ 字体大小:2em;显示:内联块;溢出:隐藏; } .half-color span:nth-child(even){ color: red; }
一个很好的利用 background-clip: text
支持的解决方案:http://jsfiddle.net/sandro_paganotti/wLkVt/
span{
font-size: 100px;
background: linear-gradient(to right, black, black 50%, grey 50%, grey);
background-clip: text;
-webkit-text-fill-color: transparent;
}
.halfStyle {
position:relative;
display:inline-block;
font-size:68px; /* or any font size will work */
color: rgba(0,0,0,0.8); /* or transparent, any color */
overflow:hidden;
white-space: pre; /* to preserve the spaces from collapsing */
transform:rotate(4deg);
-webkit-transform:rotate(4deg);
text-shadow:2px 1px 3px rgba(0,0,0,0.3);
}
.halfStyle:before {
display:block;
z-index:1;
position:absolute;
top:-0.5px;
left:-3px;
width: 100%;
content: attr(data-content); /* dynamic content for the pseudo element */
overflow:hidden;
color: white;
transform:rotate(-4deg);
-webkit-transform:rotate(-4deg);
text-shadow:0 0 1px black;
}
http://experimental.samtremaine.co.uk/half-style/
你可以撬开这段代码来做各种有趣的事情——这只是我的同事和我昨晚想出的一个实现。
对于较短的文本,这样的事情怎么样?
如果您使用循环执行某些操作,它甚至可以处理更长的文本,使用 JavaScript 重复字符。无论如何,结果是这样的:
https://i.stack.imgur.com/IjKUY.png
p.char { 位置:相对;显示:内联块;字体大小:60px;红色; } p.char:之前 { 位置:绝对;内容:attr(char);宽度:50%;溢出:隐藏;颜色:黑色; }
S
t
a
c
k
o
v
e
r
f
l
< p class="char" char="o">ow
FWIW,这是我对仅使用 CSS 进行此操作的看法:http://codepen.io/ricardozea/pen/uFbts/
几个注意事项:
我这样做的主要原因是为了测试自己,看看我是否能够在为 OP 提供有意义的答案的同时完成半个角色的造型。
我知道这不是一个理想的或最具可扩展性的解决方案,这里的人们提出的解决方案对于“现实世界”的场景要好得多。
我创建的 CSS 代码是基于我想到的第一个想法和我自己解决问题的方法。
我的解决方案仅适用于对称字符,如 X、A、O、M。**它不适用于非对称字符,如 B、C、F、K 或小写字母。
** 然而,这种方法创建了非常有趣的带有不对称字符的“形状”。尝试在 CSS 中将 X 更改为 K 或小写字母,如 h 或 ap :)
HTML
<span class="half-letter"></span>
SCSS
.half-character {
display: inline-block;
font: bold 350px/.8 Arial;
position: relative;
&:before, &:after {
content: 'X'; //Change character here
display: inline-block;
width: 50%;
overflow: hidden;
color: #7db9e8;
}
&:after {
position: absolute;
top: 0;
left: 50%;
color: #1e5799;
transform: rotateY(-180deg);
}
}
这可以通过 CSS :before
选择器和 content property value
来实现。
.halfed, .halfed1 { 浮动:左; } .halfed, .halfed1 { font-family: arial;字体大小:300px;字体粗细:加粗;宽度:200px;高度:300px;位置:相对; /* 帮助保存内容值 */ overflow: hidden;颜色:#000; } .halfed:before, .halfed1:before { 宽度:50%; /* 我们想显示多少 */ overflow: hidden; /* 隐藏超出我们维度的内容 */ content: 'X'; /* 半角字符 */ height: 100%;位置:绝对;颜色:#28507D; } /* 对于水平截断 */ .halfed1:before { width: 100%;高度:55%; }
如果您愿意,也可以使用 SVG 来实现:
var title = document.querySelector('h1'), text = title.innerHTML, svgTemplate = document.querySelector('svg'), charStyle = svgTemplate.querySelector('#text'); svgTemplate.style.display = '块';变量空间 = 0; for (var i = 0; i < text.length; i++) { var x = charStyle.cloneNode(); x.textContent = 文本[i]; svgTemplate.appendChild(x); x.setAttribute('x', 空间);空格 += x.clientWidth || 15; } title.innerHTML = ''; title.appendChild(svgTemplate);
http://codepen.io/nicbell/pen/jGcbq
您可以使用以下代码。在此示例中,我使用了 h1
标记并添加了一个属性 data-title-text="Display Text"
,该属性将在 h1
标记文本元素上显示不同颜色的文本,从而产生半色文本,如下例所示
https://i.stack.imgur.com/yQQha.png
正文 { 文本对齐:中心;边距:0; } h1 { 颜色:#111;字体系列:arial;位置:相对;字体家族:'奥斯瓦尔德',无衬线;显示:内联块;字体大小:2.5em; } h1::after { 内容:attr(data-title-text);颜色:#e5554e;位置:绝对;左:0;顶部:0;剪辑:矩形(0、1000px、30px、0); }
只为载入史册!
我从 5 到 6 年前为自己的工作提出了一个解决方案,即 Gradext(纯 javascript 和纯 css,无依赖)。
技术解释是您可以创建这样的元素:
<span>A</span>
现在,如果您想在文本上制作渐变,您需要创建多个图层,每个图层都有特定的颜色,并且创建的光谱将说明渐变效果。
例如,看看这是 <span>
内的单词 lorem 并将导致水平渐变效果( check the examples ):
<span data-i="0" style="color: rgb(153, 51, 34);">L</span>
<span data-i="1" style="color: rgb(154, 52, 35);">o</span>
<span data-i="2" style="color: rgb(155, 53, 36);">r</span>
<span data-i="3" style="color: rgb(156, 55, 38);">e</span>
<span data-i="4" style="color: rgb(157, 56, 39);">m</span>
你也可以继续做这个模式很长一段时间和很长的段落。
https://i.stack.imgur.com/yMu0s.png
但!
如果您想在文本上创建垂直渐变效果怎么办?
然后还有另一种可能会有所帮助的解决方案。我会详细描述。
再次假设我们的第一个 <span>
。但内容不应该是单独的字母;内容应该是整个文本,现在我们将一次又一次地复制相同的 <span>
(跨度数将定义渐变的质量,跨度越大,结果越好,但性能不佳)。看看这个:
<span data-i="6" style="color: rgb(81, 165, 39); overflow: hidden; height: 11.2px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="7" style="color: rgb(89, 174, 48); overflow: hidden; height: 12.8px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="8" style="color: rgb(97, 183, 58); overflow: hidden; height: 14.4px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="9" style="color: rgb(105, 192, 68); overflow: hidden; height: 16px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="10" style="color: rgb(113, 201, 78); overflow: hidden; height: 17.6px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="11" style="color: rgb(121, 210, 88); overflow: hidden; height: 19.2px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
https://i.stack.imgur.com/Zo4J9.png
再次,但是!
如果你想让这些渐变效果移动并从中创建动画怎么办?
好吧,还有另一种解决方案。您绝对应该检查 animation: true
甚至 .hoverable()
方法,这将导致基于光标位置开始渐变! (听起来很酷xD)
https://i.stack.imgur.com/0zbUJ.gif
这就是我们如何在文本上创建渐变(线性或径向)。如果您喜欢这个想法或想了解更多信息,您应该查看提供的链接。
也许这不是最好的选择,也许不是最好的执行方式,但它会打开一些空间来创建令人兴奋和令人愉快的动画,以激励其他人寻求更好的解决方案。
它将允许您在文本上使用渐变样式,甚至 IE8 都支持!
Here you can find a working live demo 并且原始存储库是 here on GitHub as well, open source 并准备好获取一些更新 ( :D )
这是我第一次(是的,5 年后,你没听错)在 Internet 上的任何地方提到这个存储库,我对此感到很兴奋!
[更新 - 2019 年 8 月:] Github 删除了该存储库的 github-pages 演示,因为我来自伊朗!只有源代码可用here...
https://i.stack.imgur.com/9Rtre.png
这是整行文本的纯 CSS 解决方案,而不仅仅是字符元素。
div {位置:相对;顶部:2em;高度:2em;文本转换:全角; } div:before, div:after { 内容: attr(data-content);位置:绝对;顶部:0;右:0;底部:0;左:0; } div:after { 颜色: 红色; /* 单个字符的掩码。通过重复这个掩码,所有字符串都被掩码 */ -webkit-mask-image: linear-gradient(to right, transparent 0, transparent .5em, white .5em, white 1em); -webkit-mask-repeat:重复-x; /* 向右重复掩码 */ -webkit-mask-size: 1em; /* 单个字符的相对宽度 */ /* 非供应商掩码设置 */ mask-image: linear-gradient(to right, transparent 0, transparent .5em, white .5em, white 1em);掩码重复:重复-x;掩码大小:1em; } /* 演示目的 */ input[name="fontSize"]:first-of-type:checked ~ div { font-size: 1em; } input[name="fontSize"]:first-of-type + input:checked ~ div { font-size: 2em; } input[name="fontSize"]:first-of-type + input + input:checked ~ div { font-size: 3em; } 字体大小:
这个想法是为每个字符应用一个水平 CSS 掩码,隐藏它的前半部分 [0 - 0.5em] 并显示后半部分 [0.5em - 1em]。
掩码的宽度为 mask-size: 1em
以匹配字符串中第一个字符的宽度。通过使用 mask-repeat: repeat-x
,相同的掩码应用于第二个、第三个字符等等。
我以为使用字体 monospace
可以解决使用等宽字母的问题,但我错了。相反,我使用 text-transform: full-width
解决了这个问题,不幸的是,我相信它只支持 Firefox。
使用相对单位 em
允许设计根据 font-size
放大/缩小。
适用于所有浏览器的 Vanilla JavaScript 解决方案
如果 Firefox 不是一个选项,则使用此脚本进行救援。
它通过为每个字符插入一个子 span
来工作。在每个 span 内,从 [0% - 50%] 和 [50% - 100%] 字母的宽度(即 span 元素的宽度)放置一个不重复的 CSS 掩码。
这样我们就不再有使用相同宽度字符的限制了。
const dataElement = document.getElementById("data"), content = dataElement.textContent, zoom = function (fontSize) { dataElement.style['font-size'] = fontSize + 'em'; }; while (dataElement.firstChild) { dataElement.firstChild.remove() } for(var i = 0; i < content.length; ++i) { const spanElem = document.createElement('span'), ch = content[i ]; spanElem.setAttribute('data-ch', ch); spanElem.appendChild(document.createTextNode(ch === ' ' ? '\u00A0' : ch)); data.appendChild(spanElem); } #data { 位置:相对;顶部:2em;高度:2em;字体大小:2em; } #data span { 显示:内联块;位置:相对;颜色:透明; } #data span:before, #data span:after { 内容:attr(data-ch);显示:内联块;位置:绝对;顶部:0;右:0;底部:0;左:0;文本对齐:居中;颜色:初始; } #data span:after { color: red; -webkit-mask-image:线性渐变(向右,透明 0,透明 50%,白色 50%,白色 100%); mask-image:线性渐变(向右,透明 0,透明 50%,白色 50%,白色 100%); } 字体大小:
所有解决方案都通过拆分字母并将它们包装在 <span>
中来工作。我们不必在两种情况下拆分字母:
如果字体是等宽字体。
如果使用垂直布局。
div { 字体大小:80px;字体粗细:加粗;颜色:透明;填充:0;边距:0;背景:线性渐变(90度,rgb(34,67,143)0%50%,#409FBF 50%);背景剪辑:文本; -webkit-background-clip:文本; } .one { 字体系列:'Nova Mono';背景重复:重复-x;背景尺寸:45px; } .two { font-family: 'Gideon Roman';写作模式:垂直lr;文本方向:直立;字母间距:-35px;高度:500px; }
预期输出,以防字体不可用:
https://i.stack.imgur.com/n4N1F.png
我知道背景剪辑和渐变的使用已经在其他答案中得到了证明,只是在你不必拆分字母的情况下。