Transformação de texto CSS com letras maiúsculas em maiúsculas

129

Aqui está o meu HTML:

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

Aqui está o meu CSS:

.link {text-transform: capitalize;}

A saída é:

Small Caps & ALL CAPS

e eu quero que a saída seja:

Small Caps & All Caps

Alguma ideia?

Khan
fonte
1
@Marcel - ele não precisa ser, ele é seguido por um espaço, por isso é um literal perfeitamente válida (a menos que o documento é XHTML, mas não há nenhuma sugestão de que é)
Quentin
1
@ David - Oh, eu não sabia que isso também era uma notação válida. Obrigado, sempre há algo novo para aprender.
Marcel Korpel

Respostas:

57

Não há como fazer isso com CSS, você pode usar PHP ou Javascript para isso.

Exemplo de PHP:

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

Exemplo de jQuery (agora é um 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
fonte
Sim, provavelmente a única maneira de fazer isso.
Pekka
2
Talvez seja melhor com expressões regulares em vez deste loop + substrings - Mas como você pode colocar uma letra maiúscula nas expressões regulares do Javascript?
Harmen
3
Se você quiser fazer isso no lado do servidor, poderá minúscula toda a cadeia de caracteres e deixar o CSS capitalizar. Apenas um pensamento.
Stephen P
16
Acabei fazendo um .toLowerCase () em toda a string e depois usando CSS para capitalizar. Obrigado pelo conselho!
Khan
1
@ GlennFerrie Qual é a única solução de CSS que você está falando, se você não se importa de compartilhá-la conosco? :-)
aguado
183

Você quase pode fazer isso com:

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

Isso lhe dará a saída:

Small caps
All caps
Philihp Busby
fonte
7
funciona como um encanto, obrigado !, a ordem é importante, a linha com: primeira letra deve ser posterior à linha minúscula.
Steven Lizarazo
9
Isso parece exigir que os elementos .link sejam exibidos como elementos de bloco. (display: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann
1
Pensamento inteligente, bem feito Philihp. E bem feito Torin por apontar "display: inline-block".
Chris Mendes
9
Mas não produz o resultado desejado. Coloca em maiúscula a primeira letra do elemento apenas enquanto a pergunta pede para colocar em maiúscula a primeira letra de cada palavra. Produz 'Todas as tampas', mas necessária é 'Todos os Caps'
Manpreet singh
1
@manpreetsingh correto, é por isso que eu disse que quase funciona. Pode não ser exatamente o que a pergunta foi feita, mas muitas vezes sua especificação é flexível e uma solução mais simples é preferível.
Philihp Busby
32

Converta com JavaScript usando .toLowerCase()e capitalizefaria o resto.

ronnyfm
fonte
1
Sim. I reiterado os itens no modelo e converteu-os toLowerCase, como myArray [i] .firstName = myArray [i] firstName.toLowerCase () Em seguida, no css, text-transform: capitalize
pdschuller
O OP não menciona JS.
JDuarteDJ 15/02/19
Obrigado pela contribuição, mas a questão não limitou a abordagem apenas ao CSS.
Ronnyfm 19/02/19
Você pode remover @JDuarteDJ a votação final? Mais uma vez, minha resposta está de acordo com o que foi questionado. E se você vir o que foi selecionado como resposta, também usa JavaScript, mesmo jQuery. Obrigado.
Ronnyfm 28/02/19
26

Pergunta interessante!

capitalizetransforma todas as primeiras letras de uma palavra em maiúsculas, mas não transforma as outras letras em minúsculas. Nem mesmo a :first-letterpseudo-classe vai cortá-la (porque se aplica à primeira letra de cada elemento, não a cada palavra), e não vejo uma maneira de combinar letras minúsculas e maiúsculas para obter o resultado desejado.

Tanto quanto eu posso ver, isso é realmente impossível com CSS.

@Harmen mostra soluções PHP e jQuery bonitas em sua resposta.

Pekka
fonte
1
Estranho, eu esperava que adicionar 'a {text-transform: lowercase}' funcionasse. Mas isso não acontece.
Kwebble 12/08/10
1
Esta resposta responde por que está acontecendo. :) Isso é melhor do que soluções.
Asim KT
Muito boa explicação @Pekka 웃 algum comportamento inesperado do CSS. Vamos torcer para que haja uma correção no pipeline.
Aaron Matthews
1
@Pekka 웃 Forneci uma resposta que chega muito perto de fazer isso puramente em CSS. Há uma limitação de uma vez por linha, mas acho que se adapta à maioria dos casos.
JDuarteDJ 15/02/19
9

Gostaria de sugerir uma solução CSS pura que seja mais útil do que a primeira letra apresentada, mas também muito semelhante.

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

Embora isso seja limitado à primeira linha, pode ser útil para mais casos de uso que a solução da primeira letra , pois aplica capitalização a toda a linha e não apenas à primeira palavra. (todas as palavras na primeira linha) No caso específico do OP, isso poderia ter resolvido.

Notas: Conforme mencionado nos comentários da primeira letra da solução, a ordem das regras CSS é importante! Observe também que mudei a <a>tag de uma <div>tag porque, por algum motivo, o pseudoelemento ::first-linenão funciona com <a>tags nativamente, mas é bom <div>ou <p>não. EDIT: o <a>elemento funcionará se display: inline-block;for adicionado à .linkclasse. Obrigado a Dave Land por descobrir isso!

Nova nota: se o texto for agrupado , a letra maiúscula será perdida, porque agora ela está na segunda linha (a primeira linha ainda está ok).

JDuarteDJ
fonte
1
É ( not working )possível fazer seu exemplo funcionar adicionando display: inline-block;ao .linkestilo.
Dave Land
Boa solução via css no caso em que todas as letras no Caps inicialmente
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; }

O que Khan "acabou fazendo" (que é mais limpo e funcionou para mim) está nos comentários do post marcado como resposta.

ryanttb
fonte
4

captializeafeta somente a primeira letra da palavra. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform

prodigitalson
fonte
1
Essa resposta não é construtiva, apesar de fornecer uma explicação para o motivo pelo qual o OP está tendo o problema.
JDuarteDJ 15/02/19
@JDuarteDJ Eu acho que é importante conhecer o problema da fonte, que é o caso. captialize não normaliza as strings, mas apenas obtém o primeiro item e o transforma em letras maiúsculas. Achei essas informações realmente úteis
Rodrigo Borba
3

Pode ser útil para java e jstl.

  1. Inicialize variável com mensagem localizada.
  2. Depois disso, é possível usá-lo na função jstl toLowerCase.
  3. Transforme com CSS.

No JSP

1

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

2)

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

Em CSS

3)

.content {
  text-transform:capitalize;
}
ekar
fonte
No meu caso, eu poderia fazer ${fn:toLowerCase(some.key)}diretamente, sem ter que usar fmt:message. Obrigado.
RaphaelDDL
3

Você pode fazer isso com a primeira letra css! por exemplo, eu queria para o menu:

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

Ele roda apenas com elementos de bloco - portanto, o bloco embutido!

Johannes
fonte
Não é isso que o OP solicitou, não são letras minúsculas.
JDuarteDJ 15/02/19
2

Se os dados vierem de um banco de dados, como no meu caso, você pode baixá-los antes de enviá-los para uma lista de seleção / lista suspensa. Pena que você não pode fazê-lo em CSS.

JohnnyBizzle
fonte
1

Depois de pesquisar muito, achei a função / expressão jquery para alterar o texto na primeira letra apenas em maiúsculas, modifico esse código de acordo para torná-lo viável para o campo de entrada. Quando você escrever algo no campo de entrada e depois mover para outro arquivo ou elemento, o texto desse campo será alterado apenas com maiúscula na primeira letra. Não importa o texto do tipo de usuário com letras maiúsculas ou minúsculas completas:

Siga este código:

Etapa 1: Chame a biblioteca jquery no cabeçalho html:

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

Etapa 2: escreva o código para alterar o texto dos campos de entrada:

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

Etapa 3: Crie campos de entrada HTML com os mesmos IDs que você usa no código jquery, como:

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

O ID deste campo de entrada é: edit-submit-first-name (Ele usa no código jquery na etapa 2)

** Resultado: verifique se o texto será alterado depois que você mover o foco desse campo de entrada para outro elemento. Porque estamos usando o foco do evento jquery aqui. O resultado deve ser o seguinte: Tipo de usuário: "obrigado", ele será alterado para "Obrigado". **

Boa sorte

A.Aleem11
fonte
0

A solução PHP, no back-end:

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

Sei que esta é uma resposta tardia, mas se você quiser comparar o desempenho de várias soluções, tenho um jsPerf que criei.

As soluções Regex são as mais rápidas, com certeza.

Aqui está o jsPerf: https://jsperf.com/capitalize-jwaz

Existem 2 soluções regex.

O primeiro usa /\b[a-z]/g. O limite de palavras incluirá maiúsculas como não divulgação à não divulgação.

Se você deseja colocar apenas letras maiúsculas em maiúsculas precedidas por um espaço, use o segundo regex

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

se você estiver usando jQuery; Esta é uma maneira de fazer isso:

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

Aqui está uma versão mais fácil de ler, fazendo a mesma coisa:

//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
fonte
Eu não acho que OP usa jQuery.
JDuarteDJ 15/02/19
-6

tudo errado existe -> variante de fonte: letras minúsculas;

transformação de texto: capitalizar; apenas a primeira letra

Orlando
fonte
Isso não é o que o OP queria. Ele espera que a saída tenha apenas as primeiras letras das palavras em maiúsculas; nem toda a cadeia.
Andrew Barber
Há uma nuance na pergunta que você não está percebendo: text-transform: capitalize;não altera o texto que já está em maiúsculas. Veja a pergunta novamente: O usuário já tentou isso.
Andrew Barber
então, você pode usar a tag span para separar quais palavras elas querem maiúsculas e minúsculas.
Orlando