DISEÑO DE INTERFACES WEB
FORMULARIOS, TRANSFORMACIONES, TRANSICIONES, ANIMACIONES
- 1. Introducción
- 2. Formularios
- 3. Transformaciones
- 4. Transiciones
- 5. Animaciones
- 6. Funcionalidades avanzadas
- 7. Recursos
En este tema trabajaremos la integración de contenido interactivo y multimedia en documentos web.
Empezaremos con los formularios por ser el elemento HTML interactivo por antonomasia.
Después pasaremos a tratar las propiedades de las que dispone CSS para dar dinamismo visual al contenido. Empezaremos con las transformaciones, para finalizar con las transiciones y animaciones.
Finalmente comentaremos algunos aspectos avanzados y más modernos que proporcionaran a nuestras páginas unos efectos bastante atractivos.
Los formularios son una característica de HTML de gran utilidad. Pero su estilizado suele ser complicado. Para entender por qué esto es así, consulta el artículo Estilizando formularios HTML disponible en MDN.
Por poner un ejemplo diremos que, de forma predeterminada, algunos controles no heredan font-family y font-size de sus padres. En su lugar, muchos navegadores utilizan la apariencia predeterminada del sistema.
Solución:
button,
input,
select,
textarea {
font-family: inherit;
font-size: 100%;
}Otro caso es el siguiente: todos los campos de texto tienen soporte completo para cada propiedad relacionada con el modelo de caja CSS, como width, height, padding , margin y border. Sin embargo, como antes, los navegadores se basan en los estilos predeterminados del sistema cuando muestran estos controles.
Para aprender como aplicar un estilizado básico a los formularios puedes consultar la siguiente referencia:
Selectores habituales para elementos de un formulario son:
label
textarea
input[type=text]
input[type=password]
input[type=number]
/* ... */Pseudoclases habituales, en orden alfabético, para elementos de un formulario son:
| Pseudoclase | Ejemplo | Descripción |
|---|---|---|
:checked |
input:checked |
Selecciona cada elemento input marcado |
:disabled |
input:disabled |
Selecciona cada elemento input deshabilitado |
:enabled |
input:enabled |
Selecciona cada elemento input habilitado |
:focus |
input:focus |
Selecciona el elemento input que tiene el foco |
:in-range |
input:in-range |
Selecciona elementos input con un valor dentro del rango especificado |
:invalid |
input:invalid |
Selecciona todos los elementos input con un valor inválido |
:optional |
input:optional |
Selecciona elementos input sin atributo "required" |
:out-of-range |
input:out-of-range |
Selecciona elementos input con un valor fuera del rango especificado |
:read-only |
input:read-only |
Selecciona elementos input con atributo "readonly" |
:read-write |
input:read-write |
Selecciona elementos input sin atributo "readonly" |
:required |
input:required |
Selecciona elementos input con atributo "required" |
:valid |
input:valid |
Selecciona todos los elementos input con un valor válido |
Como desarrolladores o diseñadores web debemos evitar que nuestros usuarios introduzcan datos erróneos en los formularios.
La validación de datos en el lado cliente se ha visto favorecida de gran medida en los últimos años debido a 2 factores:
<input type="email" />
<input type="search" />
<input type="tel" /> <!-- Teléfono -->
<input type="url" />
<input type="number" min="1" max="10" step="0.1" />
<input type="slider" min="1" max="10" step="0.1" />
<input type="datetime-local" />
<input type="date" />
<input type="time" />
<input type="month" />
<input type="week" />
<input type="color" />Este nuevo atributo nos permite tener un control más fino de la entrada del usuario, la cual comprobamos que se ajuste al patrón que indicamos.
Para indicar dicho patrón deberemos hacer uso de expresiones regulares
Ejemplo:
<input type="text"
id="codigo_pais"
name="codigo_pais"
pattern="[A-Za-z]{2}"
title="Por favor, introduce 2 letras del código de país" />input:invalid {
background-color: #FADBD8;
}
input:valid {
background-color: #EAFAF1;
}Una transformación es una operación que modifica el tamaño, posición y/o forma de un elemento. Las 3 principales transformaciones son:
- Rotación
- Escalado
- Traslación
Existen otras transformaciones que son menos usadas y que no veremos aquí, como son el cizallamiento (skew) y la perspectica (perspective).
Por otro lado, la transformaciones se pueden aplicar en el plano 2D o en el espacio 3D. Nos centraremos en las transformaciones 2D, y se anima al lector a seguir profundizando por su cuenta consultando el abundante material disponible en Internet.
Note
Todas las transformaciones que veremos a continuación se aplican sobre el punto origin central del elemento en cuestión. Para cambiar dicho punto usaremos la propiedad transform-origin que, habitualmente, tiene el siguiente formato:
transform-origin: x-offset y-offset;
como valores de offset se admiten: left, right, center, top, bottom, valor en px, valor en %.
El valor por defecto es:
transform-origin: center center;
transform-origin: 50% 50%; /* igual a lo anterior */Referencias:
La función rotate() define una transformación que mueve al elemento alrededor de un punto fijo (especificado por la propiedad transform-origin) sin deformarlo. La cantidad de movimiento es definida por el ángulo especificado; si es positivo, el movimiento será en sentido de las manecillas del reloj, y si es negativo, será en sentido opuesto.
Ejemplos:
#div1 {
transform: rotate(-30deg);
}
#div2 {
transform: rotate(30deg);
}Note
También existe una forma más simple de realizar rotaciones, usando la propiedad rotate:
#div4 {
rotate: 30deg;
}Mas info: https://developer.mozilla.org/en-US/docs/Web/CSS/rotate
La función scale() modifica el tamaño del elemento. Puede aumentar o disminuir su tamaño, y ya que la cantidad de escalada es definida por un vector, puede hacerlo más hacia una dirección que a otra.
Ejemplos:
#div1 {
transform: scale(2, 2);
}
#div2 {
transform: scaleX(0.5);
}
#div3 {
transform: scaleY(1.5);
}Note
También existe una forma más simple de realizar escalado, usando la propiedad scale:
#div4 {
scale: 1.5;
}Más info: https://developer.mozilla.org/en-US/docs/Web/CSS/scale
La función translate() mueve la posición del elemento sobre el plano. Esta transformación se caracteriza por un vector cuyas coordenadas definen qué tanto se moverá en cada dirección.
Ejemplos:
#div1 {
transform: translate(2rem, 2rem);
}
#div2 {
transform: translateX(50px);
}
#div3 {
transform: translateY(-50px);
}Note
También existe una forma más simple de realizar traslaciones, usando la propiedad traslate:
#div4 {
traslate: 50px -50px;
}Más info: https://developer.mozilla.org/en-US/docs/Web/CSS/translate
Podemos combinar varias transformaciones en una misma propiedad transform. Por ejemplo:
#div1 {
transform: rotate(30deg) scale(1.5, 1.5) translateY(100px);
}Una transición es el proceso de cambio entre 2 estados de un elemento.
La propiedad transition es una propiedad atajo (shorthand) para:
transition-propertytransition-durationtransition-timing-functiontransition-delay
Su sintaxis es la siguiente:
transition: property duration timing-function delay
propertyes la propiedad a aplicar la transición. Podemos ponerallpara indicar todas.durationes la duración de la transición en segundos o milisegundos (s o ms)timing-functiones la función de tiempo usada.delayes el retardo en iniciar la transición.
El único valor obligatorio es la duración.
Para ver las distintas funciones de tiempo disponibles podemos consultar la siguiente herramienta:
Las funciones de tiempo más habituales son:
ease(por defecto)ease-inease-outease-in-outlinear
Ejemplo:
Tomado de https://www.w3schools.com/cssref/tryit.php?filename=trycss_dim_width_inputfocus.
input[type=text] {
width: 100px;
transition: width .35s ease-in-out;
}
input[type=text]:focus {
width: 250px;
}Una animación es el proceso de cambio entre varios estados de un elemento. Estos estados o fases se definen con la regla @keyframes
La propiedad animation es una propiedad atajo (shorthand) para:
animation-nameanimation-durationanimation-timing-functionanimation-delayanimation-directionanimation-iteration-count
Su sintaxis es la siguiente:
animation: name duration timing-function delay direction iteration-count
namees el nombre dado en@keyframesdurationes la duración de la animación en segundos o milisegundos (s o ms)timing-functiones la función de tiempo usada.delayes el retardo en iniciar la animación.directiones la dirección, que puede sernormal,reverse,alternate, ...iteration-countes el número de iteraciones, que puede ser 1, 2, ...infinite
Ejemplos:
.movil {
position: fixed;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-color: black;
animation: desplazar 2s linear alternate infinite;
}
.color {
width: 200px;
height: 200px;
background-color: #000;
animation: colorear 8s;
}
@keyframes desplazar {
from {
top: 0;
left: 0;
}
to {
top: 100%;
left: 100%;
}
}
@keyframes colorear {
0% {
background-color: #000;
}
30% {
background-color: #f00;
}
60% {
background-color: #0f0;
}
100% {
background-color: #00f;
}
}Mas info:
- https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes
- https://developer.mozilla.org/en-US/docs/Web/CSS/animation
Important
Las siguientes funcionalidades son bastante modernas. Por tanto, es esperable que el soporte entre navegadores sea muy dispar. Por tanto, antes de usarlas, asegúrate de que estén suficientemente soportadas para evitar problemas de accesibilidad.
Las animaciones asociadas al desplazamiento proporcionan efectos visuales muy atractivos en una página a medida que nos desplazamos hacia abajo hasta el final de dicha página, como puede verse en el siguiente vídeo.
polar_bear_scroll.mp4
Código fuente:
<body>
<div id="progress"></div>
…
</body>@keyframes grow-progress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
#progress {
position: fixed;
left: 0; top: 0;
width: 100%;
height: 1em;
background: red;
transform-origin: 0 50%;
animation: grow-progress auto linear;
animation-timeline: scroll();
}Observa el uso de animation-timeline: scroll().
Otra posibilidad a nuestra disposición es animation-timeline: view(). Con esta propiedad y valor podemos generar animaciones de elementos según esten en el viewport o no, como puede verse en el siguiente vídeo.
polar_bear.mp4
Código fuente:
<body>
…
<img src="polar_bear.jpeg" class="revealing-image" >
…
</body>@keyframes reveal {
from { opacity: 0; clip-path: inset(0% 60% 0% 50%); }
to { opacity: 1; clip-path: inset(0% 0% 0% 0%); }
}
.revealing-image {
animation: auto linear reveal both;
animation-timeline: view();
animation-range: entry 25% cover 50%;
}En este caso hemos usado además la propiedad animation-range: entry 25% cover 50% para indicar en que momento debemos iniciar y finalizar la animación.
Referencias:
- https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations
- https://scroll-driven-animations.style/
Demos:
SOPORTE (a fecha de 2 Dic 2023)
Las transiciones de vista son una opción de diseño popular para reducir la carga cognitiva de los usuarios, ayudarlos a mantenerse en contexto y reducir la latencia de carga percibida a medida que se mueven entre estados o vistas de una aplicación.
La API View Transitions proporciona un mecanismo para crear fácilmente transiciones animadas entre diferentes estados DOM y al mismo tiempo actualizar el contenido DOM en un solo paso.
Referencias:
- https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API
- https://developer.chrome.com/docs/web-platform/view-transitions/
- https://stackdiary.com/view-transitions-api/
Demos:
- https://astro-records.pages.dev
- https://scroll-driven-animations.style/#demos
- https://http203-playlist.netlify.app/
SOPORTE (a fecha de 2 Dic 2023)
- Can I use
- Animista: Web para crear animaciones
- Transition: Web: Web para crear transiciones y animaciones
- Generador de curvas de Bezier
- Avatares
- Loaders
- MDN: Funciones de transformación
- OpenWebinars: Taller Animaciones CSS3
- Videotutorial de animaciones
- MDN - Animaciones basadas en desplazamiento
- Google - Animaciones basadas en desplazamiento
- Glassmorphism: una tendencia de diseño UX
- Video: Glassmorphism Login Form
- Video: Breve tutorial de transiciones y animaciones
- Video: Hamburger Menu Toggle - Only with CSS
- Video: Pure CSS Image Slider with Text animation & Dots indicator
- Video: Menú animado
- Video: Texto animado
- Video: Pure CSS Animated Text
- Video: Borde animado
- Video: Formulario SignUp / SignIn
- Video: Personalizar Checkbox
- Video: Personalizar Searchbox
- Video: Personalizar Search input
- Video: How to make 3D Flip Card with HTML and CSS
- Video: Happy New Year 2024 Text Animation
- Video: Happy New Year
- Video: Happy New Year
- Video: Cubo 3D animado
- Video: Cubo 3D animado con luz ambiente
- Video: Tarjeta con fondo semitransparente difuminado usando backdrop-filter: blur
- Video: Varias tarjetas con fondo semitransparente difuminado usando backdrop-filter: blur
- Video: Cómo ANIMAR Imágenes (Galería CSS GRID)
- Lista de videos: RETO 100 dias CSS
- Lista de videos: CSS Isométrico

