CSS-Texttransformation nutzt alle Großbuchstaben

129

Hier ist mein HTML:

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

Hier ist mein CSS:

.link {text-transform: capitalize;}

Die Ausgabe ist:

Small Caps & ALL CAPS

und ich möchte, dass die Ausgabe ist:

Small Caps & All Caps

Irgendwelche Ideen?

Khan
quelle
1
@Marcel - es muss nicht sein, es wird von einem Leerzeichen gefolgt, es ist also ein vollkommen gültiges kaufmännisches kaufmännisches Und (es sei denn, das Dokument ist XHTML, aber es gibt keinen Hinweis darauf)
Quentin
1
@ David - Oh, ich wusste nicht, dass dies auch eine gültige Notation ist. Danke, es gibt immer etwas Neues zu lernen.
Marcel Korpel

Antworten:

57

Mit CSS ist dies nicht möglich. Sie können hierfür PHP oder Javascript verwenden.

PHP Beispiel:

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

jQuery-Beispiel (es ist jetzt ein Plugin!):

// 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();​
Harmen
quelle
Ja, wahrscheinlich der einzige Weg, dies zu tun.
Pekka
2
Vielleicht ist es besser mit regulären Ausdrücken anstelle dieser Schleife + Teilzeichenfolgen - Aber wie können Sie einen Buchstaben in den regulären Ausdrücken von Javascript in Großbuchstaben schreiben?
Harmen
3
Wenn Sie es serverseitig ausführen möchten, können Sie die gesamte Zeichenfolge in Kleinbuchstaben schreiben und dann CSS die Großschreibung vornehmen lassen. Nur ein Gedanke.
Stephen P
16
Am Ende habe ich eine .toLowerCase () für die gesamte Zeichenfolge erstellt und dann CSS zum Großschreiben verwendet. Danke für den Hinweis!
Khan
1
@GlennFerrie Was ist die einzige CSS-Lösung, von der Sie sprechen, wenn es Ihnen nichts ausmacht, sie mit uns zu teilen? :-)
wässrig
183

Sie können es fast tun mit:

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

Es gibt Ihnen die Ausgabe:

Small caps
All caps
Philihp Busby
quelle
7
es funktioniert wie ein Zauber, danke!, die Reihenfolge ist wichtig, die Zeile mit: Anfangsbuchstaben müssen nach der Kleinbuchstaben stehen.
Steven Lizarazo
9
Dies scheint zu erfordern, dass .link-Elemente als Blockelemente angezeigt werden. (Anzeige: Inline-Block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann
1
Kluges Denken, gut gemacht, Philihp. Und gut gemacht, Torin, der auf "display: inline-block" hingewiesen hat.
Chris Mendes
9
Das gewünschte Ergebnis wird jedoch nicht erzielt. Der erste Buchstabe des Elements wird nur groß geschrieben, während die Frage den ersten Buchstaben jedes Wortes großschreibt. Es produziert 'All Caps', aber erforderlich ist 'All Caps'
manpreet singh
1
@manpreetsingh richtig, deshalb habe ich gesagt, es funktioniert fast . Es ist vielleicht nicht genau das, was die Frage gestellt hat, aber oft ist Ihre Spezifikation flexibel und eine einfachere Lösung ist vorzuziehen.
Philihp Busby
32

Konvertieren Sie mit JavaScript mit .toLowerCase()und capitalizeerledigen Sie den Rest.

ronnyfm
quelle
1
Ja. Ich iterativ die Elemente in dem Modell und konvertierte sie toLowerCase, wie arr [i] .firstName = arr [i] firstName.toLowerCase () dann in der CSS, text-transform : Kapital
pdschuller
OP erwähnt JS nicht.
JDuarteDJ
Vielen Dank für die Eingabe, aber die Frage hat nicht nur den Ansatz für CSS eingeschränkt.
Ronnyfm
Können Sie bitte @JDuarteDJ die Abwahl entfernen? Auch hier ist meine Antwort dementsprechend auf das, was in Frage gestellt wurde. Und wenn Sie sehen, was als Antwort ausgewählt wurde, wird auch JavaScript verwendet, sogar jQuery. Vielen Dank.
Ronnyfm
26

Interessante Frage!

capitalizewandelt jeden ersten Buchstaben eines Wortes in Großbuchstaben um, die anderen Buchstaben jedoch nicht in Kleinbuchstaben. Nicht einmal die :first-letterPseudoklasse wird es schneiden (weil es für den ersten Buchstaben jedes Elements gilt, nicht für jedes Wort), und ich sehe keine Möglichkeit, Kleinbuchstaben und Großbuchstaben zu kombinieren, um das gewünschte Ergebnis zu erzielen.

Soweit ich sehen kann, ist dies mit CSS in der Tat unmöglich.

@Harmen zeigt in seiner Antwort gut aussehende PHP- und jQuery-Problemumgehungen.

Pekka
quelle
1
Seltsamerweise hatte ich erwartet, dass das Hinzufügen von 'a {text-transform: smallcase}' funktionieren würde. Aber das tut es nicht.
Kwebble
1
Diese Antwort antwortet, warum es passiert. :) Das ist besser als Lösungen.
Asim KT
Sehr gute Erklärung @Pekka - ein unerwartetes Verhalten von CSS. Hoffen wir, dass eine Korrektur geplant ist.
Aaron Matthews
1
@ Pekka 웃 Ich habe eine Antwort gegeben, die sehr nahe daran liegt, dies nur in CSS zu tun. Es gibt eine Beschränkung pro Zeile, aber ich denke, dass dies für die meisten Fälle geeignet ist.
JDuarteDJ
9

Ich möchte eine reine CSS- Lösung vorschlagen , die nützlicher ist als die vorgestellte Lösung für den ersten Buchstaben , aber auch sehr ähnlich ist.

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

Obwohl dies auf die erste Zeile beschränkt ist, kann es für mehr Anwendungsfälle als die Erstbuchstabenlösung nützlich sein, da die Großschreibung auf die gesamte Zeile und nicht nur auf das erste Wort angewendet wird. (alle Wörter in der ersten Zeile) Im speziellen Fall des OP hätte dies das Problem lösen können.

Anmerkungen: Wie in den Lösungskommentaren des ersten Buchstabens erwähnt , ist die Reihenfolge der CSS-Regeln wichtig! Beachten Sie auch, dass ich das <a>Tag für ein <div>Tag geändert habe, da das Pseudoelement aus irgendeinem Grund ::first-linenicht nativ mit <a>Tags funktioniert, aber entweder oder in Ordnung ist. BEARBEITEN: Das Element funktioniert, wenn es der Klasse hinzugefügt wird . Vielen Dank an Dave Land , der das entdeckt hat!<div><p><a>display: inline-block;.link

Neuer Hinweis: Wenn der Text umbrochen wird, verliert er die Groß- und Kleinschreibung, da er sich jetzt tatsächlich in der zweiten Zeile befindet (die erste Zeile ist noch in Ordnung).

JDuarteDJ
quelle
1
Ihr ( not working )Beispiel kann durch Hinzufügen display: inline-block;zum .linkStil zum Funktionieren gebracht werden.
Dave Land
Gute Lösung über CSS für den Fall, dass alle Buchstaben in Caps anfänglich
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; }

Was Khan "getan hat" (was sauberer ist und für mich funktioniert hat), steht in den Kommentaren des als Antwort gekennzeichneten Beitrags.

ryanttb
quelle
4

captializebewirkt nur den ersten Buchstaben des Wortes. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform

prodigitalson
quelle
1
Diese Antwort ist nicht konstruktiv, obwohl sie eine Erklärung dafür liefert, warum das OP das Problem hat.
JDuarteDJ
@JDuarteDJ Ich denke, es ist wichtig, das Quellproblem zu kennen, was der Fall ist. Captialize normalisiert keine Zeichenfolgen, sondern erhält nur das erste Element und wandelt es in Großbuchstaben um. Ich fand diese Informationen in der Tat nützlich
Rodrigo Borba
3

Kann für Java und JSTL nützlich sein.

  1. Variable mit lokalisierter Nachricht initialisieren.
  2. Danach ist es möglich, es in der Funktion jstl toLowerCase zu verwenden.
  3. Mit CSS transformieren.

In JSP

1.

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

2.

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

In CSS

3.

.content {
  text-transform:capitalize;
}
ekar
quelle
In meinem Fall könnte ich ${fn:toLowerCase(some.key)}direkt tun , ohne verwenden zu müssen fmt:message. Vielen Dank.
RaphaelDDL
3

Sie können es mit CSS-Anfangsbuchstaben tun! zB wollte ich es für das Menü:

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

Es läuft nur mit Blockelementen - daher der Inline-Block!

Johannes
quelle
Dies ist nicht das, wonach das OP gefragt hat, es sind keine Small Caps.
JDuarteDJ
2

Wenn die Daten wie in meinem Fall aus einer Datenbank stammen, können Sie sie senken, bevor Sie sie an eine Auswahlliste / Dropdown-Liste senden. Schade, dass Sie das in CSS nicht können.

JohnnyBizzle
quelle
1

Nachdem ich viel recherchiert hatte, fand ich jquery function / expression, um Text im ersten Buchstaben nur in Großbuchstaben zu ändern. Ich ändere diesen Code entsprechend, damit er für Eingabefelder verwendet werden kann. Wenn Sie etwas in das Eingabefeld schreiben und dann zu einem anderen Feld oder Element wechseln, ändert sich der Text dieses Felds nur mit Groß- und Kleinschreibung. Unabhängig davon, ob der Benutzer Text in vollständiger Groß- oder Kleinschreibung eingibt:

Folgen Sie diesem Code:

Schritt 1: Rufen Sie die jquery-Bibliothek im HTML-Kopf auf:

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

Schritt 2: Schreiben Sie Code, um den Text der Eingabefelder zu ändern:

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

Schritt 3: Erstellen Sie HTML-Eingabefelder mit denselben IDs, die Sie im JQuery-Code verwenden, wie:

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

Die ID dieses Eingabefelds lautet: edit-submit-first-name (Verwendung in jquery-Code in Schritt 2)

** Ergebnis: Stellen Sie sicher, dass sich der Text ändert, nachdem Sie Ihren Fokus von diesem Eingabefeld auf ein anderes Element verschoben haben. Weil wir hier Focus Out Event of JQuery verwenden. Das Ergebnis sollte folgendermaßen aussehen: Benutzertyp: "Danke", es ändert sich mit "Danke". ** **.

Viel Glück

A.Aleem11
quelle
0

Die PHP-Lösung im Backend:

$string = `UPPERCASE`
$lowercase = strtolower($string);
echo ucwords($lowercase);
Fellipe Sanches
quelle
-1

Ich weiß, dass dies eine späte Antwort ist, aber wenn Sie die Leistung verschiedener Lösungen vergleichen möchten, habe ich einen von mir erstellten jsPerf.

Regex-Lösungen sind mit Sicherheit die schnellsten.

Hier ist der jsPerf: https://jsperf.com/capitalize-jwaz

Es gibt 2 Regex-Lösungen.

Der erste verwendet /\b[a-z]/g. Die Wortgrenze setzt Wörter wie die Nichtoffenlegung in die Geheimhaltung ein.

Wenn Sie nur Buchstaben groß schreiben möchten, denen ein Leerzeichen vorangestellt ist, verwenden Sie den zweiten regulären Ausdruck

/(^[a-z]|\s[a-z])/g
Zerry Hogan
quelle
-1

wenn Sie jQuery verwenden; Dies ist eine Möglichkeit, dies zu tun:

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

Hier ist eine leichter zu lesende Version, die dasselbe tut:

//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');
});

Demo

Fooaldrin
quelle
Ich glaube nicht, dass OP jQuery verwendet.
JDuarteDJ
-6

alles falsch es existiert -> Schriftvariante: Kapitälchen;

Texttransformation: groß schreiben; nur die erste Buchstabenkappe

Orlando
quelle
Das wollte das OP überhaupt nicht. Er erwartet, dass in der Ausgabe nur die ersten Buchstaben der Wörter groß geschrieben werden. nicht die ganze Saite.
Andrew Barber
Die Frage, die Sie nicht wahrnehmen, text-transform: capitalize;enthält eine Nuance: Ändert keinen Text, der bereits aus Großbuchstaben besteht. Siehe die Frage noch einmal: Der Benutzer hat das bereits versucht.
Andrew Barber
Dann können Sie mit dem span-Tag aufteilen, welche Wörter alle Groß- und Kleinbuchstaben enthalten sollen.
Orlando