CSS text-transform capitalize en mayúsculas

129

Aquí está mi HTML:

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

Aquí está mi CSS:

.link {text-transform: capitalize;}

El resultado es:

Small Caps & ALL CAPS

y quiero que la salida sea:

Small Caps & All Caps

¿Algunas ideas?

Kan
fuente
1
@Marcel: no es necesario que sea, va seguido de un espacio, por lo que es un ampersand literal perfectamente válido (a menos que el documento sea XHTML, pero no hay ninguna sugerencia)
Quentin
1
@David - Oh, no sabía que esta también era una notación válida. Gracias, siempre hay algo nuevo que aprender.
Marcel Korpel el

Respuestas:

57

No hay forma de hacer esto con CSS, podría usar PHP o Javascript para esto.

Ejemplo de PHP:

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

Ejemplo de jQuery (¡ahora es un complemento!):

// 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
fuente
Sí, probablemente la única forma de hacer esto.
Pekka el
2
Tal vez sea mejor con expresiones regulares en lugar de este bucle + subcadenas, pero ¿cómo puede escribir en mayúscula una letra en las expresiones regulares de Javascript?
Harmen
3
Si va a hacerlo en el lado del servidor, puede poner en minúscula toda la cadena y luego dejar que CSS capitalice. Solo un pensamiento.
Stephen P
16
Terminé haciendo un .toLowerCase () en toda la cadena, luego usando CSS para capitalizar. ¡Gracias por el consejo!
Khan
1
@GlennFerrie ¿Cuál es la única solución CSS de la que estás hablando, si no te importa compartirla con nosotros? :-)
acuoso
183

Casi puedes hacerlo con:

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

Te dará el resultado:

Small caps
All caps
Philihp Busby
fuente
77
funciona de maravilla, ¡gracias !, el orden es importante, la línea con: las primeras letras deben estar después de la línea en minúsculas.
Steven Lizarazo
9
Esto parece requerir que los elementos .link se muestren como elementos de bloque. (display: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann
1
Pensamiento inteligente, bien hecho Philihp. Y bien hecho Torin por señalar "display: bloque en línea".
Chris Mendes
9
Pero no produce el resultado deseado. Escribe en mayúscula la primera letra del elemento solo mientras que la pregunta pide poner en mayúscula la primera letra de cada palabra. Produce 'Todas las mayúsculas' pero se requiere 'Todas las mayúsculas'
manpreet singh
1
@manpreetsingh correcto, es por eso que dije que casi funciona. Puede que no sea exactamente lo que hizo la pregunta, pero a menudo su especificación es flexible y es preferible una solución más simple.
Philihp Busby
32

Convierte con JavaScript usando .toLowerCase()y capitalizeharía el resto.

ronnyfm
fuente
1
Sí. Repetí los elementos en el modelo y los convertí a LowCase, como myArray [i] .firstName = myArray [i] firstName.toLowerCase () Luego, en css, text-transform: capitalize
pdschuller el
OP no menciona a JS.
JDuarteDJ
Gracias por el aporte, pero la pregunta no limitó el enfoque de CSS solamente.
ronnyfm
¿Puedes por favor eliminar @JDuarteDJ el voto negativo? Nuevamente, mi respuesta es acorde a lo que se cuestionó. Y si ve lo que se seleccionó como respuesta, también usa JavaScript, incluso jQuery. Gracias.
ronnyfm
26

¡Interesante pregunta!

capitalizetransforma cada primera letra de una palabra en mayúsculas, pero no transforma las otras letras en minúsculas. Ni siquiera el:first-letter pseudo-clase lo cortará (porque se aplica a la primera letra de cada elemento, no a cada palabra), y no puedo ver una forma de combinar minúsculas y mayúsculas para obtener el resultado deseado.

Por lo que puedo ver, esto es realmente imposible de hacer con CSS.

@Harmen muestra buenas soluciones PHP y jQuery en su respuesta.

Pekka
fuente
1
Extraño, esperaba agregar 'a {text-transform: minúscula}' funcionaría. Pero no lo hace.
Kwebble
1
Esta respuesta responde por qué está sucediendo. :) Eso es mejor que las soluciones.
Asim KT
Muy buena explicación @Pekka 웃 un comportamiento inesperado de CSS. Esperemos que haya una corrección en la tubería.
Aaron Matthews
1
@Pekka 웃 Proporcioné una respuesta que se acerca mucho a hacer esto únicamente en CSS. Hay una limitación de una vez por línea, pero creo que se adapta a la mayoría de los casos.
JDuarteDJ
9

Me gustaría sugerir una solución CSS pura que sea más útil que la solución de primera letra presentada pero que también sea muy similar.

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

Aunque esto se limita a la primera línea, puede ser útil para más casos de uso que la solución de la primera letra , ya que aplica mayúsculas a toda la línea y no solo a la primera palabra. (todas las palabras en la primera línea) En el caso específico del OP esto podría haberlo resuelto.

Notas: ¡ Como se menciona en los comentarios de la solución de la primera letra , el orden de las reglas CSS es importante! También tenga en cuenta que he cambiado la <a>etiqueta de una <div>etiqueta, porque por alguna razón el pseudo-elemento ::first-lineno funciona con <a>etiquetas de forma nativa , pero cualquiera <div>o <p>están muy bien. EDITAR: el <a>elemento funcionará si display: inline-block;se agrega a la .linkclase. ¡Gracias a Dave Land por ver eso!

Nueva Nota: si el texto se ajusta , perderá las mayúsculas porque de hecho ahora está en la segunda línea (la primera línea todavía está bien).

JDuarteDJ
fuente
1
Su ( not working )ejemplo puede hacerse funcionar agregando display: inline-block;al .linkestilo.
Dave Land
Buena solución a través de css en el caso cuando todas las letras en mayúsculas 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; }

Lo que Khan "terminó haciendo" (que es más limpio y funcionó para mí) está en los comentarios de la publicación marcada como la respuesta.

ryanttb
fuente
4

captializesolo afecta a la primera letra de la palabra. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform

prodigitalson
fuente
1
Esta respuesta no es constructiva a pesar del hecho de que proporciona una explicación de por qué el OP está teniendo el problema.
JDuarteDJ
@JDuarteDJ Creo que es importante conocer el problema de origen, que es el caso. captialize no normaliza cadenas, solo obtiene el primer elemento y lo transforma en una letra mayúscula. Encontré esta información realmente útil
Rodrigo Borba
3

Puede ser útil para java y jstl.

  1. Inicializar variable con mensaje localizado.
  2. Después de eso, es posible usarlo en la función jstl toLowerCase.
  3. Transformar con CSS.

En 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;
}
ekar
fuente
En mi caso podría hacerlo ${fn:toLowerCase(some.key)}directamente, sin tener que usar fmt:message. Gracias.
RaphaelDDL
3

¡Puedes hacerlo con css primera letra! Por ejemplo, lo quería para el menú:

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

Solo funciona con elementos de bloque, ¡por lo tanto, el bloque en línea!

Johannes
fuente
Esto no es lo que solicitó el OP, no son pequeñas mayúsculas.
JDuarteDJ
2

Si los datos provienen de una base de datos, como en mi caso, puede reducirlos antes de enviarlos a una lista de selección / lista desplegable. Es una pena que no puedas hacerlo en CSS.

JohnnyBizzle
fuente
1

Después de investigar mucho, encontré que jquery function / expression cambiaba el texto en la primera letra solo en mayúscula, modifico ese código en consecuencia para que sea viable para el campo de entrada. Cuando escribes algo en el campo de entrada y luego te mueves a otro archivo o elemento, el texto de ese campo cambiará solo con mayúsculas en la primera letra. No importa el tipo de texto del usuario en mayúsculas o minúsculas completas:

Sigue este código:

Paso 1: Llame a la biblioteca jquery en html head:

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

Paso 2: escriba el código para cambiar el texto de los 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>

Paso 3: cree campos de entrada HTML con los mismos ID que usa en el código jquery como:

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

El id de este campo de entrada es: edit-submit-first-name (Se usa en código jquery en el paso 2)

** Resultado: asegúrese de que el texto cambiará después de mover su enfoque de ese campo de entrada a otro elemento. Porque usamos foco fuera de evento de jquery aquí. El resultado debería ser el siguiente: Tipo de usuario: "gracias", cambiará con "Gracias". ** **

La mejor de las suertes

A.Aleem11
fuente
0

La solución PHP, en backend:

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

Sé que esta es una respuesta tardía, pero si desea comparar el rendimiento de varias soluciones, tengo un jsPerf que creé.

Las soluciones Regex son las más rápidas con seguridad.

Aquí está el jsPerf: https://jsperf.com/capitalize-jwaz

Hay 2 soluciones regex.

El primero usa /\b[a-z]/g. El límite de palabras será palabras en mayúscula, como no divulgación a No divulgación.

Si solo desea poner en mayúscula las letras precedidas por un espacio, use la segunda expresión regular

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

si está usando jQuery; Esta es una forma de hacerlo:

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

Aquí hay una versión más fácil de leer que hace lo mismo:

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

Manifestación

fooaldrin
fuente
No creo que OP use jQuery.
JDuarteDJ
-6

todo mal existe -> variante de fuente: minúsculas;

transformación de texto: capitalizar; solo la primera letra mayúscula

Orlando
fuente
Eso no es lo que quería el OP. Espera que la salida solo tenga las primeras letras de las palabras en mayúscula; No toda la cadena.
Andrew Barber
Hay un matiz en la pregunta que no está percibiendo: text-transform: capitalize;no altera el texto que ya está en mayúsculas. Vea la pregunta nuevamente: el usuario ya lo intentó.
Andrew Barber
luego puede usar la etiqueta span para separar qué palabras quieren todas mayúsculas y minúsculas.
Orlando