改变最后的字母颜色

28 html css html5 css3

示例代码:

<p class="test">string</p>
Run Code Online (Sandbox Code Playgroud)

我想改变最后一个字母的颜色,在这种情况下是"g",但我需要用css解决方案,我不需要一个javascript解决方案.

我逐个字母地显示字符串,我不能使用静态解决方案.

Spu*_*ley 155

每个人都说无法做到.我在这里证明不然.

是的,可以做到.

好的,所以这是一个可怕的黑客,但它可以做到.

我们需要使用两个CSS功能:

  • 首先,CSS提供了改变文本流的方向的能力.这通常用于阿拉伯语或希伯来语等脚本,但它实际上适用于任何文本.如果我们将它用于英文文本,则字母的显示顺序与标记中的显示方式相反.因此,要使文本在反转元素上显示为单词"String",我们必须具有读取"gnirtS"的标记.

  • 其次,CSS有::first-letter伪元素选择器,它选择文本中的第一个字母.(其他答案已经确定,这是可用的,但没有等效的::last-letter选择器)

现在,如果我们将::first-letter反向文本组合起来,我们可以选择"gnirtS"的第一个字母,但看起来我们正在选择"字符串"的最后一个字母.

所以我们的CSS看起来像这样:

div {
    unicode-bidi:bidi-override;
    direction:rtl;
}

div::first-letter {
    color: blue;
}
Run Code Online (Sandbox Code Playgroud)

和HTML:

<div>gnirtS</div>
Run Code Online (Sandbox Code Playgroud)

是的,这确实有效 - 你可以在这里看到工作小提琴:http://jsfiddle.net/gFcA9/

但正如我所说,它有点hacky.谁愿意花时间把所有东西都倒退?这不是一个实际的解决方案,但它确实回答了这个问题.

  • 对于纯粹血腥的hackiness肯定+1.我的答案! (43认同)
  • +1这个黑客是如此可怕,我喜欢它 (20认同)
  • 为美丽的div文本+1(让我笑!) (3认同)
  • 这太性感了.我将开始使用它只是为了使用它. (3认同)
  • 不过,我不明白 `unicode-bidi:bidi-override;` 语句在做什么。你能解释一下这个或发布一个链接来描述这是做什么以及你为什么在这里使用它吗? (3认同)
  • @WebWanderer:它处理反转文本的呈现方式。我写这篇文章已经很长时间了,我真的不记得细节了,所以我的建议是按照我的方式来解决;即阅读 [Mozilla 的文档](https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi),并通过在没有属性和其他值的情况下尝试使用 jsfiddle 示例来试验. 它是最好的学习方式。您可能还会发现它是一种具有跨浏览器含义的东西;这总是需要注意的事情,尤其是在做一些有点hacky的事情时。 (3认同)
  • 最酷的CSS黑客我很可能见过. (2认同)

Sup*_*arp 36

使用::after伪元素结合attr()函数:

p::after {
    content: attr(data-end) ;
    color: red ;
}
<p data-end="g">Strin</p>
Run Code Online (Sandbox Code Playgroud)

p::after {
  content: attr(data-end) ;
  color: red ;
}
Run Code Online (Sandbox Code Playgroud)
<p data-end="g">Strin</p>
Run Code Online (Sandbox Code Playgroud)


Mar*_*Alx 17

另一种解决方案是使用 ::after

.test::after{
 content:"g"
 color:yellow;
}
<p class="test">strin</p>
Run Code Online (Sandbox Code Playgroud)

此解决方案允许更改所有字符的颜色,而不仅仅是像Spudley使用的答案字母::first-letter.有关详细信息,请参阅::first-letter 规范 ::first-letter仅适用于忽略标点符号的字母.

此外,如果你想要比最后一个角色更多颜色:

.test::after{
  content:"ing"
  color:yellow;
}
<p class="test">str</p>
Run Code Online (Sandbox Code Playgroud)

有关::查看此链接后的更多信息.

  • 我投了赞成票,因为,好吧,我是一个 css 爱好者,我认为这实际上是一个优雅而聪明的解决方案,可以使最后一个字母与其他字母不同。我只是希望能够真正“复制”这封信,但由于 `:after` 元素不可选择,我们无能为力。 (2认同)
  • +1 在这里提醒我,我可以解决我的不支持内联标记的 Laravel 引擎解析我需要的字段星号。谢谢@Praveen Kumar (2认同)

Dav*_*ger 12

不使用javascript,您唯一的选择是:

<p class="test">strin<span class="other-color">g</span></p>
Run Code Online (Sandbox Code Playgroud)

编辑您的小提琴链接:

我不确定你为什么说你不需要一个javascript解决方案,因为你已经有很多它了.无论如何,在此示例中,您只需进行一些小的更改.改变第10行

elem.text(elem.text() + contentArray[current++]);
Run Code Online (Sandbox Code Playgroud)

if ( current == contentArray.length-1 ) {
    elem.html(elem.html() + "<span style='color:red'>"+contentArray[current++]+"</span>");
} else {
    elem.html(elem.html() + contentArray[current++]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用.html()而不是.text()现在很重要,因为实际上插入了HTML标记.

工作小提琴:http://jsfiddle.net/QTUsb/2/

  • 即使使用 JavaScript,这也是唯一的选择,因为 JavaScript 会在 DOM 树中创建与此标记等效的内容。 (2认同)

Jas*_*ski 6

只使用CSS和::after伪元素就可以实现它而不需要对HTML进行任何更改:

.test {
  font-size: 16pt;
  position: relative;
}
.test::after {
  bottom: 0;
  color: red;
  content: 'g';
  position: absolute;
  transform: translate(-100%, 0);
}
Run Code Online (Sandbox Code Playgroud)
<p class="test">string</p>
Run Code Online (Sandbox Code Playgroud)