Edificio, de William Daigneault

La semana pasada estuvimos hablando de pseudo-elementos y pseudo-clases en CSS. En esa entrada vimos cómo estas features de CSS nos permitían generar código más conciso, inteligible y fácil de mantener. Hoy me gustaría compartir contigo algunas propiedades adicionales de CSS que permiten adaptar la página web a las preferencias de tus visitantes.

La magia de object-fit y object-position

La primera propiedad que veremos hoy es object-fit. object-fit es una propiedad CSS que permite establecer cómo un elemento de reemplazo (por ejemplo, una imagen) debe escalarse para ocupar el espacio de su contenedor. Como esto suena un poco abstracto, vamos a verlo mejor con un ejemplo.

Supón que tenemos la siguiente imagen vertical:

Imagen de una mujer mirando un paisaje urbano
Imagen de mujer mirando un paisaje urbano. Fotografía de Elvis Ma en Unsplash.

y que queremos meterla en un área de este tamaño:

Es decir, queremos que la imagen mida 15em de altura y que ocupe un 80% del ancho disponible. En principio, lo único que tenemos que hacer es especificar las propiedades width y height para conseguir el efecto deseado:

.custom-size {
  height: 15em;
  width: 80%;
}

Pero si lo hacemos así veremos cómo la imagen pasa a «deformarse»:

Imagen original deformada debido a una relación de aspecto diferente

Para evitar que la imagen se «deforme» cuando le aplicamos un ancho y alto cualesquiera, mucha gente suele usar la propiedad background de CSS. Así, en lugar de añadir la imagen usando la etiqueta img, lo que hacen es crear un div que sirva como contenedor:

<div id="custom-image"></div>

y luego meten la imagen vía CSS, la cual se puede escalar y posicionar como queramos usando las propiedades background-size y background-position:

#custom-image {
  background-image: url( …/image.jpg );
  background-size: cover;
  background-position: center;
  height: 15em;
  width: 80%;
}

dando como resultado esto:

Usar un div para escalar imágenes sin deformarlas metiéndolas como fondo de ese div es una mala solución ya que estamos dejando de usar etiquetas HTML semánticamente correctas para apañar un problema visual. Además, renunciar a la etiqueta img implica renunciar a un montón de propiedades interesantes: srcset para usar imágenes responsive, loading para activar la carga lazy de imágenes, etc.

Si quieres escalar una imagen para que ocupe unas dimensiones concretas y no quieres deformar la imagen en el proceso, lo único que debes hacer es usar la propiedad object-fit y object-position, las cuales se comportan igual que los ya clásicos background-size y background-position. Basta un CSS como el siguiente:

.custom-size {
  height: 15em;
  object-fit: cover;
  object-position: center;
  width: 80%;
}

con una etiqueta img de toda la vida:

<img class="custom-size" src="…/image.jpg" />

para conseguir el resultado ideal:

Imagen original recortada cuando se usa una relación de aspecto diferente

Si quieres saber más sobre esta propiedad, aquí te dejo un enlace con toda la información necesaria.

Adaptándote al usuario con media queries

Las media queries son un mecanismo que permite añadir reglas CSS a tu sitio web en función de las características del dispositivo o la aplicación desde el que se está accediendo a la web. Probablemente las hayas usado ya si has implementado alguna web responsive, pero las media queries permiten hacer muchas más cosas…

Media queries clásicas

Definir media queries en una hoja de estilos CSS es tan fácil como añadir la directiva @media en el mismo junto a dos cosas: por un lado, el conjunto de reglas asociadas a esa media query y, por otro, las reglas que determinan cuándo se pueden usar dichas reglas. Hasta ahora, lo más habitual ha sido usar las media queries como un mecanismo para implementar diseños responsive.

Para crear un diseño responsive aplicábamos un conjunto de reglas u otras según el ancho width del navegador. Por ejemplo, podemos hacer que la barra lateral del siguiente párrafo:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mollis leo in turpis interdum, at pharetra velit elementum. Nam eget lacus sed lacus dictum scelerisque. Proin porta ligula sed mi semper, vel interdum massa auctor. Pellentesque et massa congue, tincidunt erat ac, tincidunt elit. Sed ac dolor metus. Nam commodo metus sed ligula consectetur interdum. Curabitur odio est, tempor id egestas nec, aliquam at nisl.

cambie de color pasando por todos los colores del arcoiris en función del ancho del navegador con los siguientes estilos CSS:

.colored-border {
  border-left: 0.5em solid red;
  padding-left: 1em;
}
@media ( min-width: 400px ) {
  .colored-border {
    border-color: orange;
} }
@media ( min-width: 600px ) {
  .colored-border {
    border-color: yellow;
} }
@media ( min-width: 800px ) {
  .colored-border {
    border-color: green;
} }
@media ( min-width: 1000px ) {
  .colored-border {
    border-color: cyan;
} }
@media ( min-width: 1200px ) {
  .colored-border {
    border-color: blue;
} }
@media ( min-width: 1400px ) {
  .colored-border {
    border-color: violet;
} }

Fíjate que el código anterior está implementado enfocando los estilos desde la perspectiva mobile first. Es decir, definimos un conjunto de reglas básicas (que funcionen para el móvil) y según la pantalla va creciendo de tamaño, añadimos reglas que estilen la página en el escritorio.

Cómo implementar un modo oscuro con CSS

De un tiempo a esta parte se ha puesto de moda el «modo oscuro», tanto en móviles como en escritorio. ¿Sabías que existe una media query para detectar las preferencias del usario y ver si usa el modo oscuro?

Usando la propiedad prefers-color-scheme podemos ver si el usuario prefiere un esquema de colores claro (light) u oscuro (dark). Sabiendo esto, podemos crear dos esquemas de colores diferentes para nuestra web (uno claro y el otro oscuro) que respete las preferencias del usuario sin perder nuestra identidad.

Por ejemplo, usando el siguiente ejemplo HTML:

<div class="force-light-theme">Light Theme</div>
<div class="force-dark-theme">Dark Theme</div>
<br>
<div class="theme">Dynamic (based on your settings)</div>

acompañado de las siguientes reglas:

.force-light-theme { background: #eee; color: black; }
.force-dark-theme { background: #333; color: white; }
@media (prefers-color-scheme: light) {
  .theme { background: #eee; color: black; }
}
@media (prefers-color-scheme: dark) {
  .theme { background: #333; color: white; }
}

podemos conseguir el siguiente resultado:

Light Theme
Dark Theme

Dynamic (based on your settings)

Otros ejemplos curiosos con media queries

Existen un montón de media queries que puedes usar (tienes una lista completa aquí), pero me gustaría enseñarte una muy útil para acabar. En concreto, quiero explicarte cómo aplicar estilos diferentes según si la página va a visualizarse en el navegador o va a ser impresa en papel. El efecto es tan sencillo como añadir la propiedad print o screen a tu media query:

@media print { … }
@media screen { … }

o, según como, crear dos hojas de estilo diferentes e incluir una u otra añadiendo una propiedad especial a la etiqueta link:

<link media="print" src="…/print.css" />
<link media="screen" src="…/default.css" />

Si creas una hoja de estilo específiac para imprimir tus páginas, puedes esconder las partes dinámicas de la web que no tienen sentido en una versión impresa (como, por ejemplo, el menú o los formularios) y puedes hacer pijadas como, por ejemplo, que las URL de los enlaces sean visibles. Aquí te dejo un ejemplo

@media print {
  .menu {
    display: none;
  }
  .show-links a:after {
    content: " (" attr(href) ")";
  }
}

y aquí ves el resultado de cómo quedaría:

Variables CSS

Finalmente, no podía dejar escapar la oportunidad de hablarte de las propiedades personalizadas de CSS (también conocidas como variables CSS), ya que son especialmente útiles para implementar el modo oscuro, hacer que nuestra web tenga paletas de colores, etc.

Las variables CSS son exactamente lo que estás pensando: una forma de dar nombre a un valor CSS que luego podemos usar en nuestras reglas CSS. Así, por ejemplo, podríamos definir una variable con el color por defecto de nuestro texto, otra con el color de un botón de acción, otra con el padding de un botón de acción, etc.

Las variables CSS son un nombre cualquiera que empieza con dos guiones (--) y que definimos dentro de un bloque de reglas:

element {
  --main-color: red;
  --main-padding: 2em 1em;
}

El selector que usas en el bloque de reglas donde hayas definido la variable CSS determina el ámbito de la misma. Es decir, si defines una variable dentro de una regla div.banner, esa variable solo estará disponible en ese ámbito. No obstante, lo más habitual es crear las variables en el ámbito global usando la pseudo-clase :root:

:root {
  --main-color: red;
  --main-padding: 2em 1em;
}

Para poder usar una variable CSS, debes usar la función var:

p {
  color: var(--main-color);
  padding: var(--main-padding);
}

CSS está aquí para ayudarte

El esqueleto HTML de una página web es como los cimientos de una casa. Cuando crees una página web, preocúpate primero de crear una buena estructura HTML que sea semánticamente correcta y que no contenga nodos innecesarios. Si lo haces bien, tendrás una base sólida sobre la que aplicar todos los trucos que comparto contigo en estas entradas.

Espero que te haya gustado la entrada de hoy y, si es así, compártela con tus amigos. ¡Hasta la próxima!

Imagen destacada de William Daigneault en Unsplash.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad de Nelio Software

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.