En la actualidad, los usuarios navegan por Internet a través de una gran variedad de dispositivos: desde teléfonos móviles hasta ordenadores de escritorio. En esta continua proliferación de dispositivos y diferentes resoluciones surgió la necesidad de que los sitios web se visualicen bien en cualquier dispositivo.
Hace algunos años, los sitios web tenían un único diseño que se ajustaba a un tamaño estándar; y no había nada más. Si accedías desde un teléfono móvil, se veía el texto muy pequeño. Era muy habitual que el contenido solo se visualizase correctamente en ordenadores de escritorio.
Con la aparición de los primeros teléfonos móviles apareció una solución que ya quedó en desuso: el «diseño web adaptativo». Lo que hacía era disponer de varios diseños que se cargan en función del tipo de dispositivo del usuario.
Afortunadamente, pronto llegaron técnicas innovadoras que se centran en crear un único diseño que se adapta según las características del dispositivo. Se trata del diseño web responsive o «diseño web responsivo».
Aquí es donde entran en juego las consultas de medios (en inglés: media queries), ya que permiten tener un enfoque más flexible en el diseño web. Constituyen una herramienta esencial para que los diseñadores web puedan crear sitios que se ajusten a cualquier pantalla, sin importar su tamaño o resolución.
Usos de las consultas de medios
Las consultas de medios se usan para aplicar estilos de forma condicional a través de varios métodos que se describen a continuación:
- Usando la regla arroba
@import
- Mediante la regla arroba
@media
- Atributo
media
en el elemento HTML<link>
. - Atributo
media
en el elemento HTML<style>
.
En todos estos casos se especifica el tipo de medio en el que se deben aplicar los estilos CSS determinados. Pueden ir incluidos en un archivo CSS externo, incluidos dentro de la regla arroba @media
, enlazados con el elemento HTML <link>
o insertados dentro del elemento HTML <style>
.
Tipos de medios
Un medio es el dispositivo en el que se presenta la información. En CSS puede definirse tres tipos de medios (media types): los dispositivos digitales o pantallas (screen
), la salida de impresión (print
) y todos (all
).
Medio | Descripción |
---|---|
screen | Destinado a pantallas digitales. |
print | Destinado a medios paginados. |
all | Aplica estilos a todos los dispositivos. |
Cuando no se especifica un tipo de medio, la opción por defecto es all
, por lo que los estilos CSS indicados se aplicarán a todos los dispositivos.
Los tipos de medio aural
y speech
han quedado obsoletos.
La regla arroba ‘@media’
La regla arroba @media
proporciona una forma de verificar si los dispositivos que usan los usuarios cumplen con una serie de condiciones (media queries). De esta forma, es posible aplicar estilos CSS específicos a una página web a partir de ciertas características del dispositivo en el que se está visualizando.
Por ejemplo, es posible adaptar el diseño según el ancho del viewport del navegador web o según la resolución. Imaginemos que tenemos un texto en dos columnas. Con esta regla arroba podremos crear esta condición: cuando el ancho sea inferior a 768 píxeles, el texto pase de varias columnas a una. Por tanto, esta regla arroba es parte fundamental del diseño web responsive.
Operadores lógicos
Las consultas de medios se usan combinando varios operadores lógicos. De esta forma, se puede realizar condiciones más complejas para cubrir necesidades específicas. Así también es posible tener un mayor control sobre cuándo se aplican los etilos CSS. A continuación se describen los operadores.
Operadores | Descripción |
---|---|
and | Concatena múltiples condiciones en una única consulta de medios. Ambas condiciones deben ser verdaderas para que la consulta sea verdadera. |
or | La consulta devuelve verdadero cuando una de las diversas condiciones sea verdadera. |
not | Este operador invierte la condición indicada. La consulta será verdadera cuando la condición sea falsa. |
only | Aplica los estilos CSS cuando se cumpla la condición y además sea un navegador moderno. Evitará que se aplique estilos en navegadores antiguos. |
También puede usarse la coma para combinar múltiples consultas de medios en una sola regla. Esto permite aplicar los mismos estilos en diferentes situaciones.
Características de los dispositivos
A través de las consultas de medios y la regla arroba @media
, se puede evaluar diversas características del dispositivo. Las condiciones más comunes tienen que ver con la anchura (width
) y la altura (height
) de la pantalla, pero también con la orientación (orientation
) o la resolución (resolution
).
El tamaño del dispositivo
Para aplicar estilos CSS dependiendo del tamaño del viewport del navegador web existen varias características involucradas, tanto para la anchura como para la altura. Se describen en la tabla siguiente.
Característica | Descripción |
---|---|
width | Define la anchura. |
min-width | Define la anchura mínima. |
max-width | Define la anchura máxima. |
height | Define la altura. |
min-height | Define la altura mínima. |
max-height | Define la altura máxima. |
Por ejemplo, vamos a crear un ejemplo en el que aplicamos estilos CSS cuando el viewport tenga un ancho inferior a los 768 píxeles:
@media only screen and (max-width: 768px) {
/* ... */
}
En los últimos niveles de CSS, puede usarse únicamente width
y height
junto con una serie de operadores matemáticos:
- Menor que:
<
- Mayor que:
>
- Menor o igual que:
<=
- Mayor o igual que:
>=
Podemos recrear el ejemplo anterior con la nueva sintaxis:
@media only screen and (width <= 768px) {
/* ... */
}
Lo más habitual es trabajar con la anchura y dejar que el contenido siga el flujo normal a través del eje vertical (altura). Hay varias anchuras del viewport del navegador recomendables con las que trabajar. Por ejemplo:
- Menor que 320 píxeles
- Menor que 480 píxeles
- Menor que 768 píxeles
- Menor que 1024 píxeles
- Mayor que 1024 píxeles
De esta manera se cubre un amplio espectro de anchos habituales, y el contenido se ajustará a cualquier tamaño a través de las media queries.
La proporción de aspecto
Si queremos trabajar con la proporción de aspecto podemos usar la característica aspect-ratio
, que acepta como valor un número entero o una fracción numérica. Por ejemplo, 6/2
es equivalente a usar 3/1
, que es como usar 3
. Esto significa que el ancho será tres veces mayor que el alto.
Característica | Descripción |
---|---|
aspect-ratio | Define la proporción. |
min-aspect-ratio | Define la proporción mínima. |
max-aspect-ratio | Define la proporción máxima. |
Por ejemplo:
@media (max-aspect-ratio: 5/3) {
/* ... */
}
En este caso, también podemos usar de forma exclusiva la característica aspect-ratio
junto con los operadores <
, >
, <=
y >=
. Así:
@media (aspect-ratio <= 5/3) {
/* ... */
}
Orientación de la región visible
La característica orientation
permite aplicar estilos CSS dependiendo de la orientación de la región visible (viewport) del navegador web. Es muy útil para usar en dispositivos móviles o en pantallas que pueden rotar 90 grados, pasando de estar vertical (portrait) a apaisado (landscape).
Esta característica puede tener dos valores:
Valor | Descripción |
---|---|
portrait | El viewport está en vertical. |
landscape | El viewport está en horizontal. |
Por ejemplo:
@media (orientation: landscape) {
/* ... */
}
Desbordamiento
Con las consultas de medios es posible aplicar estilos CSS dependiendo de la forma que tiene el dispositivo de gestionar el desbordamiento de contenido. Algunos dispositivos permiten el desbordamiento de contenido: te desplazas hacia abajo para ver la continuación. En cambio, otros dispositivos como los lectores digitales (ebook readers) dividen el contenido en páginas.
Hay dos características para detectarlo el desbordamiento.
Característica | Descripción |
---|---|
overflow-block | Detecta si puede desbordar en el eje principal. |
overflow-inline | Detecta si puede desbordar en el eje secundario. |
Cuando hablamos del «eje principal» nos referimos al eje vertical (el eje Y), mientras que el «eje secundario» es el eje horizontal (eje X).
Estos son los valores que se puede usar:
Valor | Descripción |
---|---|
none | El contenido que desborda no se muestra. |
scroll | El usuario se puede desplazar hacia el contenido que desborda. Es el caso de móviles, tabletas, ordenadores… |
paged | El contenido que desborda se divide en páginas. En este caso se trata de lectores digitales (ebook readers). Solo para el eje principal. |
Por ejemplo, aplica estilos si se trata de un lector electrónico:
@media (overflow-block: paged) {
/* ... */
}
Modo de visualización
En ocasiones puede ser interesante aplicar estilos dependiendo del modo de visualización del navegador web. Por ejemplo, podríamos detectar si la página web se muestra en una pestaña normal del navegador, si está en modo de pantalla completa —como resultado de presionar la tecla F11— o si se encuentra en una página flotante. Para ello se usa la característica display-mode
.
Esta característica admite los siguientes valores:
Valor | Descripción |
---|---|
browser | La página se abre en una pestaña convencional o en una ventana nueva del navegador web. |
fullscreen | La página se encuentra en modo de pantalla completa. Utiliza todo el espacio de visualización disponible. |
minimal-ui | La página parece ser una aplicación independiente, pero conserva un mínimo de elementos de la interfaz gráfica para la navegación. |
standalone | La página parece ser una aplicación independiente, y además puede excluir varios elementos de la interfaz gráfica del navegador. |
picture-in-picture | La página se muestra en una ventana flotante que siempre será visible. |
Por ejemplo, aplica estilos si la página está en pantalla completa:
@media screen and (display-mode: fullscreen) {
/* ... */
}
Ejecución de JavaScript
Para detectar si es el navegador web tiene la capacidad de ejecutar secuencias de comandos (scripting) del lenguaje JavaScript se usa la característica scripting
. De este modo, es posible aplicar estilos CSS dependiendo de si existe o no esta funcionalidad. Valores posibles:
Valor | Descripción |
---|---|
none | El navegador web no puede ejecutar JavaScript. |
initial-only | El navegador ejecuta JavaScript durante la carga inicial. |
enabled | El navegador web no puede ejecutar JavaScript. |
Por ejemplo:
@media (scripting: enabled) {
/* ... */
}
Resolución
La característica resolution
permite aplicar estilos CSS dependiendo de la resolución del dispositivo de salida. Como valor admite un número entero referente a la densidad de píxeles. Al ser una característica de rango, también se puede usar las variantes con los prefijos min-*
(mínimo) y max-*
(máximo)
Característica | Descripción |
---|---|
resolution | Define la resolución. |
min-resolution | Define la resolución mínima. |
max-resolution | Define la resolución máxima. |
Por ejemplo:
@media (min-resolution: 72dpi) {
/* ... */
}
También podemos usar la característica resolution
junto con los operadores <
, >
, <=
y >=
. Así:
@media (resolution >= 72dpi) {
/* ... */
}
Proceso de escaneo
La mayoría de las pantallas modernas representan la imagen de forma progresiva, mientras que los antiguos monitores de CRT y algunos televisores de plasma lo hacen de forma entrelazada. En estos casos puede ser interesante aplicar estilos CSS diferentes. Para ello se usa la característica scan
.
Lista de valores posibles para scan
:
Valor | Descripción |
---|---|
interlace | El dispositivo usa el sistema entrelazado. |
progressive | El dispositivo usa el sistema progresivo. |
Para aplicar estilos CSS a pantallas con entrelazado, se recomienda evitar animaciones con movimientos rápidos, y que los elementos animados midan más de 1 pixel con el fin de reducir el parpadeo.
Salida cuadricular
La característica grid
permite aplicar estilos CSS dependiendo de si el dispositivo de salida es cuadricular, como una terminal o un teléfono móvil antiguo, o si tiene la pantalla basada en mapas de bits, como las pantallas normales.
Lista de valores para grid
:
Valor | Descripción |
---|---|
0 | El dispositivo no usa cuadrícula. |
1 | El dispositivo usa cuadrícula. |
Actualización
La característica update
permite aplicar estilos CSS según la velocidad de actualización del dispositivo de salida. Los valores que admite son las siguientes palabras clave referentes a distintas velocidades.
Lista de valores para update
:
Valor | Descripción |
---|---|
none | No se puede actualizar. |
slow | Se actualiza de forma lenta. |
fast | Se actualiza de forma rápida. |
Control del color
Existe una serie de características relacionadas con la detección del color. Por ejemplo, es posible aplicar estilos CSS dependiendo de la cantidad de colores que admite, si está en monocromo o si tiene los colores invertidos.
Características relacionadas con el color:
Característica | Descripción |
---|---|
color-index | Define la cantidad de colores admitidos. |
min-color-index | Valor mínimo de colores admitidos. |
max-color-index | Valor máximo de colores admitidos. |
color | Define la profundidad del color. |
min-color | Profundidad mínima del color. |
max-color | Profundidad máxima del color. |
monochrome | Define la profundidad del color monocromático. |
min-monochrome | Profundidad mínima del color monocromático. |
max-monochrome | Profundidad máxima del color monocromático. |
Por ejemplo, podemos aplicar estilos CSS cuando el dispositivo de salida tenga soporte para un máximo de 256 colores:
@media (max-color-index: 256) {
/* ... */
}
Es equivalente al siguiente código CSS:
@media (color-index <= 256) {
/* ... */
}
Otras características del color
La característica color-gamut
permite aplicar estilos dependiendo de la gama de colores admitida. Los valores posibles pueden ser: srgb
, referente al espacio de color RGB; p3
, el espacio de color P3 definido por Apple; y rec2020
, referente a la recomendación ITU-R 2020.
Otra característica interesante es dynamic-range
, que permite detectar si el dispositivo tiene soporte para mostrar imágenes o vídeos HDR. Los valores posibles pueden ser los siguientes: standard
y high
.
Finalmente, inverted-colors
es de utilidad si queremos aplicar estilos cuando los colores del dispositivo de salida estén invertidos. Los valores pueden ser inverted
cuando los colores están invertidos y none
cuando no lo están.
Interactividad
La característica hover
es muy interesante ya que permite aplicar estilos CSS dependiendo de si el dispositivo permite flotar el cursor sobre un elemento sin presionarlo. Es el caso de los ordenadores; quedan excluidos los móviles y tabletas, ya que en ellos se usan los dedos de las manos, presionando.
Valores de hover
:
Valor | Descripción |
---|---|
none | No tiene mecanismo de puntero primario. |
hover | El mecanismo de entrada puede flotar sobre los elementos. |
Por su parte, la característica pointer
permite aplicar estilos CSS dependiendo de si el dispositivo tiene puntero del ratón. En caso de ser afirmativo, se puede filtrar según el nivel de precisión del dispositivo.
Valores de pointer
:
Valor | Descripción |
---|---|
none | No tiene mecanismo para apuntar. |
coarse | Tiene un mecanismo de baja precisión (dedo). |
fine | Tiene un mecanismo de alta precisión (puntero). |
Por ejemplo, podemos crear un cambio de color de fondo sobre un elemento cuando el dispositivo permita flotar el cursor sobre un elemento, y cuando dicho mecanismo sea de alta precisión, como el puntero del ratón.
Código CSS:
@media (hover: hover) and (pointer: fine) {
background: blue;
}