TRUCO: Cómo resaltar la inicial de un texto con CSS

06/11/2018Artículo original

En revistas de papel es habitual encontrar las iniciales de los textos resaltadas de algún color y en mayor tamaño, como una indicación visual del lugar por donde se empieza a leer el texto. Si quieres introducir este elemento práctico y decorativo en una web, hay varias formas de conseguirlo. En este artículo estudiaremos cómo funcionan y sus ventajas e inconvenientes.

Método básico

La forma más directa de abordar el problema es separar la primera letra en un elemento span con una clase o identificador y aplicarle el estilo CSS apropiado. Tenemos dos opciones, bien hacer la inicial más grande en la misma posición (conocida como raised cap) o bien que esta ocupe varias líneas y se adentre en el párrafo de texto (denominada drop cap). Para el primer caso basta con aumentar el font-size de la letra en cuestión y ajustar line-height en caso de que fuera necesario. El segundo es más complicado y requiere del uso de float para mezclar la letra con el texto. Supongamos que tengamos el siguiente marcado HTML:

<p><span class="drop-cap">G</span>ranada ama lo diminuto. (...)</p>

Entonces, agrandamos la letra, la convertimos en flotante y realizamos ajustes de margen para que no aparezca demasiado cerca del texto de alrededor:

.drop-cap-span .drop-cap { float: left; font-size: 5.4em; line-height: 1; margin-right: .6rem;}

El resultado de ese código, así como aplicando algo de estilo adicional con un color y otra tipografía, sería el de la siguiente imagen:

Este método tiene ciertos inconvenientes. Por un lado, introduce un elemento de marcado extra (el ) que puede que no podamos añadir en determinadas situaciones, por ejemplo, que el texto se cargue de forma dinámica y no se pueda modificar. Además, tiene efectos negativos para la accesibilidad, ya que un lector de textos posiblemente lea la inicial y el resto de la palabra separadas. Por otro lado, utilizar el elemento span nos permite personalizar cada una de las iniciales que construyamos, mediante clases distintas.

  GAMBADAS: El 77% de los sitios web utiliza bibliotecas JavaScript vulnerables

El pseudo-elemento ::first-letter

CSS proporciona un selector que crea un pseudo-elemento en la primera letra (y casi cualquier puntuación que la rodee), pudiendo aplicarle estilos sin necesidad de modificar el marcado HTML. En este caso, podemos simplemente tener el siguiente código en la página:

<article class="drop-cap"><p>El diminutivo no tiene más misión que la de limitar(...)</p></article>

Y utilizar estas líneas de CSS para activar la inicial decorativa:

.drop-cap p:first-child::first-letter { float: left; font-size: 5.5em; line-height: 1; margin: 0.2rem; margin-right: 0.6rem; padding: 1rem; background: #a070c0; box-shadow: 0 0 0 .2rem #a070c0; border: .2rem solid black; }

Esta vez hemos añadido un fondo para la letra y un borde, de forma que la letra tiene un espacio propio y queda bien separada del texto normal. El resultado sería el que ves en la imagen:

La ventaja de ::first-letter es que se puede aplicar a cualquier texto, estático o dinámico, y que no empeora la accesibilidad del sitio. Por otro lado, si queremos ajustar el posicionamiento de cada inicial respecto al texto es más difícil hacerlo de forma distinta para cada letra, ya que tenemos un único estilo para todas las iniciales. Esto puede ser incómodo en ciertos casos ya que cada navegador ajusta el elemento flotante de forma distinta y algunas letras pueden quedar demasiado o muy poco separadas del texto, así como desplazar más líneas de texto en unos navegadores que en otros.

  TRUCO VS #1: Encuentra cualquier cosa instantáneamente en Visual Studio

La propiedad initial-letter

Como hemos visto, las iniciales grandes en la web sufren de un problema de posicionamiento y ajuste a un número determinado de líneas. CSS ha introducido recientemente una nueva propiedad específica para resolverlo, initial-letter. Sin embargo, el soporte de navegadores es muy escaso, únicamente disponible en aquellos que utilicen el motor Webkit (Safari en macOS y Epiphany en Linux) y en ocasiones es necesario el prefijo -webkit. La idea de esta propiedad es que sean los navegadores los encargados de adaptar el tamaño de la letra según el número de líneas que queremos que ocupe. De esta forma siempre se puede ajustar a la línea base o baseline del renglón conveniente.

Los parámetros de la propiedad initial-letter son dos: el número de líneas correspondiente al tamaño que deseamos que tenga la inicial, y el número de líneas que debe “hundirse”. Es decir, la inicial puede hundirse tres líneas y sobresalir una si tiene el tamaño de 4 líneas, en cuyo caso la propiedad tendría el valor 4 3. En nuestro caso, para imitar los ejemplos anteriores, haremos que la letra ocupe 4 líneas hacia abajo, lo cual podemos conseguir simplemente con el valor 4:

@supports (initial-letter: 4) or (-webkit-initial-letter: 4) { .drop-cap p:first-child::first-letter { -webkit-initial-letter: 4; initial-letter: 4; }}

Puesto que el soporte de esta propiedad aún no está muy extendido hemos utilizado una query de tipo @supports para que nos permita implementarlo con mejora progresiva: usando la propiedad nueva sólo si está soportada, y en otro caso podríamos usar el método anterior. El resultado debe ser parecido al de la imagen, renderizado en Epiphany (el soporte en Epiphany es aún experimental y podría cambiar ligeramente):

  Ministry Of Economy And Also Money

Te dejo el código con los tres ejemplos que hemos estudiado para que puedas experimentar por tu cuenta y comprobar sus similitudes y diferencias.

Fuentes y más información:

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad