CSS text-transform充分利用所有上限

Kha*_*han 124 css

这是我的HTML:

<a href="#" class="link">small caps</a> & 
<a href="#" class="link">ALL CAPS</a>
Run Code Online (Sandbox Code Playgroud)

这是我的CSS:

.link {text-transform: capitalize;}
Run Code Online (Sandbox Code Playgroud)

输出是:

Small Caps & ALL CAPS
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

Small Caps & All Caps
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Phi*_*sby 174

几乎可以这样做:

.link { text-transform: lowercase; }
.link:first-letter { text-transform: uppercase; }
Run Code Online (Sandbox Code Playgroud)

它会给你输出:

Small caps
All caps
Run Code Online (Sandbox Code Playgroud)

  • 但它不会产生预期的结果.它只会将元素的第一个字母大写,而问题则要求将每个单词的首字母大写.它产生'全部大写',但要求是'全部大写' (9认同)
  • 这似乎需要 .link 元素显示为块元素。(显示:内联块;)http://jsfiddle.net/7y7wqqhb/1/ (8认同)
  • 它就像一个魅力,谢谢!,顺序很重要,行有:第一个字母必须在小写行之后. (7认同)
  • @manpreetsingh 正确,这就是为什么我说它*几乎*有效。这可能不是问题所问的确切问题,但通常您的规范是灵活的,更简单的解决方案是可取的。 (2认同)

Har*_*men 57

使用CSS无法做到这一点,您可以使用PHP或Javascript.

PHP示例:

$text = "ALL CAPS";
$text = ucwords(strtolower($text)); // All Caps
Run Code Online (Sandbox Code Playgroud)

jQuery示例(现在是插件!):

// Uppercase every first letter of a word
jQuery.fn.ucwords = function() {
  return this.each(function(){
    var val = $(this).text(), newVal = '';
    val = val.split(' ');

    for(var c=0; c < val.length; c++) {
      newVal += val[c].substring(0,1).toUpperCase() + val[c].substring(1,val[c].length) + (c+1==val.length ? '' : ' ');
    }
    $(this).text(newVal);
  });
}

$('a.link').ucwords();?
Run Code Online (Sandbox Code Playgroud)

  • 我最终在整个字符串上做了一个.toLowerCase(),然后用CSS来大写.感谢您的建议! (16认同)
  • 如果您要在服务器端执行此操作,则可以将整个字符串小写,然后让CSS执行大写操作.只是一个想法. (3认同)
  • 也许用正则表达式而不是这个循环+子串更好 - 但是如何在Javascript的正则表达式中大写字母? (2认同)

ron*_*yfm 31

使用JavaScript转换使用.toLowerCase(),并capitalize会做休息.


Pek*_*ica 25

有趣的问题!

capitalize将单词的每个首字母转换为大写,但不会将其他字母转换为小写.甚至:first-letter伪类都不会削减它(因为它适用于每个元素的第一个字母,而不是每个单词),我看不到将小写和大写结合起来以获得所需结果的方法.

所以据我所知,这对CSS来说确实是不可能的.

@Harmen在他的回答中展示了漂亮的PHP和jQuery解决方法.


JDu*_*eDJ 12

我想推荐一个纯 CSS解决方案,它比提供的第一个字母解决方案更有用,但也非常相似。

.link {
  text-transform: lowercase;
display: inline-block;
}

.link::first-line {
  text-transform: capitalize;
}
Run Code Online (Sandbox Code Playgroud)
<div class="link">HELLO WORLD!</div>
<p class="link">HELLO WORLD!</p>
<a href="#" class="link">HELLO WORLD!  ( now working! )</a>
Run Code Online (Sandbox Code Playgroud)

尽管这仅限于第一行,但对于比首字母解决方案更多的用例,它可能更有用,因为它将大写应用于整行,而不仅仅是第一个单词。(第一行中的所有单词)在 OP 的特定情况下,这可以解决它。

注意:正如第一个字母解决方案评论中提到的,CSS 规则的顺序很重要!另外请注意,我改变了<a>一个标记<div>标签,因为某些原因,伪元素::first-line不起作用与<a>标签本身,但无论是<div><p>有细。 编辑:如果将<a>元素添加到类中,则该元素将起作用。感谢Dave Land发现这一点!display: inline-block;.link

新注意:如果文本换行,它将丢失大写,因为它现在实际上位于第二行(第一行仍然可以)。


pro*_*son 5

captialize只影响单词的第一个字母。http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


rya*_*ttb 5

JavaScript:

var links = document.getElementsByClassName("link");
for (var i = 0; i < links.length; i++) {
  links[i].innerHTML = links[i].innerHTML.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

CSS:

.link { text-transform: capitalize; }
Run Code Online (Sandbox Code Playgroud)

Khan的“结束工作”(这是更干净的工作,对我有用)在标记为答案的帖子评论中被删除。