CSS - Parte 2 (20231016)
CSS - Parte 2 (20231016)
Parte 2: CSS
Avanzado
BLOQUE 1: Desarrollo web en
cliente - HTML y CSS
Módulo: Desarrollo de Interfaces Web
Ciclo: Desarrollo de Aplicaciones Web
Curso: 2023 – 2024
Profesora: Rosa Medina
Tema 2: CSS Avanzado
Índice
1. Funciones matemáticas CSS.............................................................................................................4
2. Variables en CSS..............................................................................................................................5
3. Colores CSS......................................................................................................................................7
3.1. Función hwb()...........................................................................................................................7
3.2. Función lab() y oklab().............................................................................................................7
3.3. Función lch() y oklch().............................................................................................................8
3.4. Función color() y color-mix()...................................................................................................9
4. Unidades CSS.................................................................................................................................10
4.1. Unidades absolutas.................................................................................................................10
4.2. Unidades relativas...................................................................................................................10
4.3. Unidades que dependen del viewport.....................................................................................11
5. Imágenes y objetos.........................................................................................................................11
5.1. Propiedad object-fit.................................................................................................................12
5.2. Propiedad object-position.......................................................................................................12
5.3. Propiedad object-view-box.....................................................................................................12
5.4. Propiedad image-rendering.....................................................................................................12
5.5. Propiedad image-orientation...................................................................................................13
5.6. Propiedad aspect-ratio.............................................................................................................13
6. Propiedad opacity...........................................................................................................................13
7. Gradientes o degradados.................................................................................................................13
7.1. Gradientes lineares, linear-gradient........................................................................................13
7.1.1. Dirección del gradiente...................................................................................................14
7.1.2. Posición del color............................................................................................................14
7.1.3. Inicio y final del color.....................................................................................................14
7.1.4. Propiedad repeating-linear-gradient................................................................................15
7.2. Gradientes radiales, radial-gradient........................................................................................15
7.3. Gradientes cónicos, radial-gradient........................................................................................15
8. Selectores CSS................................................................................................................................16
8.1. :is()..........................................................................................................................................16
8.2. :where()...................................................................................................................................17
8.3. :has().......................................................................................................................................17
8.4. :not()........................................................................................................................................17
9. Reglas CSS - at-rules......................................................................................................................18
9.1. @import..................................................................................................................................18
9.2. @layer.....................................................................................................................................19
9.3. @supports...............................................................................................................................20
9.4. Minificación............................................................................................................................21
10. StyleLint.......................................................................................................................................21
10.1. Características de StyleLint..................................................................................................22
10.2. Cómo instalar StyleLint........................................................................................................22
10.3. Configuración.......................................................................................................................23
10.4. Integración StyleLint en VSCODE.......................................................................................24
11. CSS Nesting nativo.......................................................................................................................26
12. Sombras y efectos con CSS..........................................................................................................28
12.1. Propiedad filter.....................................................................................................................28
12.2. Sombras idénticas CSS.........................................................................................................28
12.3. Modos de fusión CSS...........................................................................................................28
Una vez llegados a este punto donde hemos repasado los contenidos de HTML y
CSS vistos en el curso pasado, ha llegado el momento de aprender las nuevas
características y funcionalidades que tiene CSS y que antes si queríamos beneficiarnos
de algunas de ellas teníamos que usar preprocesadores como LESS o Sass.
Con la función clamp, podemos indicar un valor específico con una unidad relativa
pero a la que quieres establecer un mínimo y un máximo.
.element {
width: clamp(100px, 25%, 300px);
height: 200px;
background: red;
}
El ejemplo anterior, el width sería como si hubiéramos puesto: width: max(100px, min(25%,
300px));. Primero calcula el mínimo, a continuación coge el máximo entre el 100px y el
resultado anterior.
A continuación, vamos a ver la función round, a esta función le pasaremos el valor y el
redondeo.
.element {
width: round(124.75px, 1px); /* Devuelve 125px */
width: round(124.75px, 10px); /* Devuelve 120px */
width: round(124.75px, 100px); /* Devuelve 100px */
width: round(124.75px, 0.1px); /* Devuelve 124.7px */
}
blockquote::after {
display: block;
content: ' (source: ' attr(cite) ') ';
color: hotpink;
}
Nos va a mostrar por pantalla el valor del atributo cite que tenga ese blockquote
2. Variables en CSS
Hace unos años, la única forma que teníamos para guardar valores de CSS era
mediante preprocesadores como LESS o Sass, a día de hoy tenemos las custom
properties que nos permite asignar un valor a una propiedad y poderlo utilizar en múltiples
partes del documento, de tal forma que si debemos cambiar su valor, se cambia 1 vez y
no en tantas líneas como sitios hemos asignado ese valor a dicha propiedad.
¿Cómo declaramos una variable en css y cómo la utilizamos? Para declarar una
variable en CSS utilizaremos los --previos al nombre que le vamos a dar. Además,
debemos fijarnos en el elemento en el cual nos vamos a crear la variable. Veamos un
ejemplo:
:root {
--main-bg-color: brown;
}
.first {
--background-color: purple;
}
.child {
background: var(--background-color, blue);
}
En el anterior ejemplo definimos la variable --background-color, de tal forma que los dos
primeros child serán negro (clase parent e hijos), el primer elemento child se sobreescribe
por purple (al aplicarse .first), y el tercer elemento child no va a tener ninguna variable
definida (está fuera de parent) y por tanto pasará a tener el color blue.
3. Colores CSS
En el siguiente punto, vamos a ver algunas de las nuevas funciones que dispone
CSS para asignar color a un elemento.
La función oklab es una mejora de la función lab, es una función útil para:
• Transformar una imagen en escala de grises sin cambiar la luminosidad
• Modificar la saturación de los colores mientras el usuario sigue teniendo la misma
percepción de color e iluminación
La función oklch es como la función lch() pero con una pequeña mejora, como
pasaba con la función lab y oklab. Los parámetros que recibe la función lch (l c h [/alfa])
son:
• l: es la luminosidad negro-blanco, un valor entre 0% y 100% o un número entre 0 y
100.
• c: corresponde a la saturación, un valor entre 0% y 100% o un número entre 0 y
0.4
• h: corresponde al tono de color, un ángulo entre 0deg y 360deg o un número sin
unidades.
.elemento {
background-color: oklch(0.5 0.3 50);
background-color: oklch(0.5 0.3 50 / 75%);
}
4. Unidades CSS
Al trabajar con CSS podemos observar la multitud de unidades que utilizamos, ya
sea px, %, deg, etc. Vamos a ver los tipos de unidades que podemos utilizar en CSS.
.container {
width: 50vmin; /* Si el navegador ocupa 800x600(ancho x alto), estamos diciendo que el
contenedor ocupe de ancho la mitad de 600, es decir 300px*/
height: 50vmax; /* Si el navegador ocupa 800x600(ancho x alto), estamos diciendo que el
contenedor ocupe de alto la mitad de 800, es decir 400px*/
}
.container {
width: 50vi; /* Equivale a 50vw, ya que inline es la dirección horizontal */
height: 50vb; /* Es la dirección vertical */
}
Las unidades anteriores son relativas al viewport, pero si queremos que sean
relativas al contenedor usaremos la letra cq delante, es decir, cqw, cqh, cqmin, cqmax,
cqi ó cqb.
5. Imágenes y objetos
En ocasiones, nos interesa poder adaptar ciertos objetos como imágenes, vídeos u
otros a nuestra web. Para ello, vamos a ver ciertas propiedades CSS que nos permiten
modificar estos elementos y adaptarlos al estilo que deseamos.
6. Propiedad opacity
Mediante esta propiedad, podemos dar una transparencia total o parcial sobre el
elemento indicado y todos los elementos hijos que tiene. La propiedad opacity se puede
dar o bien en procentaje (0% completamente transparente, 100% completamente visible)
o bien un número del 0 al 1, donde 0 es completamente transparente y 1 completamente
visible.
7. Gradientes o degradados
7.1. Gradientes lineares, linear-gradient
Los gradientes más conocidos o más fáciles son los gradientes lineales, donde
tenemos una transición progresiva entre dos colores. La sintaxis es la siguiente:
• linear-gradient (color, color, …): gradiente de colores hacia abajo
• linear-gradient (dirección, color, color, …): gradiente con dirección específica
• linear-gradient (dirección, color tamaño, color tamaño, …): gradiente indicado
dónde comienza a cambiar el color
• linear-gradient (dirección, color tamaño tamaño, color tamaño tamaño , …):
gradiente indicando el inicio y final de cada color.
Por ejemplo, si queremos crear un degradado con los colores azul – rojo desde
arriba hacia abajo sería:
.element {
background-image: linear-gradient(blue, red);
}
El ejemplo anterior sería un ejemplo básico, vamos a ver un poco más el resto de
parámetros que le podemos decir a esta propiedad.
7.1.4.Propiedad repeating-linear-gradient
Si en lugar de utilizar la función linear-gradient usamos repeating-linear-gradient
podemos hacer que el patrón de colores se repita de forma continua. El navegador se va
a encargar de repetirlos hasta que no quede más espacio en el html seleccionado.
que puede tomar esta función son: radial-gradient([forma] [tamaño] [at ubicación], color
[inicio] [fin], color [inicio] [fin], …).
El gradiente básico sería al que le indicamos sólo los colores, luego el gradiente
circular o elíptico, dejando paso al gradiente con posición. Veamos unos ejemplos:
.element {
/* Modalidad básica */
background: radial-gradient(gold, red, black);
/* Gradiente elíptico */
background: radial-gradient(ellipse, gold 50%, red 55%, black 75%);
/* Gradiente circular */
background: radial-gradient(circle 200px, gold 50%, red 55%, black 75%);
/* Gradiente circular con posición */
background: radial-gradient(circle 400px at left, gold 50%, red 55%, black 75%);
}
Como podemos ver, el primer parámetro corresponde a la forma del gradiente radial
que queremos, donde si es circular se le puede dar un tamaño y si es elíptica le podemos
indicar su tamaño también (ancho y alto). El tamaño puede ser un valor fijo, o la palabras
reservadas farthest-corner (hasta la esquina más lejana, valor por defecto), closest-
corner (esquina más cercana), farthest-side (hasta el lado más lejano), closest-side
(hasta el lado más cercano).
A cualquiera de las formas del gradiente le podemos indicar su posición específica,
para ello haremos uso de la palabra reservada at seguido de center, top, left, right,
bottom, top left, top right, bottom left, bottom right.
Indicar que como el linear-gradient, tenemos la posibilidad de repetir el gradiente
circular, para ello haremos uso de la función repeating-radial-gradient.
8. Selectores CSS
Con el objetivo de reutilizar código, es muy común el agrupar selectores
separándolos por comas. Por ejemplo, imaginad que tenemos dos o más bloques con las
mismas propiedades, lo corrector para no duplicar el código sería agruparlo:
h1{
color: blue;
}
.especial{
color: blue;
}
Dejándolo:
h1, .especial{
color: blue;
}
A demás de esta combinación, en CSS tenemos la posibilidad de utilizar
combinadores lógicos, es decir, aquellos que nos permiten seleccionar elementos que
cumplen unas determinadas restricciones y funcionan como si se tratase de una
pseudoclase. Estos combinadores lógicos tienen la peculiaridad que sí se les puede pasar
parámetros ya que son de tipo pseudoclase funcional. Los combinadores lógicos que
podemos utilizar son:
8.1. :is()
Mediante la pseudoclase :is() podemos escribir selectores complejos de forma más
compacta. Esta función recibe como argumentos una lista de selectores, y selecciona
cualquier elemento que pueda ser seleccionado por un selector de esa lista. Esta
pseudoclase antes se llamó :matches() y :any(). Veamos un ejemplo donde podemos
abreviar una combinación de selectores
.container .list, .container .menu,.container ul {
...
}
Se podría abreviar por:
.container :is(.list, .menu, ul) { /* Donde abreviamos mucho en estos casos */
...
}
8.2. :where()
La pseudoclase :where() recibe como argumento una lista de selectores y selecciona
cualquier elemento que pueda ser seleccionado por un selector de esa lista. Pero,¿En
qué se diferencia entonces con el selector :is() que hemos visto justo arriba? La diferencia
se encuentra con la especificidad, donde :is() tiene por especificidad su valor más alto
y :where() en cambio es 0.
.container :is(.list, .menu, ul) { /* Donde abreviamos mucho en estos casos */
...
}
8.3. :has()
La pseudoclase :has() selecciona un elemento precedido, si sus hijos cumplen una
serie de criterios. Veamos un ejemplo:
a:has(>img) { /* Se aplica sobre el enlace a sólo si en el interior existe una etiqueta img */
...
}
O por ejemplo
h1:has(+p) { /* Selecciona un encabezados h1 con un párrafo que inmediatamente vaya seguido por un encabezado
h1 de forma inmediata y aplica estilo a h1*/
...
}
8.4. :not()
La pseudoclase :not() nos permite seleccionar todos los elementos que no cumplan
los criterios indicados en sus parámetros.
p:not(.general) {
...
}
En este ejemplo vemos que todos los párrafos que no pertenezcan a la clase
general se les aplicará dicho estilo.
9.1. @import
La regla @import nos permite importar reglas desde otras hojas de estilo. Estas
reglas se suelen incluir al principio del fichero. La sintaxis de esta regla puede ser de las
siguientes cinco formas:
@import url [list-of-media-queries];
@import url media query;
@import url supports(condición);
@import url layer(nombre);
donde la url es el recurso a importar, pudiendo ser tanto una ruta absoluta como
relativa. media query es una hoja css que se importará si coincide con el media query.
layer con esta sintaxis importamos la hoja css y se pone o bien en la capa nombre (si lo
especificamos), o en una nueva capa anónima. supports con esta sintaxis se importa el
css siempre y cuando el navegador soporte la condición indicada.
El fichero css a importar puede ir entre comillas o bien utilizando la función url() de
css. Veamos un ejemplo:
@import url("fineprint.css") print;
@import 'custom.css';
@import "common.css" screen, projection;
@import url('landscape.css') screen and (orientation:landscape);
@import "https://developer.mozilla.org/static/css/main.11730cda.css";
9.2. @layer
La regla @layer nos permite declarar una capa de cascada, es decir, nos permite
agrupar código CSS en el interior de una capa para a posteriori unirlo manteniendo el
orden o precedencia especificado en el caso de múltiples capas.
@layer special {
.item {
color: rebeccapurple;
}
}
La forma de crear estas capas puede ser utilizando @layer o incluso @import.
Vamos a ver las distintas formas:
@layer
@layer nombre;
@ layer nombre.subcapa;
@ layer nombre1, nombre2, nombre3...;
@ import (url) layer(nombre);
Cuando le damos un nombre a una capa, estamos indicando el orden de las capas
(orden por el que se han definido), y por tanto será el orden por el que se va a evaluar
salvo que se modifique.
Podemos cambiar como hemos dicho el orden de las capas, para ello, usaremos la
regla @layer seguida de las capas que queremos reordenar separadas por comas y antes
de ser declaradas. Ejemplo:
@layer special {
.item {
color: rebeccapurple;
}
}
@layer base {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
}
}
9.3. @supports
La regla @supports de CSS nos permite usar fragmentos de código sólo cuando se
cumplen ciertas condiciones. Con esta funcionalidad podemos hacer que en el caso de no
soportar el navegador una característica poder aplicar un css diferente.
La sintaxis de esta regla es: @supports [not] (condiciones) donde las condiciones
irán anidadas por los operadores and y or. Veamos un ejemplo:
@supports not (display: grid) and (display: flex) {
.content {
display: flex;
justify-content: center;
}
}
Los estilos de la clase .content que hemos usado en el ejemplo anterior serán
aplicados para aquellos navegadores que no soporten la propiedad display grid pero sí flex.
Lo correcto en estos casos sería tener un css genéricos, y usar esta regla para
aquellos navegadores que sí soporten ciertas características.
.content {
display: inline-block;
}
@supports (display: grid) {
.content {
display: grid;
grid-template-columns: 1fr;
justify-content: center;
}
}
9.4. Minificación
Con el término minificación se entiende a la acción de eliminar comentarios, y otros
caracteres (saltos de línea, espacios) de un archivo (por ejemplo css o js). El objetivo de
reducir código es para conseguir descargarlo más rápido aun perdiendo legibilidad.
Cuando creamos un archivo minificado es habitual conservar el original para a
posteriori utilizarlo para modificaciones, etc. teniendo por tanto siempre dos archivos. Uno
llamado estilos.css por ejemplo, y otro estilos.min.css que será el que pongamos en
nuestra etiqueta link.
Podemos encontrar múltiples herramientas para minificar CSS, donde además nos
permite suprimir propiedades repetidas, eliminar valores inútiles, etc. Los más habituales
son: CSS Nano, Clean CSS, CSSO, HTML Minifier Tertser, entre otros.
10. StyleLint
StyleLint es un tipo de herramienta linter para detectar code smell, es decir, es una
herramienta encargada de comprobar posibles problemas y/o malas prácticas de nuestro
código.
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x
nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
Una vez tengamos npm instalado pasaremos a instalar StyleLint con el comando:
10.3. Configuración
Nos creamos un proyecto npm en nuestro directorio de trabajo:
npm init -y
Dentro del archivo que hemos creado incluimos las siguientes líneas.
{
"extends": "stylelint-config-standard"
}
Con esto le estamos diciendo que lea la configuración base del paquete que
instalamos antes (stylelint-config-standard), por lo que ya debería funcionar nuestro linter
con las reglas básicas que están definidas en este paquete. Podemos añadir otra
configuración además del stylelint-config-standard, se pueden añadir más paquetes de
configuración.
Dentro del proyecto npm que nos hemos creado, vamos a crear el directorio src con
los archivos index.html e index.css por ejemplo, y en el archivo css ponemos (con los
saltos de línea incluidos):
.container{
font-family: Corbel;
display: flex;
}
Con el anterior comando lo que estamos haciendo es decirle que me muestre los
posibles errores de código que podamos tener en nuestro archivo css, ya sea de
indentación, etc.
Si queremos que los corrija solos, ejecutaríamos el comando anterior pero con la
opción --fix, es decir:
npx stylelint rutaCSS --fix
Como vemos, nos corrige los errores a excepción de la fuente genérica que nos dice
que pongamos la que queramos por defecto.
{
...
"css.validate": false,
"scss.validate": false,
"less.validate": false,
"stylelint.enable": true,
"[css]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "stylelint.vscode-stylelint"
},
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": true
},
}
.item {
height: 150px;
background: orangered;
}
}
Mediante este ejemplo, podemos ver que los estilos de container(clase padre) están
dentro de .item(clase hijo) haciendo que el código quede más claro y más organizado.
Vamos a ir poco a poco aprendiendo su sintaxis ya que será la misma que usaremos en
Sass.
La sintaxis que hemos visto en el ejemplo anterior es la más sencilla y sirve para
casos simples, pero en muchas ocasiones debemos usar el selector &.
Cuando hacemos uso del operador & , estamos haciendo referencia al padre
(inmediato) del anidamiento, lo cual puede ser en ciertos casos realmente útil.
Por ejemplo, imaginad que queremos seleccionar cualquier elemento div que está
dentro de container.
.container {
background: grey;
& div {
background: orangered;
}
}
En el ejemplo anterior, sin & es imposible de realizar con Nesting, ya que la sintaxis
simple (sin &) no permite colocar elementos directos que no sean clases, id,
combinadores, etc.
Veamos otro ejemplo donde es necesario usar el operador &
.container {
background: grey;
&:hover
background: orangered;
}
}
Si no ponemos el operador &, el código sería válido pero no equivalente ya que sería
como poner .container : hover en lugar de .container:hover. Es decir, estaríamos aplicando los
estilos a todos los elementos :hover que hay dentro de .container en lugar de al propio
.container.
.item & {
background: green;
height: 100px;
}
}
Con este ejemplo, estamos haciendo que el selector sea .item .container , es decir, los
elementos .item que contengan al padre. Además, también nos permite hacer anidaciones
menos directas pero que pueden ser interesante por su relación con el elemento
contenedor.
Veamos un ejemplo:
.container {
width: 800px;
height: 300px;
background: grey;
.item & .item & { } /* Equivalente a -> .item .container .item .container */
:is(.page, .menu) & {} /* Equivalente a -> .page .container, .menu .container */
:not(&) { } /* Equivalente a -> :not(.container) */
}
Todo esto nos va a permitir organizar y mantener mejor nuestro código.
Podemos utilizar nesting también para anidar reglas CSS como @media, @supports,
@layer, @scope
o @container consiguiendo una organización de nuestro código de forma
compacta.
Es equivalente a:
.div {
clip-path: inset(50px 50px 50px 50px);
border-radius: 20px 20px 20px 20px;
}
12.4.2. circle
Para el caso de la función circle, nos permite crear círculos, o semicirculos. Su
sintaxis es circle(size at X Y), donde crearía un circulo con un tamaño (size) con el centro
en x, y.
.div {
clip-path: circle(50% at 50% 50%);
}
12.4.3. ellipse
En este caso, la función ellipse funciona exactamente igual que el círculo pero
teniendo en cuenta el ancho (sX) y el alto (sY). Su sintaxis es ellipse(sX sY at x y)
.div {
clip-path: ellipse(50% 25% at 50% 50%);
}
12.4.4. polygon
La función polygon es una de las formas básicas más potentes ya que nos permite
crearla a partir de las coordenadas que le demo. Su sintaxis es polygon(x y, x y, ...), crean
un polígono siguiendo las coordenadas indicadas.
.div {
clip-path: polygon(0 5, 100% 0, 50% 100%);
}
12.4.5. path
Si queremos algo más flexible y potente tenemos la función path donde podemos
crear un trayecto SVG haciendo formas más complejas. La sintaxis es path(coordenadas),
Crea una forma basada en un trayecto SGV
.div {
clip-path: path("m4,87l93,0l29,-84l29,84l93,0l-76,52l29,84l-76,-52l-76,52l29,-84l-76,-52z");
}
Además de estos, podemos utilizar una modalidad llamada media query range
syntax que no es más que el uso de los operadores matemáticos(=, <, <=, >, >=) que
conocemos y que nos harán nuestro código más legible y fácil de interpretar.
@media only screen and (320px <= width <= 480px) and (resolution = 150dpi) {
body {
line-height: 1.4;
}
}
Por último, indicar que si queremos tener para cada dispositivo un archivo css
diferente, podemos hacer uso a la etiqueta link en el html con la condición media.
<link rel="stylesheet" href="mobile.css" media="(max-width: 640px)">
<link rel="stylesheet" href="tablet.css" media="(min-width: 640px) and (max-width: 1280px)">
<link rel="stylesheet" href="desktop.css" media="(min-width: 1280px)">
los contenedores (normal | size | inline-size), donde usaremos size para indicar que serán
elementos de bloque o inline-size para elementos en línea.
Otra opción de esta propiedad es usar container: nombreContenedor / tipoContenedor
y nos estaríamos ahorrando las dos declaraciones anteriores.
Una vez que tenemos el contenedor definido haríamos uso de la regla @container de
la siguiente forma: @container nombreContenedor (<condiones>), como podemos observar es muy
parecida a la sintaxis de los media queries.
.container{
container: parent;
}
@container parent (max-width: 500px) {
body {
line-height: 1.4;
}
}
Cuando estamos usando la regla container podemos utilizar las unidades de los
container query como son: cqw(porcentaje relativo al ancho del contenedor),
cqh(porcentaje relativo al alto del contenedor), cqi(porcentale relativo al tamaño en línea),
cqb(porcentaje relativo al tamaño en bloque), cqmin(porcentaje más pequeño entre cqi y
cqb) o cqmax(porcentaje mayor entre cqi y cqb). El objetivo es que si desconocemos el
tamaño concreto del contenedor aplicamos con estas medidas un porcentaje de su
tamaño. Es decir, que si ponemos 50cqw estamos diciendo que se le va a dar un tamaño
del 50% de ancho del contenedor. Funcionan de forma parecida a las unidades vistas
anteriormente vw, vh, vmin y vmax.
}
Otra de las características que podemos usar dentro de las preferencias de usuario
es conocer si el usuario prefiere eliminar o desactivar las animaciones o transiciones.
Para ello, dentro de la regla @media miraremos si en prefers-reduced-motion tiene los valores
no-preference o reduce.
.animated {
animation: var(--preferred-animation, hard) 2s linear infinite;
}
Al tener la característica de prefers-reduced-motion desactivada(reduce) estamos diciendo
que la animación sea soft, o podríamos poner animation-name a none para que no haya.
a:hover{
transition: margin-right 2s ease-in-out .5s;
}
a:hover{
transition-property: margin-right;
transition-duration: 2s;
transition-timing-function: ease-in-out;
transition-delay: .5s;
}
14.2. Animaciones
Las transiciones como hemos visto es una forma de suavizar un cambio, las
animaciones se busca lo mismo pero permitiendo añadir más estados. Para crear
animaciones necesitamos hacer uso de la propiedad animation y definir con la regla
@keyframes la animación y sus estados.
Como transition hay una propiedad que engloba todas las propiedades de animation y
esta es: animation: <name> <duration> <timing-function><delay><interation-count><direction><fill-
mode><play-state>. Veamos cada una de ellas poco a poco.
14.2.1. animation-name
Nombre de la animación a aplicar para uno o más @keyframe(o none en el caso de no
querer aplicar ninguna animación). El nombre de la animación debemos ponerlo en
kebab-case, es decir, primer carácter una minúscula y los espacios serán guiones.
14.2.2. animation-duration
Esta propiedad nos permite establecer la duración de una animación. Es importante
indicarle las unidades (segundos o milisegundo).
14.2.3. animation-timing-function
Esta propiedad, nos permite establecer el ritmo que llevará la animación, de la
misma forma que en las transiciones, los valores que puede tener esta propiedad los
podéis encontrar aquí.
14.2.4. animation-delay
Esta propiedad nos permite establecer el retardo con el que empezará la animación
14.2.5. animation-interation-count
Con esta propiedad podemos indicar el número de veces que queremos que se
repita una determinada animación, este valor puede ser un número o infinite si queremos
que se repita continuamente.
14.2.6. animation-direction
Con esta propiedad podemos poner el orden en el que se van a producir los
fotogramas. Los valores que puede tener esta propiedad son: normal (desde el primero al
último), reverse (del último al primero), alternate (en interaciones par se reproducen
normal, en impares como reverse), alternate-reverse (en interaciones par se reproducen
como reverse, en impares como normal)
14.2.7. animation-fill-mode
La propiedad animation-fill-mode nos permite establecer una animación antes y
después de acabar (salvo si está marcada como infinite). Con esto podemos establecer
qué debe hacer la animación cuando no se está reproduciendo. Los valores que puede
tomar son: none, backwards (la animación debe tener aplicados los estilos del fotograma
inicial antes de empezar), forwards (la animación debe tener los estilos del fotograma
aplicados al final), both(se aplica tanto backwards como forwards).
14.2.8. animation-play-state
Con esta propiedad podemos decirle a la animación que se pause (paused) o que se
reproduzca (running). Esta propiedad tiene sentido si se combina con algo de JS.
De la misma forma que con las transiciones, podemos tener animaciones múltiples o
incluso animaciones en cascada.
@keyframes nombre {
from {
propiedad: valor;
}
to {
propiedad: valor;
}
}
Donde el nombre será el nombre que utilicemos para identificar a los fotogramas de
una animación, es recomendable utilizar la nomenclatura kebab-case. Dentro del from(0%)
pondremos todos los estilos a aplicar antes de comenzar la animación, y dentro del
to(100%) irá los estilos finales. La palabra reservada from y to puede ser reemplazada por
el %, es decir, el valor que ocupa ese estilo dentro de la animación, al igual que podemos
insertar nuevos porcentajes como señal de fotogramas intermedios.
Veamos un ejemplo sencillo donde el nombre de la animación será importante, y
pasa de un fotograma donde el color (del texto en este caso) es de color rojo, y acaba
siendo negro.
@keyframes importante {
from { color: red; text-transform: uppercase; } /* Primer fotograma */
to { color: black; text-transform: none; } /* Segundo y último fotograma */
}
Recuerda que una vez que hemos definido el @keyframes, hay que asociarlo al
elemento html al que se lo queremos aplicar.
.txt-imp{
animation: importante 2s ease 0s infinite;
}
Si tenemos fotogramas que van a utilizar los mismos estilos que uno anterior,
siempre podemos separarlos por comas y así poder aprovechar ese código.
Una de las propiedades que tiene transform es transform-origin, que nos permite
cambiar el punto de origen de una transformación. Para ello le indicaremos la posiciónX
posiciónY.
15.1. Translaciones
La función de translación consiste en mover un elemento de un lugar a otro. La
sintaxis de la propiedad translate es la distancia de x e y (opcionalmente z). Si queremos
hacer una translación en 3D, debemos indicar también la distancia en el eje Z. Veamos un
ejemplo:
img {
transform: translate(10%, 10%);
/* Es equivalente a lo de arriba */
transform: translateX(10%) translateY(10%);
}
Como vemos estamos usando la función translateX(size), pero podemos usar también
translateY(size), translateZ(size), translate(x, y), translate(X), translate3d(x, y, ,z)
15.2. Rotaciones
Una rotación consiste en girar un elemento en un eje específico. Para ello usaremos
la propiedad transform de css y la función rotate, donde del mismo modo que con translate
podemos emplear las funciones: rotateX(angleX), rotateY(angleY), rotateZ(angleZ), rotate(angleZ),
rotate3d(x, y, z, grados) .
img {
transform: rotateX(30deg) rotateY(20deg) rotateZ(10deg);
}
img {
rotate: 45deg; /* Equivale a transform: rotateZ(45deg); */
rotate: x 45deg; /* Equivale a transform: rotateX(45deg); */
rotate: y 120deg; /* Equivale a transform: rotateY(120deg); */
rotate: 0 0 1 45deg; /* Equivale a transform: rotateZ(45deg); */
rotate: 1 0 0 15deg; /* Equivale a transform: rotateX(15deg); */
rotate: 0 1 1 5deg; /* Equivale a transform: rotateY(5deg) rotateZ(5deg); */
rotate: 1 1 1 5deg; /* Equivale a transform: rotateX(5deg) rotateY(5deg) rotateZ(5deg); */
}
15.3. Escalado
Cuando queremos aumentar o disminuir el tamaño de una imagen tenemos la
función scale que nos permite modificar el tamaño de un elemento. Las distintas funciones
de escalado que tenemos son: scaleX(num), scaleY(num), scaleZ(num), scale(numX, numY), scale(numX),
scale3d(numX, numY, numZ) .Veamos un ejemplo, donde duplicamos anchura y reducimos a la
mitad la altura:
img {
transform: scale(2, 0.5);
}
Como pasa con rotate, tenemos la propiedad scale en los nuevos navegadores de
forma que no es necesario usar la propiedad transform. La propiedad scale acepta los
siguientes valores:scale: none | numXY | numX numY| numX numY numZ. Donde los será none si no
queremos que se escale, un número que será una escala para el ejeX y para el ejeY,
cuando damos dos valores será la escala que coja al ejeX, y ejeY, y cuando damos tres
valores será el valor de escalar cada eje.
#box1:hover {
scale: 1.25;
/* Equivale a poner */
scale: 1.25 1.25;
}
15.4. Deformaciones
Si queremos retorcer o inclinar un elemento 2d tenemos la posibilidad de usar la
función skew. skewX(anguloX), skewY(anguloY), debemos tener cuidado porque la función skew
como tal está marcada como obsoleta, por tanto, mejor usarla por separado cada eje.
15.5. Transformaciones a 3D
Como hemos visto, hay muchas funciones que nos dan la posibilidad de realizar
transformaciones 3d (otras no, como es el caso de las deformaciones).
Antes de utilizar las transformaciones 3d, es importante conocer alguna de las
propiedades que han sido derivadas de las transformaciones como es transform-style: flat
| preserve-3d y transform-origin: posX posY posZ.
Mediante la función transform-style podemos modificar el tratamiento de los elementos
hijos, donde por defecto está establecido a flat (es decir, los trata como elementos 2d), si
queremos que los trate como elementos 3d debemos darle el valor preserve-3d. La
función transform-origin cambia el punto de origen del elemento en una transformación.