La transformation de texte CSS capitalise sur toutes les majuscules


129

Voici mon HTML:

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

Voici mon CSS:

.link {text-transform: capitalize;}

La sortie est:

Small Caps & ALL CAPS

et je veux que la sortie soit:

Small Caps & All Caps

Des idées?


1
@Marcel - cela n'a pas besoin de l'être, il est suivi d'un espace, donc c'est une esperluette littérale parfaitement valide (sauf si le document est XHTML, mais il n'y a aucune suggestion que ce soit)
Quentin

1
@David - Oh, je ne savais pas que c'était aussi une notation valide. Merci, il y a toujours quelque chose de nouveau à apprendre.
Marcel Korpel

Réponses:


57

Il n'y a aucun moyen de faire cela avec CSS, vous pouvez utiliser PHP ou Javascript pour cela.

Exemple PHP:

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

Exemple jQuery (c'est un plugin maintenant!):

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

Ouais, probablement le (s) seul (s) moyen (s) de le faire.
Pekka

2
Peut-être que c'est mieux avec des expressions régulières au lieu de cette boucle + sous-chaînes - Mais comment pouvez-vous mettre une lettre en majuscule dans les expressions régulières de Javascript?
Harmen

3
Si vous allez le faire côté serveur, vous pouvez minuscules la chaîne entière puis laisser CSS faire la majuscule. Juste une pensée.
Stephen P

16
J'ai fini par faire un .toLowerCase () sur toute la chaîne, puis en utilisant CSS pour capitaliser. Merci pour le conseil!
Khan

1
@GlennFerrie Quelle est la seule solution CSS dont vous parlez, si cela ne vous dérange pas de la partager avec nous? :-)
aqueux

184

Vous pouvez presque le faire avec:

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

Cela vous donnera la sortie:

Small caps
All caps

7
ça marche comme un charme, merci !, l'ordre est important, la ligne avec: les premières lettres doit être après la ligne minuscule.
Steven Lizarazo

9
Cela semble exiger que les éléments .link soient affichés sous forme d'éléments de bloc. (affichage: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann

1
Pensée intelligente, bravo Philihp. Et bravo Torin pour avoir signalé "display: inline-block".
Chris Mendes

9
Mais cela ne produit pas le résultat souhaité. Il met en majuscule la première lettre de l'élément uniquement tandis que la question demande de mettre en majuscule la première lettre de chaque mot. Il produit 'All caps' mais obligatoire est 'All Caps'
manpreet singh

1
@manpreetsingh correct, c'est pourquoi j'ai dit que ça marche presque . Ce n'est peut-être pas exactement ce que la question a posée, mais souvent vos spécifications sont flexibles et une solution plus simple est préférable.
Philihp Buspar

32

Convertissez avec JavaScript en utilisant .toLowerCase()et capitalizeferait le reste.


1
Oui. J'ai itéré les éléments dans le modèle et les ai convertis en LowCase, comme myArray [i] .firstName = myArray [i] firstName.toLowerCase () Puis dans le css, text-transform: capitalize
pdschuller

OP ne mentionne pas JS.
JDuarteDJ

Merci pour la contribution, mais la question ne limitait pas l'approche au CSS uniquement.
ronnyfm

Pouvez-vous s'il vous plaît supprimer @JDuarteDJ le vote négatif? Encore une fois, ma réponse correspond à ce qui a été mis en question. Et si vous voyez ce qui a été sélectionné comme réponse, utilise également JavaScript, même jQuery. Merci.
ronnyfm

26

Question interessante!

capitalizetransforme chaque première lettre d'un mot en majuscules, mais ne transforme pas les autres lettres en minuscules. Même la :first-letterpseudo-classe ne la coupera pas (car elle s'applique à la première lettre de chaque élément, pas à chaque mot), et je ne vois pas de moyen de combiner minuscules et majuscules pour obtenir le résultat souhaité.

Donc, pour autant que je puisse voir, c'est en effet impossible à faire avec CSS.

@Harmen montre de belles solutions de contournement PHP et jQuery dans sa réponse.


1
Étrange, je m'attendais à ce que l'ajout d'un {text-transform: lowercase} fonctionne. Mais ce n'est pas le cas.
Kwebble du

1
Cette réponse explique pourquoi cela se produit. :) C'est mieux que des solutions.
Asim KT

Très bonne explication @Pekka 웃 un comportement inattendu de CSS. Espérons qu'une correction est en cours.
Aaron Matthews

1
@Pekka 웃 J'ai fourni une réponse qui est très proche de le faire uniquement en CSS. Il y a une limitation une fois par ligne mais je pense que cela convient à la plupart des cas.
JDuarteDJ

9

Je voudrais suggérer une solution CSS pure qui est plus utile que la solution de première lettre présentée mais qui est également très similaire.

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

Bien que cela soit limité à la première ligne, cela peut être utile pour plus de cas d'utilisation que la solution de première lettre car elle applique une majuscule à la ligne entière et pas seulement au premier mot. (tous les mots de la première ligne) Dans le cas spécifique du PO, cela aurait pu le résoudre.

Remarques: Comme mentionné dans les premiers commentaires de la solution, l'ordre des règles CSS est important! Notez également que j'ai changé la <a>balise pour une <div>balise car, pour une raison quelconque, le pseudo-élément ::first-linene fonctionne pas avec les <a>balises de manière native mais soit <div>ou va <p>bien. EDIT: l' <a>élément fonctionnera s'il display: inline-block;est ajouté à la .linkclasse. Merci à Dave Land d' avoir remarqué ça!

Nouvelle note: si le texte s'enroule, il perdra la majuscule car il est maintenant en fait sur la deuxième ligne (la première ligne est toujours correcte).


1
Votre ( not working )exemple peut être mis en œuvre en ajoutant display: inline-block;au .linkstyle.
Dave Land le

Bonne solution via css dans le cas où toutes les lettres en majuscules initialement
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; }

Ce que Khan "a fini par faire" (qui est plus propre et a fonctionné pour moi) est dans les commentaires du message marqué comme la réponse.


4

captializen'affecte que la première lettre du mot. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
Cette réponse n'est pas constructive malgré le fait qu'elle fournit une explication des raisons pour lesquelles le PO a le problème.
JDuarteDJ

@JDuarteDJ Je pense qu'il est important de connaître le problème source, ce qui est le cas. captialize ne normalise pas les chaînes, mais n'obtient que le premier élément et le transforme en une lettre majuscule. J'ai trouvé cette information vraiment utile
Rodrigo Borba

3

Peut être utile pour java et jstl.

  1. Initialisez la variable avec un message localisé.
  2. Après cela, il est possible de l'utiliser dans la fonction jstl toLowerCase.
  3. Transformez-vous avec CSS.

Dans JSP

1.

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

2.

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

En CSS

3.

.content {
  text-transform:capitalize;
}

Dans mon cas, je pourrais faire ${fn:toLowerCase(some.key)}directement, sans avoir à utiliser fmt:message. Merci.
RaphaelDDL

3

Vous pouvez le faire avec la première lettre css! par exemple je le voulais pour le menu:

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

Il ne fonctionne qu'avec des éléments de bloc - donc le bloc en ligne!


Ce n'est pas ce que le PO a demandé, ce ne sont pas des petites capitalisations.
JDuarteDJ

2

Si les données proviennent d'une base de données, comme dans mon cas, vous pouvez la réduire avant de l'envoyer à une liste de sélection / liste déroulante. Dommage que vous ne puissiez pas le faire en CSS.


1

Après de nombreuses recherches, j'ai trouvé la fonction / expression jquery pour modifier le texte de la première lettre en majuscules uniquement, je modifie ce code en conséquence pour le rendre utilisable pour le champ de saisie. Lorsque vous écrirez quelque chose dans le champ de saisie, puis que vous passerez à un autre fichier ou élément, le texte de ce champ changera avec la majuscule de la première lettre uniquement. Peu importe le texte du type d'utilisateur en majuscules ou minuscules complètes:

Suivez ce code:

Étape 1: Appelez la bibliothèque jquery dans la tête html:

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

Étape 2: Écrivez le code pour modifier le texte des champs de saisie:

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

Étape 3: Créez des champs de saisie HTML avec les mêmes identifiants que vous utilisez dans le code jquery comme:

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

L'identifiant de ce champ de saisie est: edit-submit-first-name (Il utilise le code jquery à l'étape 2)

** Résultat: assurez-vous que le texte changera après avoir déplacé votre focus de ce champ d'entrée vers un autre élément. Parce que nous utilisons l'événement focus out de jquery ici. Le résultat devrait ressembler à ceci: Type d'utilisateur: "merci" il changera avec "Merci". **

Bonne chance


0

La solution PHP, en backend:

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

-1

Je sais que c'est une réponse tardive, mais si vous souhaitez comparer les performances de diverses solutions, j'ai un jsPerf que j'ai créé.

Les solutions Regex sont certainement les plus rapides.

Voici le jsPerf: https://jsperf.com/capitalize-jwaz

Il existe 2 solutions regex.

Le premier utilise /\b[a-z]/g. La limite des mots comprendra des mots en majuscules tels que la non-divulgation à la non-divulgation.

Si vous ne souhaitez mettre en majuscule que les lettres précédées d'un espace, utilisez la deuxième expression régulière

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

-1

si vous utilisez jQuery; voici une façon de le faire:

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

Voici une version plus facile à lire faisant la même chose:

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

Démo


Je ne pense pas qu'OP utilise jQuery.
JDuarteDJ

-6

tout faux il existe -> font-variant: small-caps;

text-transform: capitaliser; juste la première lettre majuscule


Ce n'est pas du tout ce que voulait le PO. Il s'attend à ce que la sortie n'ait que les premières lettres des mots en majuscules; pas toute la chaîne.
Andrew Barber

Il y a une nuance dans la question que vous ne percevez pas: text-transform: capitalize;ne modifie pas le texte déjà en majuscules. Voir à nouveau la question: l'utilisateur a déjà essayé cela.
Andrew Barber

alors peut utiliser la balise span pour séparer les mots qu'ils veulent en majuscules et en petites majuscules.
Orlando
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.