CSSテキスト変換はすべて大文字で大文字にします


129

これが私のHTMLです:

<a href="#" class="link">small caps</a> & 
<a href="#" class="link">ALL CAPS</a>

ここに私のCSSがあります:

.link {text-transform: capitalize;}

出力は次のとおりです。

Small Caps & ALL CAPS

そして私は出力が:

Small Caps & All Caps

何か案は?


1
@Marcel-必要はありません。その後にスペースが続くため、完全に有効なリテラルアンパサンドです(ドキュメントがXHTMLである場合を除き、提案はありません)
Quentin

1
@David –ああ、私もこれが有効な表記であることを知りませんでした。ありがとう、いつも新しいことを学びます。
Marcel Korpel、2010

回答:


57

CSSでこれを行う方法はありません。これにはPHPまたはJavaScriptを使用できます。

PHPの例:

$text = "ALL CAPS";
$text = ucwords(strtolower($text)); // All Caps

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();​

うん、おそらくこれを行う唯一の方法です。
ペッカ

2
たぶん、このループ+部分文字列の代わりに正規表現を使用するほうがよいでしょう-しかし、Javascriptの正規表現で文字を大文字にするにはどうすればよいですか?
Harmen

3
サーバー側で実行する場合は、文字列全体を小文字にしてから、CSSに大文字を使用させることができます。ちょっとした考え。
スティーブンP

16
文字列全体で.toLowerCase()を実行してから、CSSを使用して大文字にしました。アドバイスありがとうございます!
カーン

1
@GlennFerrieあなたがそれを私たちと共有することを気にしないなら、あなたが話しているCSSだけのソリューションは何ですか?:-)
水っぽく

183

あなたはそれでほとんどそれを行うことができます:

.link { text-transform: lowercase; }
.link:first-letter { text-transform: uppercase; }

それはあなたに出力を与えます:

Small caps
All caps

7
それは魅力のように機能します、ありがとう!、順序は重要です、:first-lettersの行は小文字の行の後にある必要があります。
Steven Lizarazo 2013年

9
これには、.link要素をブロック要素として表示する必要があるようです。(display:inline-block;)jsfiddle.net/7y7wqqhb/1
Torin

1
賢い思考、よくできたPhilihp。そして、「display:inline-block」を指摘してくれたTorinはよくやった。
Chris Mendes

9
しかし、それは望ましい結果を生み出しません。質問が各単語の最初の文字を大文字にすることを求めている間のみ、要素の最初の文字を大文字にします。「すべて大文字」を生成しますが、必要なのは「すべて大文字」です
マンプリートシン

1
@manpreetsingh正解です。そのため、ほとんど機能します。それは質問が正確に尋ねたものではないかもしれませんが、多くの場合、仕様は柔軟であり、より単純なソリューションが望ましいです。
Philihp Busby

32

JavaScriptを使用して変換.toLowerCase()し、capitalize残りを行うだろう。


1
うん。モデルの項目を反復して、myArray [i] .firstName = myArray [i] firstName.toLowerCase()のようにそれらをLowerCaseに変換しました。次に、CSSで、text-transform:capitalize
pdschullerを使用して

OPはJSについて言及していません。
JDuarteDJ 2019

入力ありがとうございますが、質問はCSSへのアプローチのみを制限しませんでした。
ronnyfm

@JDuarteDJの反対票を削除できますか?繰り返しますが、私の答えは質問されたものに応じています。そして、答えとして選択されたものが表示されている場合は、jQueryでさえもJavaScriptを使用しています。ありがとう。
ronnyfm

26

興味深い質問です!

capitalize単語の最初のすべての文字を大文字に変換しますが、他の文字は小文字に変換しませ:first-letter(各単語ではなく各要素の最初の文字に適用されるため)疑似クラスでさえもカットされず、小文字と大文字を組み合わせて目的の結果を得る方法がわかりません。

だから私が見る限り、これはCSSで行うのは確かに不可能です。

@Harmenは、彼の回答で見栄えの良いPHPおよびjQueryの回避策を示しています。


1
奇妙なことに、「{text-transform:lowercase}」を追加するとうまくいくと思っていました。しかし、そうではありません。
Kwebble 2010

1
この答えは、なぜそれが起こっているのかを答えます。:)それは解決策よりも優れています。
Asim KT

非常に良い説明@Pekka CSS CSSからの予期しない動作。パイプラインに修正があることを期待しましょう。
アーロンマシューズ

1
@Pekka CSS CSSで純粋にこれを行うのに非常に近い答えを提供しました。1行に1回の制限がありますが、ほとんどの場合に適していると思います。
JDuarteDJ

9

提示された最初の文字のソリューションよりも有用であるが、非常に類似している純粋なCSSソリューションを提案したいと思います。

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

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

これは最初の行に限定されていますが、最初の単語だけでなく行全体に大文字が適用されるため、最初の文字のソリューションよりも多くのユースケースで役立つ場合があります。(最初の行のすべての単語)OPの特定のケースでは、これで解決できた可能性があります。

注:ソリューションの最初の文字のコメントで述べたように、CSSルールの順序は重要です!また、私が変更されたことをノート<a>のタグ<div>何らかの理由で擬似要素があるため、タグの::first-lineでは動作しません<a>タグをネイティブではなくどちらか<div>または<p>罰金です。 EDIT:<a>要素が動作する場合display: inline-block;に追加され.linkたクラス。それを発見してくれたDave Landに感謝します!

新注:場合、テキストは折り返され、第2行目に実際になりましたので、それが大文字と小文字を失うことになる(最初の行はまだ大丈夫です)。


1
きみの ( not working )例では、追加することによって、仕事にすることができるdisplay: inline-block;.linkスタイル。
Dave Land

Capsのすべての文字が最初にあった場合のcssによる適切な解決策
Hassan Ali Shahzad

5

JavaScript:

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

CSS:

.link { text-transform: capitalize; }

Khanが "最終的にやっている"(これはよりクリーンで私にとっては効果的でした)ことは、回答としてマークされた投稿のコメントに含まれています。


4

captialize単語の最初の文字のみに影響します。http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
OPが問題を抱えている理由を説明しているにもかかわらず、この回答は建設的ではありません。
JDuarteDJ

@JDuarteDJ私はソースの問題を知ることが重要だと思います。captializeは文字列を正規化せず、最初の項目を取得し、それを大文字に変換します。私はこの情報が本当に役に立つと感じました
Rodrigo Borba

3

javaおよびjstlに役立つ場合があります。

  1. ローカライズされたメッセージで変数を初期化します。
  2. その後、それをjstl toLowerCase関数で使用できます。
  3. CSSで変換します。

JSP内

1。

<fmt:message key="some.key" var="item"/>

2。

<div class="content">
  <a href="#">${fn:toLowerCase(item)}</a>
</div>

CSSで

3。

.content {
  text-transform:capitalize;
}

私の場合${fn:toLowerCase(some.key)}、を使用せずに直接行うことができましたfmt:message。ありがとう。
RaphaelDDL 2013

3

あなたはCSSの最初の文字でそれを行うことができます!例えば、私はそれをメニューに欲しかった:

a {display:inline-block; text-transorm:uppercase;}
a::first-letter {font-size:50px;}

それはブロック要素でのみ実行されます-したがってインラインブロック!


これはOPが要求したものではなく、スモールキャップではありません。
JDuarteDJ

2

私の場合のように、データがデータベースからのものである場合、選択リスト/ドロップダウンリストに送信する前にデータを下げることができます。CSSではそれができないのは残念です。


1

多くのことを調査した後、jquery関数/式が最初の文字のテキストを大文字のみに変更するのを見つけたので、それに応じてそのコードを変更して、入力フィールドで機能するようにします。入力フィールドに何かを書き込んでから別のフィールドまたは要素に移動すると、そのフィールドのテキストは最初の文字の大文字のみで変更されます。ユーザーが完全に小文字または大文字でテキストを入力しても、次のようになります。

このコードに従ってください:

ステップ-1:HTMLヘッドでjqueryライブラリを呼び出す:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

ステップ-2:入力フィールドのテキストを変更するコードを記述します。

<script>
$(document).ready(function(){
$("#edit-submitted-first-name,#edit-submitted-last-name,#edit-submitted-company-name, #edit-submitted-city").focusout(function(){
var str=$(this).val();
str = str.toLowerCase().replace(/\b[a-z]/g, function(letter) {
    return letter.toUpperCase();
});
$(this).val(str);
 });});

 </script>

ステップ-3:次のようなjqueryコードで使用するのと同じIDを持つHTML入力フィールドを作成します。

<input type="text" id="edit-submitted-first-name" name="field name">

この入力フィールドのIDは次のとおりです:edit-submitted-first-name(ステップ2のjqueryコードで使用)

**結果:別の要素でその入力フィールドからフォーカスを移動した後、テキストが変更されることを確認してください。ここではjqueryのfocus outイベントを使用しているためです。結果は次のようになります。ユーザータイプ:「ありがとう」「ありがとう」で変わります。**

幸運を祈ります



-1

私はこれが遅い応答であることを知っていますが、さまざまなソリューションのパフォーマンスを比較したい場合は、私が作成したjsPerfを持っています。

正規表現ソリューションは確かに最速です。

ここにjsPerfがあります:https://jsperf.com/capitalize-jwaz

2つの正規表現ソリューションがあります。

最初のものはを使用し/\b[a-z]/gます。単語の境界は、非開示から非開示などの単語の大文字になります。

スペースが先行する文字だけを大文字にしたい場合は、2番目の正規表現を使用します

/(^[a-z]|\s[a-z])/g

-1

jQueryを使用している場合。これはそれを行う1つの方法です。

$('.link').each(function() {
    $(this).css('text-transform','capitalize').text($(this).text().toLowerCase());
});

これは、同じことを行う読みやすいバージョンです。

//Iterate all the elements in jQuery object
$('.link').each(function() {

    //get text from element and make it lower-case
    var string = $(this).text().toLowerCase();

    //set element text to the new string that is lower-case
    $(this).text(string);

    //set the css to capitalize
    $(this).css('text-transform','capitalize');
});

デモ


OPがjQueryを使用しているとは思いません。
JDuarteDJ 2019

-6

すべてが間違っている-> font-variant:small-caps;

テキスト変換:大文字化; 最初の文字のキャップだけ


それは、OPが望んでいたこととはまったく異なります。彼は、出力では単語の最初の文字だけが大文字になると期待しています。文字列全体ではありません。
Andrew Barber

あなたが認識text-transform: capitalize;していない質問にはニュアンスがあります:すでにすべて大文字であるテキストを変更しません。もう一度質問を参照してください:ユーザーは既にそれを試しました。
Andrew Barber

次に、spanタグを使用して、すべての大文字と小文字を使用する単語を分割できます。
オーランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.