La trasformazione del testo CSS utilizza le maiuscole


129

Ecco il mio HTML:

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

Ecco il mio CSS:

.link {text-transform: capitalize;}

L'output è:

Small Caps & ALL CAPS

e voglio che l'output sia:

Small Caps & All Caps

Qualche idea?


1
@Marcel - non è necessario, è seguito da uno spazio, quindi è una e commerciale letterale perfettamente valida (a meno che il documento non sia XHTML, ma non c'è alcun suggerimento che sia)
Quentin

1
@ David - Oh, non sapevo che anche questa fosse una notazione valida. Grazie, c'è sempre qualcosa di nuovo da imparare.
Marcel Korpel,

Risposte:


57

Non c'è modo di farlo con CSS, per questo potresti usare PHP o Javascript.

Esempio di PHP:

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

Esempio di jQuery (adesso è un 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();​

Sì, probabilmente l'unico / i modo / i per farlo.
Pekka,

2
Forse è meglio con le espressioni regolari invece di questo ciclo + sottostringhe - Ma come si fa a scrivere una lettera maiuscola nelle espressioni regolari di Javascript?
Harmen,

3
Se lo farai sul lato server, potresti mettere in minuscolo l'intera stringa e lasciare che CSS faccia il maiuscolo. Solo un pensiero.
Stephen P,

16
Ho finito per fare un .toLowerCase () sull'intera stringa, quindi ho usato i CSS per scrivere in maiuscolo. Grazie per il consiglio!
Khan,

1
@GlennFerrie Qual è l'unica soluzione CSS di cui stai parlando, se non ti dispiace condividerla con noi? :-)
acquoso

183

Puoi quasi farlo con:

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

Ti darà l'output:

Small caps
All caps

7
funziona come un incantesimo, grazie !, l'ordine è importante, la linea con: le prime lettere devono essere dopo la linea minuscola.
Steven Lizarazo,

9
Ciò sembra richiedere che gli elementi .link vengano visualizzati come elementi di blocco. (display: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann

1
Pensiero intelligente, Philihp ben fatto. E ben fatto Torin per aver indicato "display: inline-block".
Chris Mendes,

9
Ma non produce il risultato desiderato. Fa maiuscola la prima lettera di elemento solo mentre la domanda chiede di scrivere in maiuscolo la prima lettera di ogni parola. Produce "Tutte maiuscole" ma è richiesto "Tutte
maiuscole

1
@manpreetsingh corretto, ecco perché ho detto che funziona quasi . Potrebbe non essere esattamente la domanda posta, ma spesso le tue specifiche sono flessibili ed è preferibile una soluzione più semplice.
Philihp Busby

32

Converti con JavaScript utilizzando .toLowerCase()e capitalizefarebbe il resto.


1
Sì. Ho ripetuto gli elementi nel modello e li ho convertiti in LowerCase, come myArray [i] .firstName = myArray [i] firstName.toLowerCase () Quindi, nel css, text-transform: capitalize
pdschuller

OP non menziona JS.
JDuarteDJ,

Grazie per l'input, ma la domanda non ha limitato l'approccio al solo CSS.
ronnyfm,

Potete per favore rimuovere @JDuarteDJ il voto negativo? Ancora una volta, la mia risposta è di conseguenza ciò che è stato messo in discussione. E se vedi cosa è stato selezionato come risposta usa anche JavaScript, anche jQuery. Grazie.
Ronnyfm,

26

Domanda interessante!

capitalizetrasforma ogni prima lettera di una parola in maiuscolo, ma non trasforma le altre lettere in minuscolo. Neanche la :first-letterpseudo-classe lo taglierà (perché si applica alla prima lettera di ogni elemento, non a ogni parola), e non riesco a vedere un modo per combinare lettere minuscole e maiuscole per ottenere il risultato desiderato.

Per quanto posso vedere, questo è davvero impossibile da fare con i CSS.

@Harmen mostra PHP di bell'aspetto e soluzioni alternative jQuery nella sua risposta.


1
Strano, mi aspettavo che l'aggiunta di "a {text-transform: lowercase}" avrebbe funzionato. Ma non lo fa.
Kwebble,

1
Questa risposta risponde al motivo per cui sta accadendo. :) È meglio delle soluzioni.
Asim KT,

Ottima spiegazione @Pekka 웃 alcuni comportamenti inaspettati da CSS. Speriamo che ci sia una correzione in cantiere.
Aaron Matthews il

1
@Pekka 웃 Ho fornito una risposta che si avvicina molto a questo puramente nei CSS. C'è una limitazione una volta per riga ma penso che si adatti alla maggior parte dei casi.
JDuarteDJ,

9

Vorrei chiedere una soluzione CSS pura che sia più utile della soluzione di prima lettera presentata ma che sia anche molto simile.

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

Sebbene questo sia limitato alla prima riga, può essere utile per più casi d'uso rispetto alla soluzione della prima lettera poiché applica le maiuscole all'intera riga e non solo alla prima parola. (tutte le parole nella prima riga) Nel caso specifico del PO questo avrebbe potuto risolverlo.

Note: Come menzionato nei commenti sulla soluzione della prima lettera , l'ordine delle regole CSS è importante! Si noti inoltre che ho cambiato il <a>tag per un <div>tag perché per qualche motivo lo pseudo-elemento ::first-linenon funziona con i <a>tag in modo nativo ma neanche <div>o va <p>bene. EDIT: l' <a>elemento funzionerà se display: inline-block;viene aggiunto alla .linkclasse. Grazie a Dave Land per averlo individuato!

Nuova nota: se il testo si chiude , perderà la maiuscola perché ora è effettivamente sulla seconda riga (la prima riga è ancora ok).


1
Il tuo ( not working )esempio può essere fatto funzionare aggiungendo display: inline-block;allo .linkstile.
Dave Land il

Buona soluzione via css nel caso in cui inizialmente tutte le lettere in maiuscolo
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; }

Ciò che Khan "ha finito per fare" (che è più pulito e ha funzionato per me) sta nei commenti del post contrassegnato come risposta.


4

captializeinfluisce solo sulla prima lettera della parola. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
Questa risposta non è costruttiva, nonostante il fatto che fornisca una spiegazione del perché il PO presenta il problema.
JDuarteDJ,

@JDuarteDJ Penso che sia importante conoscere il problema alla fonte, che è il caso. captialize non normalizza le stringhe, ma ottiene solo il primo elemento e lo trasforma in una lettera maiuscola. Ho trovato queste informazioni davvero utili
Rodrigo Borba il

3

Può essere utile per java e jstl.

  1. Inizializza variabile con messaggio localizzato.
  2. Successivamente è possibile usarlo nella funzione jstl toLowerCase.
  3. Trasforma con CSS.

In JSP

1.

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

2.

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

Nel CSS

3.

.content {
  text-transform:capitalize;
}

Nel mio caso ho potuto fare ${fn:toLowerCase(some.key)}direttamente, senza dover usare fmt:message. Grazie.
RaphaelDDL,

3

Puoi farlo con la prima lettera css! ad es. lo volevo per il menu:

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

Funziona solo con elementi a blocchi - quindi il blocco inline!


Questo non è ciò che l'OP ha richiesto, non si tratta di small cap.
JDuarteDJ,

2

Se i dati provengono da un database, come nel mio caso, è possibile abbassarli prima di inviarli a un elenco di selezione / elenco a discesa. Peccato che non puoi farlo in CSS.


1

Dopo aver studiato molto ho trovato la funzione / espressione jquery per modificare il testo nella prima lettera solo in maiuscolo, modifico di conseguenza quel codice per renderlo utilizzabile per il campo di input. Quando scriverai qualcosa nel campo di input e poi passerai a un altro file o elemento, il testo di quel campo cambierà solo con lettere maiuscole. Indipendentemente dal testo digitato dall'utente in maiuscolo o minuscolo completo:

Segui questo codice:

Passaggio 1: chiama la libreria jquery in html head:

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

Passaggio 2: scrivere il codice per modificare il testo dei campi di input:

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

Step-3: Crea campi di input HTML con gli stessi ID che usi nel codice jquery come:

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

L'id di questo campo di input è: edit-submit-first-name (usando nel codice jquery nel passaggio 2)

** Risultato: assicurarsi che il testo cambierà dopo aver spostato lo stato attivo da quel campo di input a un altro elemento. Perché stiamo usando l'evento focus out di jquery qui. Il risultato dovrebbe essere così: Tipo di utente: "grazie" cambierà con "Grazie". **

Buona fortuna


0

La soluzione PHP, in backend:

$string = `UPPERCASE`
$lowercase = strtolower($string);
echo ucwords($lowercase);

-1

So che questa è una risposta tardiva, ma se vuoi confrontare le prestazioni di varie soluzioni ho un jsPerf che ho creato.

Le soluzioni Regex sono sicuramente le più veloci.

Ecco il jsPerf: https://jsperf.com/capitalize-jwaz

Ci sono 2 soluzioni regex.

Il primo usa /\b[a-z]/g. Il limite di parole renderà maiuscole le parole come non divulgazione alla non divulgazione.

Se vuoi solo scrivere in maiuscolo lettere precedute da uno spazio, usa la seconda regex

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

-1

se stai usando jQuery; questo è un modo per farlo:

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

Ecco una versione più facile da leggere che fa la stessa cosa:

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

dimostrazione


Non credo che OP usi jQuery.
JDuarteDJ,

-6

tutto sbagliato esiste -> variante-font: small-caps;

text-transform: capitalizzare; solo il cappuccio della prima lettera


Non è affatto quello che voleva l'OP. Si aspetta che l'output abbia solo le prime lettere delle parole in maiuscolo; non l'intera stringa.
Andrew Barber,

C'è una sfumatura nella domanda che non percepisci: text-transform: capitalize;non altera il testo che è già tutto maiuscolo. Vedi di nuovo la domanda: l'utente l'ha già provato.
Andrew Barber,

quindi può usare il tag span per spezzare quali parole vogliono tutti maiuscoli e maiuscoli.
Orlando,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.