CSS以选择/样式第一个单词


76

这让我有些难过。我想在#content div中将所有段落的第一个单词设为14pt,而不是默认的段落(12pt)。有没有办法在纯CSS中做到这一点,还是我将第一个单词包裹在一个跨距中来完成此操作?


Answers:


83

您正在寻找的是不存在的伪元素。有:first-letter和:first-line,但是没有:first-word。

您当然可以使用JavaScript进行此操作。这是我发现执行此操作的一些代码:http : //www.dynamicsitesolutions.com/javascript/first-word-selector/


72
可能是因为“单词”不是布局语言中定义明确的概念。“半熟”是一两个词吗?那“麦当劳”和“奥谢”呢?“ 5 + 3 = 8”或“ 5 + 3 = 8”的第一个单词是什么?
罗比·斯劳特

52
出于布局目的,将单词的定义定义为:“一组在空白字符之前和之后的非空白字符”是一个很好的且高度可用的单词。对于处理,您可能需要“周到”,但是对于布局,这是一个完美的解决方案。
Henrik Erlandsson

13
汉字单词之间没有空格。实际上,汉字没有单词和字母的概念。
deerchao 2012年

56
@RobbySlaughter CSS一直在定义“单词”(至少对于拉丁字母字符)的概念,直到text-transform: capitalize周围:jsfiddle.net/mlms13/DRJ76
Michael Martin-Smucker

16
在浏览器中很好地定义了“单词”。:first-word的实现将简单地利用换行符中使用的相同逻辑。
拉克兰·阿瑟

33

我必须不同意Dale ...强元素实际上是错误使用的元素,意味着您只是想为元素提供样式时,就暗示了内容的含义,用途或重点。

理想情况下,您将能够使用伪类和样式表来完成此操作,但是由于那不可能,您应该使标记在语义上正确并使用<span class="first-word">


4
被接受为正确的javascript答案可能会更有用,但我认为这在语义上是最正确的。
雷诺兹2009年

12
FWIW,该<b>元素可能是适当的。在HTML5规范说: B元素代表文本的跨度关注所正在绘制的功利目的,而无需传送任何额外的重要性,并没有暗示替代的语音或心情的,如在文档抽象的关键词,在产品名称评论,互动文字驱动软件中的可行字词或文章目录(重点是我的)第一个单词不是文章目录,但其功能相同。
mattsoave 2014年

非常好,@ mattsoave。我还没有看到<b>html5中的重新定义,所以这很有趣。下次,我将把它放在技巧包中,而我需要一个没有真正语义含义的样式化元素。
Prestaul 2014年

1
@mattsoave-我知道已经过了5年了,但是我注意到stackoverflow如何使用ab元素来强调:-)
Herbert Van-Vliet

23

jQuery也是如此:

$('#links a').each(function(){
    var me = $(this);
    me.html( me.text().replace(/(^\w+)/,'<strong>$1</strong>') );
  });

要么

$('#links a').each(function(){
    var me = $(this)
       , t = me.text().split(' ');
    me.html( '<strong>'+t.shift()+'</strong> '+t.join(' ') );
  });

(通过jQuery邮件列表上的“ Wizzud” )


1
似乎对我来说是最好的解决方案。顺便说一句:这将不起作用,即。斯洛伐克语字符,例如“Zimnázáhrada”。因此,我改用了此正则表达式:“([[^ \ s] +)”
首演

9

遗憾的是,即使使用CSS 3,我们仍然没有:first-word :last-word使用纯CSS的etc。幸运的是,如今几乎所有内容都包含JavaScript,这使我成为我的推荐。使用nthEverythingjQuery,您可以从传统的Pseudo元素进行扩展。

当前有效的伪指令为:

  • :first-child
  • :first-of-type
  • :only-child
  • :last-child
  • :last-of-type
  • :only-of-type
  • :nth-child
  • :nth-of-type
  • :nth-last-child
  • :nth-last-of-type

使用nth Everything,我们可以将其扩展为:

  • ::first-letter
  • ::first-line
  • ::first-word
  • ::last-letter
  • ::last-line
  • ::last-word
  • ::nth-letter
  • ::nth-line
  • ::nth-word
  • ::nth-last-letter
  • ::nth-last-line
  • ::nth-last-word

8

纯CSS解决方案:

使用:first-line伪类。

display:block;
Width:40-100px; /* just enough for one word, depends on font size */
Overflow:visible; /* so longer words don't get clipped.*/
float:left; /* so it will flow with the paragraph. */
position:relative; /* for typeset adjustments. */

没有测试。可以肯定的是,它将对您正常工作。我以前已经将块规则应用于伪类。您可能会对每个第一个单词都保持固定的宽度,所以text-align:center; 并给它一个很好的背景或处理负空间的方法。

希望对您有用。:)

-Motekye


1
1)这是一个伪元素2)这是第一
BoltClock

14
想法是使第一行的宽度足以仅容纳一个单词,将其浮动以使其与其余文本一起运行,然后应用样式。真是的
Motekye Guakein 2011年

2
一个非常有创意的想法,但发布前应进行测试。它不起作用-也不起作用,因为display::first-linedeveloper.mozilla.org/de/docs/Web/CSS/::first-line)中被忽略了。
wortwart 2015年

4
足够宽的“仅需一个字”?这很荒谬,因为一个单词可以是1个字母或15个字母。
jbyrd

6

您必须将单词包装在一个跨度中才能完成此操作。


2

使用元素,这是目的:

<div id="content">
    <p><strong>First Word</strong> rest of paragraph.</p>
</div>

然后在样式表中为其创建样式。

#content p strong
{
    font-size: 14pt;
}

26
具有讽刺意味的是,您的“第一个单词”实际上是2个单词!;)
Bobby Jack

2
是的,我在写答案时也有同样的想法。
戴尔·拉根

19
在这种情况下,除strong以外在语义上是错误的。看来尺寸只是样式问题,而强烈表示要强调受影响的部分。
Akoi Meexx 2010年

4
普鲁兹(Pluz),如果您想在内容中的其他任何地方使用强大功能,它将变得更大。最好对那个坏男孩进行分类,并更直接地瞄准目标。
Adrian Lynch 2010年

4
基于规范,我认为<b>更合适。
mattsoave 2014年

2

我将一些JavaScript和jQuery放在一起,用<span>标记将每个段落的第一个单词包装起来。

$(function() {
    $('#content p').each(function() {
        var text = this.innerHTML;
        var firstSpaceIndex = text.indexOf(" ");
        if (firstSpaceIndex > 0) {
            var substrBefore = text.substring(0,firstSpaceIndex);
            var substrAfter = text.substring(firstSpaceIndex, text.length)
            var newText = '<span class="firstWord">' + substrBefore + '</span>' + substrAfter;
            this.innerHTML = newText;
        } else {
            this.innerHTML = '<span class="firstWord">' + text + '</span>';
        }
    });
});

然后,您可以使用CSS为创建样式.firstWord

它不是完美的,因为它不能解释每种类型的空格。但是,我敢肯定,通过一些调整,它就能完成您想要的工作。

请记住,此代码仅在页面加载后执行,因此可能要花一秒钟的时间才能看到效果。


1

没有简单的CSS方法。您可能必须使用JavaScript + Regex才能弹出一个范围。

理想情况下,第一个单词会有一个伪元素,但是您不走运,因为这似乎不起作用。我们确实有:first-letter和:first-line。

您可能可以使用:after或:before的组合来使用它,而无需使用跨度。


0

在段落文本中插入跨度标签。例如 <p><span>Hello</span>My Name Is Dot</p ,然后设置第一个字母的样式。


OP正在要求选择器。他质疑说:“有没有办法在做这个CSS” [重点煤矿]
VorganHaze

0

使用HTML + CSS的简单方法:

TEXT A <b>text b</b>

<h1>text b</h1>

<style>
    h1 { /* the css style */}
    h1:before {content:"text A (p.e.first word) with different style";    
    display:"inline";/* the different css style */}
</style>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.