Il est possible d'utiliser des opérateurs de comparaison comme =, >, <, >= ou <= pour les Media Queries.
/* Quand le viewport est entre 400px et 1000px */
@media (min-width: 400px) and (max-width: 1000px) {
}
/* La même chose avec la nouvelle syntaxe */
@media (400px <= width <= 1000px) {
}
En savoir plus sur le support sur Can I Use
Les propriétés translate, rotate, et scale permettent de remplacer l'utilisation de la propriété transform.
.box-1 {
scale: 1.5;
/* transform: scale(1.5); */
}
.box-2 {
translate: 50px 100px 200px;
/* transform: translate3d(50px, 100px, 200px); */
}
.box-3 {
rotate: y 90deg;
/* transform: rotateY(90deg); */
}
La propriété inset est une propriété raccourcie pour définir top, right, bottom, et/ou left. On peut mettre plusieurs valeurs comme les propriétés margin ou padding.
.box {
position: absolute;
/* top: auto; right: 20px; bottom: 20px; left: auto */
inset: auto 20px 20px auto;
}
En savoir plus sur le support sur Can I Use
La pseudo-class :placeholder-shown permet de cibler les input et textarea qui ont un attribut placeholder.
input:placeholder-shown {
background-color: ivory;
border: 1px solid darkorange;
}
La règle text-overflow: ellipsis permet de rogner du texte et affiche une ellipse (...).
À noter que l'ellipse est ajoutée à l'intérieur du box model, et réduit donc la quantité de texte affichée.
Dans l'exemple j'ai mis une largeur fixe et un overflow: hidden pour cacher le texte qui dépasse.
.text {
width: 100px;
overflow: hidden;
text-overflow: ellipsis;
border: 1px solid;
}
Aujourd'hui je me suis rendu compte que je ne connaissais pas bien la différence entre une transition et une animation CSS.
Une transition permet d'animer le changement d'un état A à un état B d'un élément, et il faut un déclencheur comme un hover.
Une animation offre plus de possibilités comme la création d'images clés avec les keyframes, les boucles, et n'ont pas besoin de déclencheur.
Par défaut tous les éléments HTML sont en inline, c'est la feuille de style du navigateur qui précise quels éléments sont en display: block, on peut le voir sur resource://gre-resources/html.css (à ouvrir sur Firefox uniquement).
On peut voir ceci dans la feuille de style :
/* blocks */
article,
aside,
details,
div,
dt,
figcaption,
footer,
form,
header,
hgroup,
html,
main,
nav,
section,
summary {
display: block;
}
La propriété accent-color permet de changer la couleur par défaut des éléments suivants :
<input type="checkbox"><input type="radio"><input type="range"><progress>
input[type=range] {
accent-color: rebeccapurple;
}
En savoir plus sur le support sur Can I Use
La propriété outline ne fait pas partie du box model, elle a en quelque sorte le même comportement que la propriété box-shadow.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pellentesque scelerisque suscipit.
Il est possible d'animer les propriétés outline-offset et outline-color, au focus ou au hover.
L'ordre des fonctions utilisées sur la propriété transform a une importance. Les fonctions sont lues de la gauche vers la droite.
.square-1 {
transform: rotate(90deg) translateX(50%);
transform-origin: 100% 100%;
}
.square-2 {
transform: translateX(50%) rotate(90deg);
transform-origin: 100% 100%;
}
Les sélecteurs class et id ne peuvent pas commencer par un chiffre. Par exemple .1-item ou #1-item sont invalides.
La fonction hsl() permet une meilleure gestion des couleurs qu'avec une valeur héxadécimale ou avec la fonction rgb().
La fonction prend 3 valeurs :
- la teinte (la couleur qui sera un angle du cercle des couleurs)
- la saturation (la quantité de couleur)
- la luminosité (la quantité de noir ou de blanc)
div {
background-color: hsl(180, 100%, 50%);
}
La propriété text-decoration est en fait une propriété raccourcie des propriétés suivantes :
text-decoration-colortext-decoration-linetext-decoration-styletext-decoration-thickness
Il est possible de cumuler les valeurs underline, overline et même line-through sur la propriété text-decoration-line. Ça sert à rien mais on peut le faire.
.text {
text-decoration-line: underline overline line-through;
text-decoration-style: wavy;
text-decoration-color: darkorchid;
}
Le "defaulting" est une étape importante de la phase d'analyse CSS par le navigateur. Elle consiste à attribuer une valeur aux propriétés non définies, ça peut être la valeur initiale ou la valeur héritée. Une seule ligne de CSS en cache en réalité plusieurs.
html {
font: 16px Helvetica Neue;
}
/* La règle ci-dessus sera transformée en.. */
html {
font-style: normal;
font-variant-caps: normal;
font-variant-ligatures: normal;
font-variant-numeric: normal;
font-variant-east-asian: normal;
font-weight: normal;
font-stretch: normal;
font-size: 16px;
line-height: normal;
font-family: "Helvetica Neue";
}
Il est possible de dynamiser le contenu des pseudo-éléments en CSS grâce aux attributs HTML et à la fonction CSS attr().
<button class="btn" data-before="😺">Bouton</button>
.btn::before {
content: attr(data-before);
}
Par défaut un élément en display: block n'a pas une width de 100% mais auto.
Même si les fonctions rgba() et hsla() existent, il tout de même possible de définir de la transparence sur des couleurs avec les fonctions rgb() et hsl().
Il faut néanmoins séparer les valeurs par une ,, ou mettre un / avant la transparence.
div {
background-color: rgb(255, 255, 255, .5);
background-color: rgb(255 255 255 / .5);
color: hsl(212, 100%, 62% / .5);
color: hsl(212 100% 62% / .5);
}
Il est possible de faire une Media Query pour cibler les appareils sur lesquels le survol d'élément est possible.
@media (hover: hover) {
button:hover {
background-color: #3b98ff;
}
}
Le code ci-dessus empêche donc le "hover accidentel" sur les appareils tactiles :
L'utilisation de la propriété float a été détournée pour la construction de mise en page complexe, aujourd'hui ce n'est plus utile de s'en servir car qu'il y a Flexbox et Grid. Mais la propriété reste encore utile pour faire ce pourquoi elle existe à la base : retirer un élément du flux normal, et faire en sorte que le texte et les autres éléments inline entourent cet élément.
.item {
float: left;
margin-right: 5px;
width: 120px;
height: 120px;
background-color: #3b98ff;
}
Il est possible d'animer la propriété z-index.
.box {
z-index: 1;
animation: mymove 5s infinite linear;
}
@keyframes mymove {
50% {
z-index: 5;
}
}
Quand on met un z-index sur un élément, on crée un Stacking Context qui affecte également les éléments enfant de cet élément.
<header>Header</header>
<main>
<button>Bouton</button>
</main>
header {
position: relative;
z-index: 2;
}
main {
position: relative;
/* Le z-index affecte aussi le bouton */
z-index: 1;
}
main button {
position: relative;
/* Le bouton ne peut pas se placer au-dessus du <header> */
z-index: 9999;
}
Malgré un z-index très élevé, le bouton ne pourra pas se placer au-dessus du header.
La pseudo-classe :is() cible tous les sélecteurs qui lui sont passés en argument. Cela permet d'écrire du code CSS plus concis lorsqu'il faut cibler plusieurs éléments.
article h1,
article p,
article a {
color: #fff;
}
/* La même chose avec :is() */
article:is(h1, p, a) {
color: #fff;
}
Aujourd'hui je me suis rendu compte que je n'étais pas capable d'expliquer clairement la différence entre une pseudo-classe et un pseudo-élément.
Dire que la différence se fait au niveau de la syntaxe n'est pas suffisant : on utilise normalement : pour les pseudo-classes et :: pour les pseudo-éléments.
Mais il est possible d'utiliser : sur un pseudo-élément aussi, comme ceci : :before.
Pour bien comprendre la différence entre les deux il faut se dire que :
- avec un pseudo-élément : on crée un élément
- avec une pseudo-classe : on ne fait que sélectionner un élément, on ne crée rien
Par exemple avec ::before ou ::after on crée un élément.
Même avec le pseudo-élément ::first-letter, on pourrait penser que l'on ne crée pas un élément et qu'on cible seulement la première lettre, mais cet élément n'existe pas avant d'être crée par le pseudo-élément, c'est un peu comme si on englobait la première lettre dans une balise.
Alors qu'avec la pseudo-classe :nth-child on sélectionne/cible un élément existant, on ne crée rien.
Lors de de la phase d'analyse CSS par le navigateur, l'étape du "resolving" consiste à transformer les unités relatives comme auto, em, rem ou encore vh en unités absolues.
C'est aussi valable pour les mots clés small, normal, ou bold.
Il est possible de détecter si l'utilisateur à choisi de réduire/désactiver les animations depuis les paramètres de son système d'exploitation. Il est important de prendre en compte ce choix et de le respecter, par exemple avec le code ci-dessous, l'animation est désactivée si l'utilisateur ne souhaite pas d'animations.
.animation {
animation: vibrate 0.3s linear infinite both;
}
@media (prefers-reduced-motion: reduce) {
.animation {
animation: none;
}
}
La propriété resize permet de rendre un élément redimensionnable. Cependant il faut que cet élément ne soit pas de type inline ou block avec un overflow: visible.
Il est possible d'indiquer en valeur la direction du redimensionnement.
.element {
width: 200px;
min-width: 100px;
max-width: 500px;
overflow: hidden;
resize: horizontal;
}
La pseudo-classe :empty permet de sélectionner les éléments qui n'ont aucun enfant.
Cela peut-être utile pour cibler des éléments dont l'accès est difficile. On peut s'en servir pour masquer des messages d'erreur vides ou des tags vides.
<ul>
<li>tag A</li>
<li>tag B</li>
<li>tag C</li>
<li></li>
<li></li>
</ul>
ul li:empty {
display: none;
}
:empty- tag A
- tag B
- tag C
:empty- tag A
- tag B
- tag C
La pseudo-classe :target permet de cibler l'unique élément (s'il existe) dont l'attribut id correspond au fragment d'identifiant de l'URL.
Par exemple, si l'URL est "https://www.swebdev.fr#section-1", alors "#section-1" est le fragment d'idientifiant.
<a href="#section-1">Première section</a>
<a href="#section-2">Deuxième section</a>
<section id="section-1">...</section>
<section id="section-2">...</section>
section:target {
outline: 2px dashed #3b98ff;
}
Par défaut la propriété box-shadow prend la couleur par défaut de l'élément sur lequel elle est appliquée.
.box {
color: #3b98ff;
box-shadow: 0px 0px 10px;
}