Afficher un élément comme un bloc
HTML
<div class="box">A</div>
CSS
.box { display: block; }
Propriétés courantes, utiles et avancées.
<div class="box">A</div>
.box { display: block; }
<div class="flex">
<div class="box">A</div>
</div>
.flex { display: flex; }
Variantes possibles : block, inline, flex, grid, contents.
<div class="row">
<div>A</div>
<div>B</div>
</div>
.row {
display: flex;
justify-content: space-between;
}
<div class="row-center">
<div>A</div>
<div>B</div>
</div>
.row-center {
display: flex;
align-items: center;
}
Variantes possibles : center, start, end, space-between.
<div class="grid">
<div>A</div>
<div>B</div>
</div>
.grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
<div class="grid-auto">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
.grid-auto {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
}
Variantes possibles : auto-fit, auto-fill.
<div class="grid-fluid">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
% .fr et rem">.grid-fluid {
display: grid;
grid-template-columns: 20% 1fr 15rem;
}
Mix possible : %, fr, rem, vw.
<div class="grid-minmax">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
.grid-minmax {
display: grid;
grid-template-columns: repeat(3, minmax(10rem, 1fr));
}
minmax() permet une largeur minimale + expansion fluide.
<div class="grid-clamp">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
.grid-clamp {
display: grid;
grid-template-columns: repeat(3, clamp(8rem, 20vw, 20rem));
}
clamp(min, idéal, max) = contrôle total.
<div class="grid-ratio">
<div>Sidebar</div>
<div>Contenu</div>
</div>
.grid-ratio {
display: grid;
grid-template-columns: 1fr 2fr;
}
<div class="grid-flow">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
.grid-flow {
display: grid;
grid-auto-flow: column;
grid-auto-columns: minmax(10rem, 1fr);
}
column = empile horizontalement, row = verticalement.
<div class="grid-dense">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
.grid-dense {
display: grid;
grid-auto-flow: dense;
}
dense = comble les trous automatiquement.
<div class="grid-areas">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="content">Contenu</main>
<footer class="footer">Footer</footer>
</div>
.grid-areas {
display: grid;
grid-template-columns: 1fr 2fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
<div class="grid-stretch">
<div>A</div>
<div>B</div>
</div>
.grid-stretch {
display: grid;
grid-template-columns: repeat(2, 1fr);
align-items: stretch;
justify-items: stretch;
}
stretch = comportement par défaut mais utile à rappeler.
<div class="grid-nowrap">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
.grid-nowrap {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
overflow-x: auto;
}
Simule un “carrousel” horizontal sans wrap.
<header class="sticky">Header</header>
.sticky {
position: sticky;
top: 0;
}
Variantes possibles : relative, absolute, fixed, sticky.
<div class="relative-box">
Parent
<div class="absolute-box">Badge</div>
</div>
.relative-box { position: relative; }
.absolute-box {
position: absolute;
top: 0;
right: 0;
}
Le parent doit être en position:relative pour que absolute fonctionne correctement.
<div class="relative-stretch">
<div class="absolute-stretch"></div>
</div>
.relative-stretch { position: relative; }
.absolute-stretch {
position: absolute;
inset: 0;
}
inset:0 = top:0 + right:0 + bottom:0 + left:0.
<div class="relative-center">
<div class="absolute-center">X</div>
</div>
.relative-center { position: relative; }
.absolute-center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
<div class="relative-center-modern">
<div class="absolute-center-modern">X</div>
</div>
.relative-center-modern { position: relative; }
.absolute-center-modern {
position: absolute;
inset: 0;
margin: auto;
width: 5rem;
height: 5rem;
}
Fonctionne si width + height sont définis.
<div class="overlay"></div>
.overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
}
Pattern universel pour modales, lightbox, menus.
<button class="btn-badge">Messages</button>
.btn-badge { position: relative; }
.btn-badge::after {
content: "";
position: absolute;
top: 0;
right: 0;
width: 0.6rem;
height: 0.6rem;
background: red;
border-radius: 50%;
}
<a href="#main" class="btn-fixed" aria-label="Remonter en haut">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640">
<path d="
M297.4 169.4C309.9 156.9 330.2 156.9 342.7 169.4L534.7 361.4C547.2
373.9 547.2 394.2 534.7 406.7C522.2 419.2 501.9 419.2 489.4
406.7L320 237.3L150.6 406.6C138.1 419.1 117.8 419.1 105.3
406.6C92.8 394.1 92.8 373.8 105.3 361.3L297.3 169.3z"/>
</svg>
</a>
.btn-fixed {
padding: 1vh 1vw;
cursor: pointer;
position: fixed;
bottom: 1rem;
right: 1rem;
display: flex;
align-items: center;
justify-content: center;
}
.btn-fixed svg {
width: 2vw;
height: auto;
fill: var(--color-dark);
}
Utilisé pour les boutons “remonter en haut”.
<div class="relative-move">Bloc</div>
.relative-move {
position: relative;
top: 1rem;
left: 1rem;
}
Déplace l’élément sans changer son espace réservé.
<div class="sticky-offset">Barre</div>
.sticky-offset {
position: sticky;
top: 2rem;
}
Reste collé après un certain décalage.
<div class="fixed-center">Modale</div>
.fixed-center {
position: fixed;
inset: 0;
margin: auto;
width: 10rem;
height: 10rem;
}
Idéal pour les modales centrées.
<div class="bg">A</div>
.bg {
background: #111;
}
<div class="bg-img"></div>
.bg-img {
background: url(img.jpg) center/cover no-repeat;
}
Variantes possibles : cover, contain, repeat.
<div class="bg-linear"></div>
.bg-linear {
background: linear-gradient(90deg, #ff0080, #00e0ff);
}
<div class="bg-radial"></div>
.bg-radial {
background: radial-gradient(circle, #ff0080, #111);
}
<div class="bg-conic"></div>
.bg-conic {
background: conic-gradient(from 0deg, #ff0080, #00e0ff, #ff0080);
}
<div class="bg-repeat-pattern"></div>
.bg-repeat-pattern {
background: repeating-linear-gradient(
45deg,
#000 0 5px,
#fff 5px 10px
);
}
<div class="bg-size"></div>
.bg-size {
background-image: url(img.jpg);
background-size: contain;
background-position: top left;
}
<div class="bg-multi"></div>
.bg-multi {
background:
linear-gradient(90deg, #ff0080, transparent),
url(img.jpg) center/cover no-repeat;
}
<div class="bg-fixed"></div>
.bg-fixed {
background: url(img.jpg) center/cover no-repeat;
background-attachment: fixed;
}
<div class="w">A</div>
.w { width: 100%; }
<div class="min-h">Bloc</div>
.min-h { min-height: 200px; }
Variantes possibles : width, height, min/max.
<div class="w-auto">Texte</div>
.w-auto { width: auto; }
<div class="max-w">Bloc</div>
.max-w { max-width: 60rem; }
<div class="h-fluid">Bloc</div>
.h-fluid { height: 100%; }
<div class="vh">Bloc</div>
.vh { height: 100dvh; }
<div class="box-clamp">Bloc</div>
.box-clamp {
width: clamp(10rem, 50vw, 40rem);
height: clamp(5rem, 20vw, 15rem);
}
<div class="box-calc">Bloc</div>
.box-calc {
width: calc(100% - 2rem);
height: calc(50vh - 4rem);
}
<div class="fit">Texte long</div>
.fit { width: fit-content; }
<div class="minmax">Bloc</div>
.minmax {
min-width: 10rem;
max-width: 40rem;
}
<img src="img.jpg" class="blur">
.blur {
-webkit-filter: blur(4px);
filter: blur(4px);
}
<div class="bright">Texte</div>
.bright {
-webkit-filter: brightness(1.2);
filter: brightness(1.2);
}
Variantes possibles : blur, brightness, contrast, saturate.
<div class="contrast">Texte</div>
.contrast {
-webkit-filter: contrast(1.4);
filter: contrast(1.4);
}
<div class="desaturate">Texte</div>
.desaturate {
-webkit-filter: grayscale(1);
filter: grayscale(1);
}
<div class="combo">Texte</div>
.combo {
-webkit-filter: blur(2px) brightness(1.1) contrast(1.2);
filter: blur(2px) brightness(1.1) contrast(1.2);
}
Les filtres se cumulent dans l'ordre d'écriture.
<div class="glass">Contenu</div>
.glass {
background: rgba(255, 255, 255, 0.15);
border: 1px solid rgba(255, 255, 255, 0.25);
-webkit-backdrop-filter: blur(10px) saturate(1.2);
backdrop-filter: blur(10px) saturate(1.2);
border-radius: 1rem;
}
Le glassmorphism nécessite backdrop-filter et son préfixe.
<div class="backdrop-blur">Texte</div>
.backdrop-blur {
background: rgba(0, 0, 0, 0.3);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
}
Le flou s’applique derrière l’élément, pas dessus.
<div class="frosted">Texte</div>
.frosted {
background: rgba(255, 255, 255, 0.2);
-webkit-backdrop-filter: blur(20px) brightness(1.3);
backdrop-filter: blur(20px) brightness(1.3);
}
Très utilisé pour les panneaux translucides modernes.
<p class="txt">Texte</p>
.txt { font-size: clamp(1rem, 2vw, 1.5rem); }
.txt { font-size: min(5vw, 2rem); }
.txt { font-size: max(2vw, 1rem); }
.txt { font-size: calc(1rem + 1vw); }
<p class="bold">Texte</p>
.bold { font-weight: 700; }
Variantes possibles : 100 → 900.
<p class="lh">Texte</p>
.lh { line-height: 1.5; }
Valeur sans unité = comportement idéal.
<p class="ls">Texte</p>
<p class="ls-tight">Texte</p>
.ls { letter-spacing: 0.05em; }
.ls-tight { letter-spacing: -0.02em; }
<p class="varfont">Texte</p>
.varfont { font-variation-settings: "wght" 600, "wdth" 90; }
<p class="italic">Texte</p>
<p class="oblique">Texte</p>
.italic { font-style: italic; }
.oblique { font-style: oblique 10deg; }
<p class="upper">Texte</p>
<p class="cap">Texte</p>
.upper { text-transform: uppercase; }
.cap { text-transform: capitalize; }
<p class="underline">Texte</p>
<p class="wavy">Texte</p>
.underline { text-decoration: underline; }
.wavy { text-decoration: underline wavy; }
<p class="nowrap">Texte</p>
<p class="prewrap">Texte</p>
.nowrap { white-space: nowrap; }
.prewrap {
white-space: pre-wrap;
}
<p class="ellipsis">Texte très long tronqué…</p>
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<div class="b">A</div>
.b { border: 1px solid #ddd; }
<div class="r">Bloc</div>
.r { border-radius: 8px; }
Variantes possibles : radius variable.
<div class="bw">Bloc</div>
.bw { border-width: 4px; }
<div class="bs">Bloc</div>
.bs { border-style: dashed; }
<div class="bc">Bloc</div>
.bc { border-color: #ff0080; }
<div class="bt">Top</div>
<div class="br">Right</div>
<div class="bb">Bottom</div>
<div class="bl">Left</div>
.bt { border-top: 3px solid #000; }
.br { border-right: 3px solid #000; }
.bb { border-bottom: 3px solid #000; }
.bl { border-left: 3px solid #000; }
<div class="radius-full">Rond</div>
<div class="radius-pill">Pill</div>
<div class="radius-asym">Asym</div>
.radius-full { border-radius: 50%; }
.radius-pill { border-radius: 9999px; }
.radius-asym { border-radius: 20px 0 40px 0; }
<div class="border-img">Bloc</div>
.border-img {
border: 10px solid transparent;
border-image: url(pattern.png) 30 round;
}
<div class="outline">Bloc</div>
.outline { outline: 3px solid #000; }
<div class="pixel-frame">A</div>
.pixel-frame {
box-shadow:
10px 0 0 #F0F0F0, 20px 0 0 #000, 30px 0 0 #F0F0F0,
0 10px 0 #F0F0F0, 10px 10px 0 #000, 20px 10px 0 #F0F0F0, 30px 10px 0 #000,
0 20px 0 #000, 10px 20px 0 #F0F0F0, 20px 20px 0 #000, 30px 20px 0 #F0F0F0,
0 30px 0 #F0F0F0, 10px 30px 0 #000, 20px 30px 0 #F0F0F0, 30px 30px 0 #000,
5px 5px 15px 5px rgba(0,0,0,0);
}
<div class="rot">A</div>
.rot {
-webkit-transform: rotate(10deg);
transform: rotate(10deg);
}
<div class="scale">A</div>
.scale {
-webkit-transform: scale(1.1);
transform: scale(1.1);
}
Variantes possibles : rotate, scale, translate.
<div class="transform-classic">Bloc</div>
.transform-classic {
transform:
perspective(600px)
translate(1rem, 1rem)
rotate(15deg)
skew(5deg, 2deg)
scale(1.2);
}
<div class="transform-xy">Bloc</div>
.transform-xy {
transform:
translateX(2rem)
translateY(1rem)
rotateX(20deg)
rotateY(15deg)
skewX(10deg)
skewY(5deg)
scaleX(1.2)
scaleY(1.1);
}
<div class="transform-3d">Bloc</div>
.transform-3d {
transform:
translateZ(30px)
translate3d(1rem, 0.5rem, 20px)
rotateZ(10deg)
rotate3d(1, 1, 0, 25deg)
scaleZ(1.1)
scale3d(1.1, 1.05, 1);
}
<div class="full-transform">Bloc</div>
.full-transform {
transform:
perspective(600px)
translate(1rem, 1rem)
translateX(1rem)
translateY(0.5rem)
translateZ(20px)
translate3d(1rem, 0.5rem, 10px)
rotate(12deg)
rotateX(20deg)
rotateY(10deg)
rotateZ(5deg)
rotate3d(1, 1, 0, 25deg)
skew(4deg, 2deg)
skewX(6deg)
skewY(3deg)
scale(1.1)
scaleX(1.2)
scaleY(1.1)
scaleZ(1.1)
scale3d(1.1, 1.05, 1);
}
<button class="btn">OK</button>
.btn {
transition: 0.2s;
}
<button class="btn-color">OK</button>
.btn-color {
transition: color 0.3s;
}
Variantes possibles : all, color, background.
.ease { transition: all 0.3s ease; }
.ease-in { transition: all 0.3s ease-in; }
.ease-out { transition: all 0.3s ease-out; }
.ease-in-out { transition: all 0.3s ease-in-out; }
.steps {
transition: all 0.4s steps(5);
}
.steps-start { transition: all 0.4s steps(5, start); }
.steps-end { transition: all 0.4s steps(5, end); }
.steps-jump-none { transition: all 0.4s steps(5, jump-none); }
.steps-jump-both { transition: all 0.4s steps(5, jump-both); }
.bezier {
transition: all 0.4s cubic-bezier(0.25, 1, 0.5, 1);
}
.delay {
transition: all 0.3s 0.2s;
}
.multi {
transition:
opacity 0.3s,
transform 0.4s ease-out,
background-color 0.2s;
}
.t {
transition: transform 0.3s;
}
.t:hover {
transform: scale(1.1);
}
.fade {
transition: opacity 0.3s;
}
.fade:hover {
opacity: 0.5;
}
.pseudo {
position: relative;
}
.pseudo::after {
content: "";
position: absolute;
inset: 0;
background: #000;
opacity: 0;
transition: opacity 0.3s;
}
.pseudo:hover::after {
opacity: 0.2;
}
.spring {
transition: all 0.5s cubic-bezier(0.25, 1.5, 0.5, 1);
}
.bounce {
transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.fast-in {
transition: all 0.4s cubic-bezier(0.9, 0, 1, 0.5);
}
.fast-out {
transition: all 0.4s cubic-bezier(0, 0.5, 0.1, 1);
}
.snap {
transition: all 0.25s steps(1, end);
}
.glitch {
transition: all 0.12s steps(3, jump-both);
}
.slow-fast {
transition: all 0.5s cubic-bezier(0.2, 0, 0.8, 1);
}
.fast-slow {
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.multi-speed {
transition:
opacity 0.2s ease-out,
transform 0.6s cubic-bezier(0.3, 1.4, 0.3, 1),
filter 0.4s ease-in;
}
.bg-gradient {
transition: background 0.6s cubic-bezier(0.25, 1, 0.5, 1);
}
.blur {
transition: filter 0.4s ease-in-out;
}
<div class="pulse">A</div>
@keyframes pulse {
to { transform: scale(1.1); }
}
.pulse { animation: pulse 1s infinite alternate; }
<div class="fade">A</div>
@keyframes fade {
to { opacity: 0; }
}
.fade { animation: fade 1s infinite alternate; }
Variantes possibles : scale, opacity, translate.
@keyframes move {
to { transform: translateX(20px); }
}
.ease {
animation: move 0.5s ease infinite alternate;
}
@keyframes jump {
to { transform: translateY(-10px); }
}
.steps {
animation: jump 0.6s steps(5) infinite;
}
@keyframes blink {
to { opacity: 0; }
}
.steps-start { animation: blink 0.6s steps(4, start) infinite; }
.steps-end { animation: blink 0.6s steps(4, end) infinite; }
.steps-jump-none { animation: blink 0.6s steps(4, jump-none) infinite; }
.steps-jump-both { animation: blink 0.6s steps(4, jump-both) infinite; }
@keyframes slide {
to { transform: translateX(30px); }
}
.bezier {
animation: slide 0.5s cubic-bezier(0.25, 1, 0.5, 1) infinite alternate;
}
@keyframes pop {
to { transform: scale(1.2); }
}
.delay {
animation: pop 0.4s ease 0.3s infinite alternate;
}
@keyframes rotate {
to { transform: rotate(360deg); }
}
.reverse { animation: rotate 2s linear infinite reverse; }
.alternate { animation: rotate 2s linear infinite alternate; }
@keyframes grow {
to { width: 200px; }
}
.fill {
animation: grow 1s forwards;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.pause {
animation: spin 2s linear infinite;
animation-play-state: paused;
}
@keyframes up {
to { transform: translateY(-10px); }
}
@keyframes fade2 {
to { opacity: 0.5; }
}
.multi {
animation:
up 0.5s ease-in-out infinite alternate,
fade2 1s linear infinite alternate;
}
@keyframes glow {
to { opacity: 1; }
}
.pseudo {
position: relative;
}
.pseudo::after {
content: "";
position: absolute;
inset: 0;
background: #000;
opacity: 0;
animation: glow 1s infinite alternate;
}
@keyframes tilt {
to { transform: rotate(10deg); }
}
.tilt {
animation: tilt 0.4s ease-in-out infinite alternate;
}
@keyframes reveal {
to { clip-path: inset(0 0 0 0); }
}
.clip {
clip-path: inset(0 100% 0 0);
animation: reveal 0.6s ease forwards;
}
@keyframes slide-bg {
to { background-position: 100% 0; }
}
.bg-anim {
background: linear-gradient(90deg, #ff0080, #00e0ff);
background-size: 200% 100%;
animation: slide-bg 2s linear infinite;
}
@keyframes cascade {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.cascade {
opacity: 0;
animation: cascade 0.6s ease forwards;
}
.cascade:nth-child(1) { animation-delay: 0.1s; }
.cascade:nth-child(2) { animation-delay: 0.2s; }
.cascade:nth-child(3) { animation-delay: 0.3s; }
.cascade:nth-child(4) { animation-delay: 0.4s; }
.cascade:nth-child(5) { animation-delay: 0.5s; }
<div class="stagger" style="--i:1">A</div>
<div class="stagger" style="--i:2">B</div>
<div class="stagger" style="--i:3">C</div>
<div class="stagger" style="--i:4">D</div>
@keyframes stagger {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.stagger {
opacity: 0;
animation: stagger 0.6s ease forwards;
animation-delay: calc(var(--i) * 0.1s);
}
<h2 class="txt-clip">Titre</h2>
.txt-clip {
background: linear-gradient(90deg, #ff0080, #00e0ff);
-webkit-background-clip: text;
color: transparent;
}
Le texte prend le dégradé du fond.
<h2 class="txt-img">Texte</h2>
.txt-img {
background: url("img.jpg") center/cover;
-webkit-background-clip: text;
color: transparent;
}
Le texte utilise une image comme texture.
<h2 class="txt-pattern">Pattern</h2>
.txt-pattern {
background: repeating-linear-gradient(45deg, #000 0 5px, #fff 5px 10px);
-webkit-background-clip: text;
color: transparent;
}
Idéal pour effets brutaux ou glitch.
<h2 class="txt-solid">Titre</h2>
.txt-solid {
background: #000;
-webkit-background-clip: text;
color: transparent;
opacity: 0.8;
}
Effet “ink” ou brutaliste simple.
<p class="txt-style">Un texte</p>
.txt-style {
font-family: "Arial Black", Gadget, sans-serif;
letter-spacing: -2px;
word-spacing: 2.4px;
color: #000000;
font-weight: 400;
text-decoration: overline;
font-style: normal;
font-variant: normal;
text-transform: capitalize;
}
<h2 class="txt-clip-anim">Titre</h2>
@keyframes clip-move {
to { background-position: 200% 0; }
}
.txt-clip-anim {
background: linear-gradient(90deg, #ff0080, #00e0ff, #ff0080);
background-size: 200% 100%;
background-position: 0 0;
-webkit-background-clip: text;
color: transparent;
animation: clip-move 3s linear infinite;
}
.of-hidden { overflow: hidden; }
.of-scroll { overflow: scroll; }
.of-auto { overflow: auto; }
.of-x {
overflow-x: scroll;
overflow-y: hidden;
}
.of-y {
overflow-y: scroll;
overflow-x: hidden;
}
.smooth { scroll-behavior: smooth; }
.snap-x { scroll-snap-type: x mandatory; }
.snap-item { scroll-snap-align: start; }
.snap-y { scroll-snap-type: y mandatory; }
.snap-item-y { scroll-snap-align: center; }
.no-bounce { overscroll-behavior: none; }
.mask {
-webkit-mask-image: linear-gradient(#000, transparent);
mask-image: linear-gradient(#000, transparent);
overflow: hidden;
}
.scrollbar {
scrollbar-width: thin;
scrollbar-color: #000 #e5e5e5;
}
.scrollbar::-webkit-scrollbar { width: 6px; }
.scrollbar::-webkit-scrollbar-thumb { background: #000; }
.scrollbar::-webkit-scrollbar-track { background: #e5e5e5; }
.cur-default { cursor: default; }
.cur-pointer { cursor: pointer; }
.cur-text { cursor: text; }
.cur-block { cursor: not-allowed; }
.cur-grab { cursor: grab; }
.cur-grabbing { cursor: grabbing; }
.cur-zoom { cursor: zoom-in; }
.cur-custom { cursor: url(cursor.svg) 0 0, auto; }
.mix-normal { mix-blend-mode: normal; }
.mix-multiply { mix-blend-mode: multiply; }
.mix-screen { mix-blend-mode: screen; }
.mix-overlay { mix-blend-mode: overlay; }
.mix-diff { mix-blend-mode: difference; }
.mix-excl { mix-blend-mode: exclusion; }
.mix-lighten { mix-blend-mode: lighten; }
.mix-darken { mix-blend-mode: darken; }
.bg-blend { background-blend-mode: multiply; }