Aller au contenu
Bibliotheque UIJABS

Mises en page expressives 10 variantes

Les mises en page qui sortent de la grille sage. Trois regles : on ne casse la grille qu'apres l'avoir posee (une asymetrie n'existe que par rapport a une regularite), un seul geste fort par page, et tout revient a une colonne sous 700 px. L'expressivite est un luxe de grand ecran, jamais au prix de la lisibilite sur telephone.

A. Grilles rompues

Grille asymetrique, debordement volontaire, superposition, bento, ecran partage.

Etude thermique7 colonnes
Devis5
Aides4
Pose par nos equipes salariees8 colonnes
Mise en service6, decale d'une colonne
Garantie5
Grille asymetrique

Douze colonnes, mais des blocs qui n'en occupent jamais le meme nombre. Le desequilibre est calcule : 7 / 5, puis 4 / 8, puis 6 / 6 decale.

Voir le codeMasquer le code
<div class="ex-asym">
  <div class="ex-b" style="--c:7;--t:#2b3a55"><b>Etude thermique</b><span>7 colonnes</span></div>
  <div class="ex-b" style="--c:5;--t:#5a4a6b"><b>Devis</b><span>5</span></div>
  <div class="ex-b" style="--c:4;--t:#8a5a4a"><b>Aides</b><span>4</span></div>
  <div class="ex-b" style="--c:8;--t:#2f5a45"><b>Pose par nos equipes salariees</b><span>8 colonnes</span></div>
  <div class="ex-b ex-b--dec" style="--c:6;--t:#3f5a7a"><b>Mise en service</b><span>6, decale d'une colonne</span></div>
  <div class="ex-b" style="--c:5;--t:#6b4a2a"><b>Garantie</b><span>5</span></div>
</div>
.ex-asym { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--sp-3); }
.ex-b {
  grid-column: span var(--c);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 108px;
  padding: var(--sp-4);
  border-radius: var(--r-md);
  background: var(--t);
  color: #fff;
}
.ex-b--dec { grid-column: 2 / span var(--c); }   /* raccourci complet : sinon le span est perdu */
.ex-b b { font-size: var(--fs-lg); font-weight: var(--fw-bold); line-height: 1.15; }
.ex-b span { margin-top: 4px; font-size: var(--fs-xs); opacity: .68; }
@media (max-width: 700px) { .ex-asym > * { grid-column: span 12 !important; grid-column-start: auto !important; } }
grid-cols-12 avec des col-span differents a chaque ligne

Le remplacement d'une chaudiere fioul par une pompe a chaleur reste l'operation la plus subventionnee du parc residentiel francais.

Maison de 112 m2 a Neuilly-sur-Marne, chantier d'aout 2026

Le montant de MaPrimeRenov depend du revenu fiscal de reference du foyer et de la zone climatique du logement, ce qui explique des ecarts importants d'un dossier a l'autre.

Debordement volontaire

Un element sort de la colonne de texte et va jusqu'au bord de l'ecran. Utilise une fois dans un article, il marque un changement de registre mieux qu'un intertitre.

Voir le codeMasquer le code
<div class="ex-deborde">
  <p>Le remplacement d'une chaudiere fioul par une pompe a chaleur reste l'operation la plus subventionnee du parc residentiel francais.</p>
  <figure class="ex-plein"><div class="ex-plein__img"></div><figcaption>Maison de 112 m2 a Neuilly-sur-Marne, chantier d'aout 2026</figcaption></figure>
  <p>Le montant de MaPrimeRenov depend du revenu fiscal de reference du foyer et de la zone climatique du logement, ce qui explique des ecarts importants d'un dossier a l'autre.</p>
</div>
.ex-deborde { max-width: 62ch; margin: 0 auto; overflow-x: clip; }
.ex-deborde p { margin: 0 0 var(--sp-5); font-size: var(--fs-lg); line-height: 1.7; color: var(--c-text-soft); }
.ex-plein {
  margin: 0 0 var(--sp-5);
  /* Sort de la colonne de texte sans dependre de la largeur de la fenetre :
     100cqw quand un conteneur est declare, sinon un debordement calcule. */
  width: calc(100% + var(--sp-12));
  margin-left: calc(var(--sp-12) / -2);
}
.ex-plein__img {
  aspect-ratio: 21 / 9;
  border-radius: var(--r-md);
  background: linear-gradient(140deg, #3f5a7a, #8a6a4a 55%, #c9a06a);
}
.ex-plein figcaption { margin-top: var(--sp-2); font-size: var(--fs-xs); color: var(--c-text-muted); text-align: center; }
@media (max-width: 700px) { .ex-plein { width: 100%; margin-left: 0; } }
w-screen relative left-1/2 -translate-x-1/2 sur un enfant de conteneur etroit
1 240 installations

depuis 2009 en Ile-de-France, par nos propres equipes, avec une note moyenne de 4,8 sur 312 avis.

Superposition

Deux blocs qui se chevauchent au lieu de se suivre. Le recouvrement cree une profondeur qu'aucune ombre ne remplace, et economise de la hauteur.

Voir le codeMasquer le code
<div class="ex-superpose">
  <div class="ex-superpose__img"></div>
  <div class="ex-superpose__carte">
    <b>1 240 installations</b>
    <p>depuis 2009 en Ile-de-France, par nos propres equipes, avec une note moyenne de 4,8 sur 312 avis.</p>
    <button class="btn btn--plein">Voir nos realisations</button>
  </div>
</div>
.ex-superpose { display: grid; grid-template-columns: 1fr 1fr; align-items: center; }
.ex-superpose__img {
  grid-area: 1 / 1 / 2 / 2;
  aspect-ratio: 4 / 3;
  border-radius: var(--r-lg);
  background: linear-gradient(140deg, #2b3a55, #5a4a6b 55%, #8a5a4a);
}
.ex-superpose__carte {
  grid-area: 1 / 1 / 2 / 3;
  justify-self: end;
  width: 62%;
  padding: var(--sp-6);
  border-radius: var(--r-lg);
  background: var(--c-surface);
  box-shadow: var(--sh-4);
  z-index: 1;
}
.ex-superpose__carte b { display: block; font-size: 30px; font-weight: 800; letter-spacing: -.03em; }
.ex-superpose__carte p { margin: var(--sp-2) 0 var(--sp-4); font-size: var(--fs-md); line-height: 1.6; color: var(--c-text-soft); }
@media (max-width: 700px) {
  .ex-superpose { grid-template-columns: 1fr; }
  .ex-superpose__img { grid-area: auto; }
  .ex-superpose__carte { grid-area: auto; width: 90%; justify-self: center; margin-top: -40px; }
}
grid-areas superposees, la carte demarre avant la fin de l'image
Pompe a chaleurAir/eau, air/air, de 6 a 16 kW
IsolationCombles, murs
Chauffe-eauThermodynamique
Entretien annuelContrat avec rappel automatique et rapport apres visite
DepannageSous 2 h
Bento

Une grille de tuiles de tailles inegales. Le piege est d'en faire un damier : il faut une tuile nettement dominante, sinon toutes se valent et aucune ne porte le message.

Voir le codeMasquer le code
<div class="ex-bento">
  <div class="ex-t ex-t--maitre" style="--t:#1f3350"><b>Pompe a chaleur</b><span>Air/eau, air/air, de 6 a 16 kW</span></div>
  <div class="ex-t" style="--t:#2f5a45"><b>Isolation</b><span>Combles, murs</span></div>
  <div class="ex-t" style="--t:#6b4a2a"><b>Chauffe-eau</b><span>Thermodynamique</span></div>
  <div class="ex-t ex-t--large" style="--t:#4a3560"><b>Entretien annuel</b><span>Contrat avec rappel automatique et rapport apres visite</span></div>
  <div class="ex-t" style="--t:#7a3f4a"><b>Depannage</b><span>Sous 2 h</span></div>
</div>
.ex-bento { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 118px; gap: var(--sp-3); }
.ex-t {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: var(--sp-4);
  border-radius: var(--r-lg);
  background: var(--t);
  color: #fff;
  overflow: hidden;
}
.ex-t--maitre { grid-column: span 2; grid-row: span 2; }
.ex-t--large  { grid-column: span 2; }
.ex-t b { font-size: var(--fs-lg); font-weight: var(--fw-bold); line-height: 1.15; }
.ex-t--maitre b { font-size: 26px; letter-spacing: -.02em; }
.ex-t span { margin-top: 4px; font-size: var(--fs-xs); opacity: .72; line-height: 1.4; }
@media (max-width: 700px) {
  .ex-bento { grid-template-columns: repeat(2, 1fr); }
  .ex-t--maitre { grid-column: span 2; grid-row: span 1; min-height: 150px; }
}
grid-cols-4 grid-rows-2 avec une tuile en col-span-2 row-span-2
Particuliers

Remplacement de chaudiere, pompe a chaleur, isolation. Aides deduites du devis.

Demander un devis
Professionnels

Contrats d'entretien de parc, interventions programmees, facturation mensuelle.

Nous contacter
Ecran partage

Deux moities autonomes, chacune avec son fond. Sert d'ouverture quand deux publics coexistent : le particulier et le professionnel, l'achat et la location.

Voir le codeMasquer le code
<div class="ex-partage">
  <div class="ex-partage__c" style="--t:#1f3350">
    <b>Particuliers</b>
    <p>Remplacement de chaudiere, pompe a chaleur, isolation. Aides deduites du devis.</p>
    <span class="btn btn--lg-verre">Demander un devis</span>
  </div>
  <div class="ex-partage__c" style="--t:#6b4a2a">
    <b>Professionnels</b>
    <p>Contrats d'entretien de parc, interventions programmees, facturation mensuelle.</p>
    <span class="btn btn--lg-verre">Nous contacter</span>
  </div>
</div>
.ex-partage { display: grid; grid-template-columns: 1fr 1fr; border-radius: var(--r-lg); overflow: hidden; }
.ex-partage__c {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--sp-3);
  align-items: flex-start;
  min-height: 240px;
  padding: var(--sp-8);
  background: var(--t);
  color: #fff;
  transition: flex var(--t-slow);
}
.ex-partage__c b { font-size: clamp(22px, 3.4vw, 34px); font-weight: 800; letter-spacing: -.03em; }
.ex-partage__c p { margin: 0; font-size: var(--fs-md); line-height: 1.6; opacity: .82; max-width: 34ch; }
@media (max-width: 700px) { .ex-partage { grid-template-columns: 1fr; } }
grid grid-cols-2 min-h-[420px] max-md:grid-cols-1

B. Mise en scene

Cartes empilees au defilement, comparateur avant / apres, galerie en desordre controle, section en diagonale, fond fixe.

Faites defiler

01Visite technique
02Devis et aides
03Pose
04Mise en service
Cartes empilees au defilement

Les cartes se collent les unes sur les autres en descendant. Chacune reste partiellement visible, ce qui donne le compte sans barre de progression.

Voir le codeMasquer le code
<div class="mv-scene mv-scene--haute" data-mv-scene>
  <p class="mv-indice">Faites defiler</p>
  <div class="mv-piste">
    <div class="ex-pile">
      <div style="--i:0;--t:#1f3350"><b>01</b><strong>Visite technique</strong></div>
      <div style="--i:1;--t:#2f5a45"><b>02</b><strong>Devis et aides</strong></div>
      <div style="--i:2;--t:#6b4a2a"><b>03</b><strong>Pose</strong></div>
      <div style="--i:3;--t:#4a3560"><b>04</b><strong>Mise en service</strong></div>
    </div>
  </div>
</div>
.ex-pile > div {
  position: sticky;
  top: calc(var(--i) * 16px);
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-height: 120px;
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background: var(--t);
  color: #fff;
  box-shadow: 0 -6px 24px rgba(0,0,0,.2);
}
.ex-pile > div + div { margin-top: var(--sp-4); }
.ex-pile b { font-family: var(--font-mono); font-size: var(--fs-sm); opacity: .55; }
.ex-pile strong { font-size: 22px; font-weight: 800; letter-spacing: -.02em; }
sticky top-[calc(var(--i)*14px)] avec un decalage croissant
Apres
Avant
Comparateur avant / apres

Le curseur revele l'une ou l'autre image. Plus convaincant que deux vignettes cote a cote, parce que le regard reste au meme endroit.

Voir le codeMasquer le code
<div class="ex-compare" data-ex-compare>
  <div class="ex-compare__apres"><span>Apres</span></div>
  <div class="ex-compare__avant" style="--x:52%"><span>Avant</span></div>
  <div class="ex-compare__poignee" style="--x:52%"><i></i></div>
  <input type="range" min="0" max="100" value="52" aria-label="Comparer avant et apres">
</div>
.ex-compare { position: relative; aspect-ratio: 16 / 9; border-radius: var(--r-lg); overflow: hidden; }
.ex-compare__apres, .ex-compare__avant { position: absolute; inset: 0; display: grid; place-items: end start; padding: var(--sp-4); }
.ex-compare__apres { background: linear-gradient(140deg, #2f5a45, #7aa88a 60%, #c9ddc4); }
.ex-compare__avant {
  background: linear-gradient(140deg, #4a4038, #7a6a5a 60%, #b0a495);
  clip-path: inset(0 calc(100% - var(--x)) 0 0);
}
.ex-compare span {
  padding: 5px 11px;
  border-radius: var(--r-full);
  background: rgba(10,12,18,.6);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
}
.ex-compare__apres span { justify-self: end; }
.ex-compare__poignee { position: absolute; top: 0; bottom: 0; left: var(--x); width: 2px; background: #fff; pointer-events: none; }
.ex-compare__poignee i {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 38px; height: 38px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 2px 10px rgba(0,0,0,.3);
}
.ex-compare__poignee i::before, .ex-compare__poignee i::after {
  content: "";
  position: absolute;
  top: 50%; margin-top: -4px;
  border: 4px solid transparent;
}
.ex-compare__poignee i::before { left: 7px; border-right-color: #333; }
.ex-compare__poignee i::after  { right: 7px; border-left-color: #333; }
.ex-compare input {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
}
clip-path: inset(0 calc(100% - var(--x)) 0 0) pilote par un input range
Facade
Combles
Local technique
Unite exterieure
Galerie en desordre controle

Des vignettes legerement pivotees et decalees, comme des tirages poses sur une table. Le desordre est regle au degre pres, jamais aleatoire a l'affichage.

Voir le codeMasquer le code
<div class="ex-desordre">
  <figure style="--r:-3deg;--y:8px"><div style="--t:linear-gradient(140deg,#4a6fa5,#c9d9e8)"></div><figcaption>Facade</figcaption></figure>
  <figure style="--r:2deg;--y:-10px"><div style="--t:linear-gradient(140deg,#a8643c,#f0d9b5)"></div><figcaption>Combles</figcaption></figure>
  <figure style="--r:-1.5deg;--y:14px"><div style="--t:linear-gradient(140deg,#3d6b4f,#c3ddc9)"></div><figcaption>Local technique</figcaption></figure>
  <figure style="--r:3.5deg;--y:-4px"><div style="--t:linear-gradient(140deg,#6b4a72,#ddc9dc)"></div><figcaption>Unite exterieure</figcaption></figure>
</div>
.ex-desordre { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--sp-4); padding: var(--sp-5) 0; }
.ex-desordre figure {
  margin: 0;
  width: 170px;
  padding: 9px 9px 0;
  background: var(--c-surface);
  border-radius: var(--r-sm);
  box-shadow: var(--sh-2);
  transform: rotate(var(--r)) translateY(var(--y));
  transition: transform var(--t-spring), box-shadow var(--t-base);
}
.ex-desordre figure:hover { transform: rotate(0) translateY(-6px) scale(1.04); box-shadow: var(--sh-4); z-index: 2; }
.ex-desordre div { aspect-ratio: 1; border-radius: 2px; background: var(--t); }
.ex-desordre figcaption { padding: 9px 2px; font-size: var(--fs-xs); color: var(--c-text-soft); text-align: center; }
rotate-[var(--r)] translate-y-[var(--y)] hover:rotate-0 hover:scale-105
Intervention sous 2 heures

Depannage 7 jours sur 7 en Seine-Saint-Denis, Val-de-Marne et est parisien.

Section en diagonale

Une bande inclinee qui traverse la page. Le contenu, lui, reste droit : c'est le fond qui penche, jamais le texte.

Voir le codeMasquer le code
<div class="ex-diag">
  <div class="ex-diag__fond" aria-hidden="true"></div>
  <div class="ex-diag__contenu">
    <b>Intervention sous 2 heures</b>
    <p>Depannage 7 jours sur 7 en Seine-Saint-Denis, Val-de-Marne et est parisien.</p>
  </div>
</div>
.ex-diag { position: relative; isolation: isolate; overflow: hidden; padding: var(--sp-10) var(--sp-6); border-radius: var(--r-lg); }
.ex-diag__fond {
  position: absolute;
  inset: -20% -10%;
  z-index: -1;
  background: linear-gradient(110deg, #1f3350 0 46%, #2f5a45 46% 100%);
  transform: skewY(-4deg);
}
.ex-diag__contenu { color: #fff; text-align: center; }
.ex-diag__contenu b { display: block; font-size: clamp(22px, 3.6vw, 36px); font-weight: 800; letter-spacing: -.03em; }
.ex-diag__contenu p { margin: var(--sp-2) auto 0; max-width: 44ch; font-size: var(--fs-md); opacity: .82; }
le fond en skew-y-[-3deg] scale-110, le contenu remis droit

Faites defiler

Le bloc suivant garde son fond immobile.

Depuis 2009

1 240 installations en Ile-de-France

Et la page reprend son cours.

Fond fixe au defilement

Le texte glisse par-dessus une image qui reste immobile. Effet ancien mais qui tient, a condition de ne l'employer qu'une fois et de garder le voile suffisant.

Voir le codeMasquer le code
<div class="mv-scene mv-scene--haute" data-mv-scene>
  <p class="mv-indice">Faites defiler</p>
  <div class="mv-piste">
    <p class="mv-note">Le bloc suivant garde son fond immobile.</p>
    <div class="ex-fixe">
      <div class="ex-fixe__contenu"><b>Depuis 2009</b><p>1 240 installations en Ile-de-France</p></div>
    </div>
    <p class="mv-note">Et la page reprend son cours.</p>
  </div>
</div>
.ex-fixe {
  display: grid;
  place-items: center;
  min-height: 260px;
  padding: var(--sp-8);
  border-radius: var(--r-lg);
  background-image:
    linear-gradient(rgba(10,14,22,.62), rgba(10,14,22,.62)),
    radial-gradient(circle at 25% 30%, #4a6fa5 0 24%, transparent 58%),
    radial-gradient(circle at 78% 65%, #a8643c 0 22%, transparent 56%),
    linear-gradient(150deg, #223047, #4a5b73);
  background-attachment: fixed, fixed, fixed, fixed;
  background-size: cover;
}
/* Le fond fixe est ignore sur iOS : le repli defile normalement. */
@supports (-webkit-touch-callout: none) { .ex-fixe { background-attachment: scroll; } }
.ex-fixe__contenu { text-align: center; color: #fff; }
.ex-fixe__contenu b { display: block; font-size: 40px; font-weight: 800; letter-spacing: -.035em; }
.ex-fixe__contenu p { margin: 6px 0 0; font-size: var(--fs-md); opacity: .82; }
bg-fixed avec un voile suffisant pour garder le texte lisible