是否可以将CSS应用于一半的字符?

Is it possible to apply CSS to half of a character?

提问人:SimplyAzuma 提问时间:5/10/2014 最后编辑:TylerHSimplyAzuma 更新时间:1/26/2022 访问量:291062

问:

我在寻找什么:

一种设置角色一半样式的方法。(在这种情况下,字母的一半是透明的)

我目前搜索和尝试过的东西(没有运气):

  • 设置字符/字母一半样式的方法
  • 使用 CSS 或 JavaScript 设置字符部分的样式
  • 将 CSS 应用于字符的 50%

以下是我试图获得的一个例子。

x

是否存在CSS或JavaScript解决方案,或者我将不得不求助于图像?我宁愿不走图像路线,因为此文本最终将动态生成。


更新:

既然很多人问我为什么要设计一个角色的一半,这就是原因。我的城市最近花了25万美元为自己定义一个新的“品牌”。这个标志是他们想出来的。许多人抱怨简单和缺乏创造力,并继续这样做。我的目标是把这个网站当成一个笑话。输入“哈利法克斯”,你就会明白我的意思。

JavaScript HTML CSS

评论

2赞 5/26/2018
评论不用于扩展讨论;此对话已移至 Chat
16赞 user9993 10/28/2018
他们问“为什么”,因为他们想知道为什么你会使用CSS而不使用SVG或图像编辑器。与其徽标的商业决策无关。根据您链接到他们的徽标,您为什么不直接裁剪 X?
6赞 Nasia Makrygianni 3/2/2021
在将其中一些方法应用于文本之前,请考虑可访问性。下面提到的方法非常令人沮丧,因为它们不能提高视力不佳、学习障碍、失语症、阅读障碍或成人识字率低的人的易读性和可读性。有一些指导方针需要遵循,甚至谷歌也宣布将开始根据网站对WCAG规则的遵守情况对网站进行排名。与那些使用工具作为斧头的人进行测试很容易。如果改用图像/svg,那么两者都需要一个文本替代来传达信息。

答:

66赞 Prisoner 5/10/2014 #1

我能得到的最接近的:

$(function(){
  $('span').width($('span').width()/2);
  $('span:nth-child(2)').css('text-indent', -$('span').width());
});
body{
  font-family: arial;
}
span{
  display: inline-block;
  overflow: hidden;
}
span:nth-child(2){
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>X</span><span>X</span>

演示:http://jsfiddle.net/9wxfY/2/

下面是一个只使用一个跨度的版本:http://jsfiddle.net/9wxfY/4/

评论

2赞 Pointy 5/10/2014
$('span').width()只返回它找到的第一个跨度的宽度;它必须是你为每对所做的事情。这给了我一个想法......
1赞 SimplyAzuma 5/10/2014
这与 jsfiddle.net/9WWsd 中发现的 epascarello 的例子非常相似。正如我告诉他的,你的例子是朝着正确方向迈出的一步,但是,在更大范围内使用将是一场噩梦。
0赞 Prisoner 5/10/2014
@MathewMacLean,我没有看到。为什么会是一场噩梦?这个怎么样:jsfiddle.net/9wxfY/4
0赞 SimplyAzuma 5/10/2014
当您实现多个字符时,会导致问题。
0赞 MStrutt 5/13/2014
如果您有兴趣,我在您的第二个示例中略微了解了优化 JS: jsfiddle.net/9wxfY/20
533赞 Razvan B. 5/10/2014 #2

enter image description here


我刚刚完成了插件的开发,每个人都可以使用!希望你会喜欢它。

GitHub 上查看项目 - 查看项目网站(所以你可以看到所有的拆分样式)

用法

首先,确保包含库。获取最新jQuery版本的最佳方法是使用以下命令更新head标签:jQuery

<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 */ }


就是这样!现在你已经设置好了插件。有关它的更多信息,请访问 http://razvanbalosin.com/Splitchar.js/Splitchar

评论

0赞 SimplyAzuma 5/10/2014
它看起来是这样!虽然,我可以看到一个问题。是什么导致了一些字母之间的差距?例如,两个 D 之间的巨大差距。
0赞 Razvan B. 5/10/2014
嗯,那是因为间距和边距。无论如何,我会对此进行研究并改进它。(可能我会做一个“插件”)很高兴我能帮:)
4赞 BoltClock 5/10/2014
这在文本换行方面存在问题,即使在最新的小提琴中也会出现问题。当一个字符换行时,它基本上会分成两个字符。不过,应该是一个微不足道的修复。
20赞 Niels Bom 5/13/2014
不要依赖jquery-latest.min.js,如果jQuery已更新并且插件无法与较新的插件一起使用,它可能会使您的网站中断而不会发出警告。相反:使用特定版本并在更新时检查兼容性。
3赞 Useless Code 2/25/2016
您可能希望编辑您的答案,不建议使用 jquery-latest.js。@NielsBom如前所述,在过去,它可能会在更新时破坏您的网站。自 2014 年 7 月以来,它不会这样做,但那是因为它被锁定在 1.11.1 版,永远不会再次更新。
176赞 wvandaal 5/10/2014 #3

Example


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);
}
42赞 Adjit 5/10/2014 #4

有限的 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 = "&nbsp;";
    dupText = "<span>" + chars + "</span>";

    var firstHalf = $(dupText);
    var secondHalf = $(dupText);

    $hc.append(firstHalf)
    $hc.append(secondHalf)

    var width = firstHalf.width()/2;

    firstHalf.width(width);
    secondHalf.css('text-indent', -width);

    i++;
  }
});
.half-color span{
  font-size: 2em;
  display: inline-block;
  overflow: hidden;
}
.half-color span:nth-child(even){
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="half-color">This is a sentence</div>

3149赞 Arbel 5/10/2014 #5

现在在 GitHub 上作为插件!

enter image description here随意分叉和改进。

演示 |下载 Zip |Half-Style.com(重定向到 GitHub)


  • 单个字符的纯 CSS
  • 用于跨文本或多个字符实现自动化的 JavaScript
  • 为盲人或视觉对象保留屏幕阅读器的文本辅助功能 受损

第 1 部分:基本解决方案

Half Style on text

演示:http://jsfiddle.net/arbel/pd9yB/1694/


这适用于任何动态文本或单个字符,并且都是自动化的。您需要做的就是在目标文本上添加一个类,其余的就完成了。

此外,还为盲人或视障人士的屏幕阅读器保留了原始文本的可访问性。

单个字符的解释:

纯 CSS。您需要做的就是将类应用于包含要设置一半样式的字符的每个元素。.halfStyle

对于每个包含字符的 span 元素,您可以创建一个数据属性,例如 此处 ,并在伪元素上使用,因此该类将是动态的,并且您不需要为每个实例对其进行硬编码。data-content="X"content: attr(data-content);.halfStyle:before

对任何文本的解释:

只需将类添加到包含文本的元素中即可。textToHalfStyle


// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
    $el = $(el);
    text = $el.text();
    chars = text.split('');

    // Set the screen-reader text
    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

    // Reset output for appending
    output = '';

    // Iterate over all chars in the text
    for (i = 0; i < chars.length; i++) {
        // Create a styled element for each character and append to container
        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
    }

    // Write to DOM only once
    $el.append(output);
  });
});
.halfStyle {
    position: relative;
    display: inline-block;
    font-size: 80px; /* or any font size will work */
    color: black; /* or transparent, any color */
    overflow: hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
}

.halfStyle:before {
    display: block;
    z-index: 1;
    position: absolute;
    top: 0;
    left: 0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow: hidden;
    color: #f00;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)


第 2 部分:高级解决方案 - 独立的左右部件

Half Style on text - advanced - With Text Shadow

使用此解决方案,您可以单独和独立地设置左右零件的样式

一切都是一样的,只有更高级的CSS才能发挥魔力。

jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
        $el = $(el);
        text = $el.text();
        chars = text.split('');

        // Set the screen-reader text
        $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

        // Reset output for appending
        output = '';

        // Iterate over all chars in the text
        for (i = 0; i < chars.length; i++) {
            // Create a styled element for each character and append to container
            output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
        }

        // Write to DOM only once
        $el.append(output);
    });
});
.halfStyle {
    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 */
}

.halfStyle:before { /* creates the left part */
    display: block;
    z-index: 1;
    position: absolute;
    top: 0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow: hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #af0; /* for demo purposes */
}

.halfStyle:after { /* creates the right part */
    display: block;
    direction: rtl; /* very important, will make the width to start from right */
    position: absolute;
    z-index: 2;
    top: 0;
    left: 50%;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow: hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)



第 3 部分:混合搭配和改进

现在我们知道什么是可能的,让我们创建一些变体。


-卧式半零件 (Horizontal half parts)

  • 无文本阴影:

    Horizontal Half Parts - No Text Shadow

  • 每个半部分独立出现文本阴影的可能性:

    halfStyle - Horizontal Half Parts - With Text Shadow

// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
        $el = $(el);
        text = $el.text();
        chars = text.split('');

        // Set the screen-reader text
        $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

        // Reset output for appending
        output = '';

        // Iterate over all chars in the text
        for (i = 0; i < chars.length; i++) {
            // Create a styled element for each character and append to container
            output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
        }

        // Write to DOM only once
        $el.append(output);
    });
});
.halfStyle {
  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 */
}

.halfStyle:before { /* creates the top part */
  display: block;
  z-index: 2;
  position: absolute;
  top: 0;
  height: 50%;
  content: attr(data-content); /* dynamic content for the pseudo element */
  overflow: hidden;
  pointer-events: none; /* so the base char is selectable by mouse */
  color: #f00; /* for demo purposes */
  text-shadow: 2px -2px 0px #af0; /* for demo purposes */
}

.halfStyle:after { /* creates the bottom part */
  display: block;
  position: absolute;
  z-index: 1;
  top: 0;
  height: 100%;
  content: attr(data-content); /* dynamic content for the pseudo element */
  overflow: hidden;
  pointer-events: none; /* so the base char is selectable by mouse */
  color: #000; /* for demo purposes */
  text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)



-立式 1/3 部分

  • 无文本阴影:

    halfStyle - Vertical 1/3 Parts - No Text Shadow

  • 每个 1/3 部分独立使用文本阴影的可能性:

    halfStyle - Vertical 1/3 Parts - With Text Shadow

// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
    $el = $(el);
    text = $el.text();
    chars = text.split('');

    // Set the screen-reader text
    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

    // Reset output for appending
    output = '';

    // Iterate over all chars in the text
    for (i = 0; i < chars.length; i++) {
        // Create a styled element for each character and append to container
        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
    }

    // Write to DOM only once
    $el.append(output);
  });
});
.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: #f0f; /* for demo purposes */
    text-shadow: 2px 2px 0px #0af; /* 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: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #af0; /* 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: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)



-水平 1/3 部分

  • 无文本阴影:

    halfStyle - Horizontal 1/3 Parts - No Text Shadow

  • 每个 1/3 部分独立使用文本阴影的可能性:

    halfStyle - Horizontal 1/3 Parts - With Text Shadow

// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
    $el = $(el);
    text = $el.text();
    chars = text.split('');

    // Set the screen-reader text
    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

    // Reset output for appending
    output = '';

    // Iterate over all chars in the text
    for (i = 0; i < chars.length; i++) {
        // Create a styled element for each character and append to container
        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
    }

    // Write to DOM only once
    $el.append(output);
  });
});
.halfStyle { /* base char and also the bottom 1/3 */
  position: relative;
  display: inline-block;
  font-size: 80px; /* or any font size will work */
  color: transparent;
  overflow: hidden;
  white-space: pre; /* to preserve the spaces from collapsing */
  color: #f0f;
  text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}

.halfStyle:before { /* creates the top 1/3 */
  display: block;
  z-index: 2;
  position: absolute;
  top: 0;
  height: 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: #f00; /* for demo purposes */
  text-shadow: 2px -2px 0px #fa0; /* for demo purposes */
}

.halfStyle:after { /* creates the middle 1/3 */
  display: block;
  position: absolute;
  z-index: 1;
  top: 0;
  height: 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: #000; /* for demo purposes */
  text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)



-HalfStyle @KevinGranger改进

halfStyle - KevinGranger

// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
    $el = $(el);
    text = $el.text();
    chars = text.split('');

    // Set the screen-reader text
    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

    // Reset output for appending
    output = '';

    // Iterate over all chars in the text
    for (i = 0; i < chars.length; i++) {
        // Create a styled element for each character and append to container
        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
    }

    // Write to DOM only once
    $el.append(output);
  });
});
body {
    background-color: black;
}

.textToHalfStyle {
    display: block;
    margin: 200px 0 0 0;
    text-align: center;
}

.halfStyle {
    font-family: 'Libre Baskerville', serif;
    position: relative;
    display: inline-block;
    width: 1;
    font-size: 70px;
    color: black;
    overflow: hidden;
    white-space: pre;
    text-shadow: 1px 2px 0 white;
}

.halfStyle:before {
    display: block;
    z-index: 1;
    position: absolute;
    top: 0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow: hidden;
    color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示)



-PeelingStyle 对 HalfStyle 的改进由 @SamTremaine

halfStyle - SamTremaine

// jQuery for automated mode
jQuery(function($) {
    var text, chars, $el, i, output;

    // Iterate over all class occurences
    $('.textToHalfStyle').each(function(idx, el) {
    $el = $(el);
    text = $el.text();
    chars = text.split('');

    // Set the screen-reader text
    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');

    // Reset output for appending
    output = '';

    // Iterate over all chars in the text
    for (i = 0; i < chars.length; i++) {
        // Create a styled element for each character and append to container
        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
    }

    // Write to DOM only once
    $el.append(output);
  });
});
.halfStyle {
    position: relative;
    display: inline-block;
    font-size: 68px;
    color: rgba(0, 0, 0, 0.8);
    overflow: hidden;
    white-space: pre;
    transform: rotate(4deg);
    text-shadow: 2px 1px 3px rgba(0, 0, 0, 0.3);
}

.halfStyle:before { /* creates the left part */
    display: block;
    z-index: 1;
    position: absolute;
    top: -0.5px;
    left: -3px;
    width: 100%;
    content: attr(data-content);
    overflow: hidden;
    pointer-events: none;
    color: #FFF;
    transform: rotate(-4deg);
    text-shadow: 0px 0px 1px #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>

<hr/>
<p>Automated:</p>

<span class="textToHalfStyle">Half-style, please.</span>

(JSFiddle 演示samtremaine.co.uk)



第 4 部分:准备生产

自定义的不同半样式样式集可以用于同一页面上的所需元素。 您可以定义多个样式集,并告诉插件使用哪一个。

该插件在目标元素上使用 data 属性,并自动进行所有必要的更改。data-halfstyle="[-CustomClassName-]".textToHalfStyle

因此,只需在包含文本的元素上添加 class 和 data 属性即可。该插件将完成其余的工作。textToHalfStyledata-halfstyle="[-CustomClassName-]"

halfStyle - Multiple on Same Page

此外,CSS 样式集的类定义与上面提到的部分匹配并链接到 ,因此我们将有[-CustomClassName-].halfStyle.halfStyle.[-CustomClassName-]

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 !important;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>';
        }

        // Write to DOM only once
        $halfstyle_el.append(halfstyle_output);
    });
});
/* start half-style hs-base */

.halfStyle.hs-base {
    position: relative;
    display: inline-block;
    font-size: 80px; /* or any font size will work */
    overflow: hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #000; /* for demo purposes */
}

.halfStyle.hs-base:before {
    display: block;
    z-index: 1;
    position: absolute;
    top: 0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    pointer-events: none; /* so the base char is selectable by mouse */
    overflow: hidden;
    color: #f00; /* for demo purposes */
}

/* end half-style hs-base */


/* start half-style hs-horizontal-third */

.halfStyle.hs-horizontal-third { /* base char and also the bottom 1/3 */
    position: relative;
    display: inline-block;
    font-size: 80px; /* or any font size will work */
    color: transparent;
    overflow: hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #f0f;
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}

.halfStyle.hs-horizontal-third:before { /* creates the top 1/3 */
    display: block;
    z-index: 2;
    position: absolute;
    top: 0;
    height: 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: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #fa0; /* for demo purposes */
}

.halfStyle.hs-horizontal-third:after { /* creates the middle 1/3 */
    display: block;
    position: absolute;
    z-index: 1;
    top: 0;
    height: 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: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}

/* end half-style hs-horizontal-third */


/* start half-style hs-PeelingStyle, by user SamTremaine on Stackoverflow.com */

.halfStyle.hs-PeelingStyle {
  position: relative;
  display: inline-block;
  font-size: 68px;
  color: rgba(0, 0, 0, 0.8);
  overflow: hidden;
  white-space: pre;
  transform: rotate(4deg);
  text-shadow: 2px 1px 3px rgba(0, 0, 0, 0.3);
}

.halfStyle.hs-PeelingStyle:before { /* creates the left part */
  display: block;
  z-index: 1;
  position: absolute;
  top: -0.5px;
  left: -3px;
  width: 100%;
  content: attr(data-content);
  overflow: hidden;
  pointer-events: none;
  color: #FFF;
  transform: rotate(-4deg);
  text-shadow: 0px 0px 1px #000;
}

/* end half-style hs-PeelingStyle */


/* start half-style hs-KevinGranger, by user KevinGranger on StackOverflow.com*/

.textToHalfStyle.hs-KevinGranger {
  display: block;
  margin: 200px 0 0 0;
  text-align: center;
}

.halfStyle.hs-KevinGranger {
  font-family: 'Libre Baskerville', serif;
  position: relative;
  display: inline-block;
  width: 1;
  font-size: 70px;
  color: black;
  overflow: hidden;
  white-space: pre;
  text-shadow: 1px 2px 0 white;
}

.halfStyle.hs-KevinGranger:before {
  display: block;
  z-index: 1;
  position: absolute;
  top: 0;
  width: 50%;
  content: attr(data-content); /* dynamic content for the pseudo element */
  overflow: hidden;
  color: white;
}

/* end half-style hs-KevinGranger
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>
    <span class="textToHalfStyle" data-halfstyle="hs-base">Half-style, please.</span>
</p>
<p>
    <span class="textToHalfStyle" data-halfstyle="hs-horizontal-third">Half-style, please.</span>
</p>
<p>
    <span class="textToHalfStyle" data-halfstyle="hs-PeelingStyle">Half-style, please.</span>
</p>
<p style="background-color:#000;">
    <span class="textToHalfStyle" data-halfstyle="hs-KevinGranger">Half-style, please.</span>
</p>

(JSFiddle 演示)

评论

0赞 5/26/2018
评论不用于扩展讨论;此对话已移至 Chat
20赞 Andrew Ensley 1/1/2019
这很酷。值得注意的是,这种技术打破了自动换行、空格和字符间距的 CSS。
266赞 DA. 5/10/2014 #6

是的,您只能使用一个字符和 CSS 来执行此操作:

http://jsbin.com/rexoyice/1/

h1 {
  display: inline-block;
  margin: 0; /* for demo snippet */
  line-height: 1em; /* for demo snippet */
  font-family: helvetica, arial, sans-serif;
  font-weight: bold;
  font-size: 300px;
  background: linear-gradient(to right, #7db9e8 50%,#1e5799 50%);
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
<h1>X</h1>

从视觉上看,所有使用两个字符的示例(无论是通过 JS、CSS 伪元素还是只是 HTML)看起来都很好,但请注意,所有这些示例都向 DOM 添加了内容,这可能会导致可访问性以及文本选择/剪切/粘贴问题。

评论

55赞 BoltClock 5/13/2014
WebKit 有渲染错误的历史,这些错误几乎是 IE6/IE7 级别的怪异(你甚至可以说 Safari 和 Chrome 是现代 Web 的 IE6),并且行为方式无缘无故地偏离了标准。IE 自第 9 版以来已经好多了,所以虽然古代版本应该已经死了,但我看不出有任何理由讨厌它的最新版本。我当然不明白为什么人们支持 WebKit/Blink 单一文化的想法(这里的评论可能是开玩笑的,但我听说过有人认真相信它)。
4赞 BoltClock 5/13/2014
话虽如此,这真是太棒了,他们应该考虑将其(或类似的东西)用于 4 级模块。background-clip: texttext-decoration-background
3赞 Eamon Nerbonne 5/13/2014
是的,如果 blink/webkit 死了,而现代 IE 的 +FF 渲染引擎幸存下来,我会更高兴,而不是相反。这并不是说chrome的其余部分不好,只是说它的渲染几乎是当今最糟糕的。
0赞 Eamon Nerbonne 5/15/2014
@DA:当然。然而,Blink 仍然与 webkit 非常相似,而且可疑的行为并不全是分叉后的,所以我不太确定是否值得非常强烈地进行区分。尽管如此,野生动物园似乎确实没有那么多问题。
0赞 Bob Smith 2/27/2015
如果从 css 中删除,则选择可以很好地处理多个字符,例如 .display: inline-block;<h1>X</h1><h1>Y</h1><h1>Z</h1>
35赞 Sandro Paganotti 5/10/2014 #7

一个很好的解决方案,它利用了以下支持:http://jsfiddle.net/sandro_paganotti/wLkVt/background-clip: text

span{
   font-size: 100px;
   background: linear-gradient(to right, black, black 50%, grey 50%, grey);
   background-clip: text;
   -webkit-text-fill-color: transparent;
}
85赞 Fiambre 5/10/2014 #8

这是一个丑陋的 canvas 实现。我尝试了这个解决方案,但结果比我预期的要差,所以无论如何都在这里。

Canvas example

$("div").each(function() {
  var CHARS = $(this).text().split('');
  $(this).html("");
  $.each(CHARS, function(index, char) {
    var canvas = $("<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");
    gradient.addColorStop("0.5", "blue");
    gradient.addColorStop("0.51", "red");
    gradient.addColorStop("1.0", "red");
    ctx.font = '130pt Calibri';
    ctx.fillStyle = gradient;
    ctx.fillText(char, 10, 130);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Example Text</div>

评论

2赞 Toothbrush 6/9/2014
顺便说一句,您也可以用于红色停止。0.5
47赞 MStrutt 5/13/2014 #9

另一个纯 CSS 解决方案(尽管如果您不想编写特定于字母的 CSS,则需要 data-attribute)。这个更全面地工作(测试IE 9/10,Chrome最新和FF最新)

span {
  position: relative;
  color: rgba(50,50,200,0.5);
}

span:before {
  content: attr(data-char);
  position: absolute;
  width: 50%;
  overflow: hidden;
  color: rgb(50,50,200);
}
<span data-char="X">X</span>

58赞 Shipow 5/13/2014 #10

Enter image description here

我只是玩了@Arbel的解决方案:

var textToHalfStyle = $('.textToHalfStyle').text();
var textToHalfStyleChars = textToHalfStyle.split('');
$('.textToHalfStyle').html('');
$.each(textToHalfStyleChars, function(i,v){
    $('.textToHalfStyle').append('<span class="halfStyle" data-content="' + v + '">' + v + '</span>');
});
body{
    background-color: black;
}
.textToHalfStyle{
    display:block;
    margin: 200px 0 0 0;
    text-align:center;
}
.halfStyle {
    font-family: 'Libre Baskerville', serif;
    position:relative;
    display:inline-block;
    width:1;
    font-size:70px;
    color: black;
    overflow:hidden;
    white-space: pre;
    text-shadow: 1px 2px 0 white;
}
.halfStyle:before {
    display:block;
    z-index:1;
    position:absolute;
    top:0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<span class="textToHalfStyle">Dr. Jekyll and M. Hide</span>

评论

5赞 A.L 5/13/2014
刚刚玩过@Arbel解决方案与 Arbel 的解决方案有什么区别?很难看出你是否只是复制粘贴了一些代码或改进了它。
34赞 Sam Tremaine 5/13/2014 #11
.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/

你可以用撬棍来做各种有趣的事情——这只是我和我的同事昨晚想出的一个实现。

20赞 Nic Bell 5/15/2014 #12

如果您愿意,也可以使用 SVG 来完成:

var title = document.querySelector('h1'),
    text = title.innerHTML,
    svgTemplate = document.querySelector('svg'),
    charStyle = svgTemplate.querySelector('#text');

svgTemplate.style.display = 'block';

var space = 0;

for (var i = 0; i < text.length; i++) {
  var x = charStyle.cloneNode();
  x.textContent = text[i];
  svgTemplate.appendChild(x);
  x.setAttribute('x', space);
  space += x.clientWidth || 15;
}

title.innerHTML = '';
title.appendChild(svgTemplate);
<svg style="display: none; height: 100px; width: 100%" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
    <defs id="FooDefs">
        <linearGradient id="MyGradient" x1="0%" y1="0%" x2="100%" y2="0%">
            <stop offset="50%" stop-color="blue" />
            <stop offset="50%" stop-color="red" />
        </linearGradient>
    </defs>
    <text y="50%" id="text" style="font-size: 72px; fill: url(#MyGradient)"></text>
</svg>

<h1>This is not a solution X</h1>

http://codepen.io/nicbell/pen/jGcbq

27赞 Ricardo Zea 5/17/2014 #13

FWIW,这是我对此的看法,仅使用 CSS 执行此操作:http://codepen.io/ricardozea/pen/uFbts/

几点说明:

  • 我这样做的主要原因是测试自己,看看我是否能够完成半个角色的造型,同时真正为 OP 提供有意义的答案。

  • 我知道这不是一个理想或最具可扩展性的解决方案,这里的人提出的解决方案对于“现实世界”场景要好得多。

  • 我创建的CSS代码是基于我脑海中浮现的第一个想法以及我自己对问题的个人处理方法。

  • 我的解决方案仅适用于对称字符,如 X、A、O、M。 **它不适用于 B、C、F、K 或小写字母等非对称字符。

  • ** 然而,这种方法创造了非常有趣的“形状”,具有不对称的字符。尝试将 X 更改为 K 或小写字母,如 CSS :)中的 hp

[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);
  }
}
88赞 Ruskin 10/1/2014 #14

如果你对此感兴趣,那么卢卡斯·贝伯(Lucas Bebber)的《故障》是一个非常相似且超酷的效果:

enter image description here

使用简单的 SASS Mixin 创建,例如

.example-one {
  font-size: 100px;
  @include textGlitch("example-one", 17, white, black, red, blue, 450, 115);
}

更多细节请见 Chris Coyer 的 CSS TricksLucas Bebber 的 Codepen 页面

21赞 Sleek Geek 1/14/2016 #15

这可以通过 CSS 选择器和 .:beforecontent property value

.halfed, .halfed1 {
  float: left;
}

.halfed, .halfed1 {
  font-family: arial;
  font-size: 300px;
  font-weight: bolder;
  width: 200px;
  height: 300px;
  position: relative; /* To help hold the content value within */
  overflow: hidden;
  color: #000;
}




.halfed:before, .halfed1:before   {
  width: 50%; /* How much we'd like to show */
  overflow: hidden; /* Hide what goes beyond our dimension */  
  content: 'X'; /* Halfed character */
  height: 100%;
  position: absolute;
  color: #28507D;

}



/* For Horizontal cut off */ 

.halfed1:before   {
  width: 100%;
  height: 55%;
  
}
<div class="halfed"> X </div>

<div class="halfed1"> X </div>

>> 在 jsFiddle 上查看

10赞 Gauri Bhosle 5/4/2017 #16

您可以使用以下代码。在此示例中,我使用了标签并添加了一个属性,该属性将在标签文本元素上显示不同颜色的文本,从而产生半色文本的效果,如以下示例所示h1data-title-text="Display Text"h1

enter image description here

body {
  text-align: center;
  margin: 0;
}

h1 {
  color: #111;
  font-family: arial;
  position: relative;
  font-family: 'Oswald', sans-serif;
  display: inline-block;
  font-size: 2.5em;
}

h1::after {
  content: attr(data-title-text);
  color: #e5554e;
  position: absolute;
  left: 0;
  top: 0;
  clip: rect(0, 1000px, 30px, 0);
}
<h1 data-title-text="Display Text">Display Text</h1>

32赞 Alireza 6/19/2017 #17

对于较短的文本,这样的东西怎么样?

如果您通过循环执行某些操作,使用 JavaScript 重复字符,它甚至可以用于更长的文本。无论如何,结果是这样的:

Is it possible to apply CSS to half of a character?

p.char {
  position: relative;
  display: inline-block;
  font-size: 60px;
  color: red;
}

p.char:before {
  position: absolute;
  content: attr(char);
  width: 50%;
  overflow: hidden;
  color: black;
}
<p class="char" char="S">S</p>
<p class="char" char="t">t</p>
<p class="char" char="a">a</p>
<p class="char" char="c">c</p>
<p class="char" char="k">k</p>
<p class="char" char="o">o</p>
<p class="char" char="v">v</p>
<p class="char" char="e">e</p>
<p class="char" char="r">r</p>
<p class="char" char="f">f</p>
<p class="char" char="l">l</p>
<p class="char" char="o">o</p>
<p class="char" char="w">w</p>

8赞 mrReiha 12/15/2018 #18

只为载入史册!

我在 5-6 年前为自己的工作提出了一个解决方案,即 Gradext(纯 javascript 和纯 css,无依赖性)。

技术解释是,您可以创建如下元素:

<span>A</span>

现在,如果要在文本上制作渐变,则需要创建一些多个图层,每个图层都具有特定的颜色,创建的光谱将说明渐变效果。

例如,看看这是 a 里面的单词 lorem,会引起水平渐变效果(查看示例):<span>

 <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>

你可以继续做这个模式很长一段时间,也可以做很长的段落。

enter image description here

但!

如果要在文本上创建垂直渐变效果怎么办?

然后还有另一种可能有帮助的解决方案。我将详细描述。

再次假设我们的第一个。但内容不应该是单独的字母;内容应该是整个文本,现在我们将一遍又一遍地复制相同的内容(跨度计数将定义梯度的质量,跨度更大,结果更好,但性能较差)。看看这个:<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>

enter image description here

再说一次,但是!

如果你想让这些渐变效果移动并从中创建动画,该怎么办?

好吧,还有另一种解决方案。您绝对应该检查 animation: true 甚至 .hoverable() 方法,这将导致基于光标位置的渐变开始!(听起来很酷xD)

enter image description here

这就是我们在文本上创建渐变(线性或径向)的方式。如果您喜欢这个想法或想了解更多信息,您应该查看提供的链接。


也许这不是最好的选择,也许不是最好的性能方法,但它会开辟一些空间来创造令人兴奋和令人愉快的动画,以激励其他人寻求更好的解决方案。

它将允许您在文本上使用渐变样式,甚至 IE8 也支持这种样式!

在这里你可以找到一个有效的现场演示,原始存储库也在GitHub上,开源并准备获得一些更新(:D)

这是我第一次(是的,5 年后,你没听错)在 Internet 上的任何地方提到这个存储库,我对此感到兴奋!


[更新 - 2019 年 8 月:]Github 删除了该存储库的 github-pages 演示,因为我来自伊朗!这里只有源代码可用...

2赞 Jose Rui Santos 2/21/2021 #19

enter image description here

这是一个仅适用于整行文本的 CSS 解决方案,而不仅仅是一个字符元素。

div {
    position: relative;
    top: 2em;
    height: 2em;
    text-transform: full-width;
}

div:before,
div:after {
    content: attr(data-content);
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

div:after {
    color: red;
    /* mask for a single character. By repeating this mask, all the string becomes masked */
    -webkit-mask-image: linear-gradient(to right, transparent 0, transparent .5em, white .5em, white 1em);
    -webkit-mask-repeat: repeat-x;  /* repeat the mask towards the right */
    -webkit-mask-size: 1em;         /* relative width of a single character */ 
    
    /* non-vendor mask settings */
    mask-image: linear-gradient(to right, transparent 0, transparent .5em, white .5em, white 1em);
    mask-repeat: repeat-x;
    mask-size: 1em;
}


/* demo purposes */
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;
}
Font-size:
  <input type="radio" name="fontSize" value="1em">
  <input type="radio" name="fontSize" value="2em" checked>
  <input type="radio" name="fontSize" value="3em">

  <div data-content="A CSS only solution..."></div>
  <div data-content="Try it on Firefox!"></div>

这个想法是为每个字符应用一个水平CSS蒙版,隐藏它的前半部分[0 - 0.5em]并显示后半部分[0.5em - 1em]。

掩码的宽度与字符串中第一个字符的宽度相匹配。 通过使用 ,将相同的蒙版应用于第二个、第三个字符,依此类推。mask-size: 1emmask-repeat: repeat-x

我以为使用字体可以解决使用相同宽度字母的问题,但我错了。 相反,我通过使用 text-transform: full-width 解决了它,不幸的是,我相信只有 Firefox 支持它。monospace

使用相对单位允许设计根据 .emfont-size

适用于所有浏览器的 Vanilla JavaScript 解决方案

如果Firefox不是一个选项,那么请使用此脚本进行救援。

它的工作原理是为每个字符插入一个子项。在每个 span 中,从 [0% - 50%] 和 [50% - 100%] 字母的宽度(即 span 元素的宽度)放置一个非重复的 CSS 掩码。span

这样,我们就不再有使用相同宽度字符的限制。

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 {
    position: relative;
    top: 2em;
    height: 2em;
    font-size: 2em;
}

#data span {
    display: inline-block;
    position: relative;
    color: transparent;
}

#data span:before,
#data span:after {
    content: attr(data-ch);
    display: inline-block;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    text-align: center;
    color: initial;
}

#data span:after {
    color: red;
    -webkit-mask-image: linear-gradient(to right, transparent 0, transparent 50%, white 50%, white 100%);
    mask-image: linear-gradient(to right, transparent 0, transparent 50%, white 50%, white 100%);
}
Font-size:
<input type="range" min=1 max=4 step=0.05 value=2 oninput="zoom(this.value)" onchange="zoom(this.value)">

<div id="data">A Fallback Solution...For all browsers</div>

3赞 the Hutt 1/19/2022 #20

所有解决方案的工作原理都是拆分字母并将它们包裹在 .在两种情况下,我们不必拆分字母:<span>

  • 如果字体是等宽的。
  • 如果使用垂直布局。

div {
  font-size: 80px;
  font-weight: bolder;
  color: transparent;
  padding: 0;
  margin: 0;
  background: linear-gradient(90deg, rgb(34, 67, 143) 0% 50%, #409FBF 50%);
  background-clip: text;
  -webkit-background-clip: text;
}

.one {
  font-family: 'Nova Mono';
  background-repeat: repeat-x;
  background-size: 45px;
}

.two {
  font-family: 'Gideon Roman';
  writing-mode: vertical-lr;
  text-orientation: upright;
  letter-spacing: -35px;
  height: 500px;
}
<!-- get the fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nova+Mono&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Gideon+Roman&display=swap" rel="stylesheet">


<div id='one' class="one">X-RAY Winter</div>
<div class="two">Minty</div>

预期输出,以防字体不可用:

enter image description here

我知道背景剪辑和渐变的使用已经在其他答案中得到了演示,只是把你不必拆分字母的情况放在一起。