Beispiel:CSS-calc-3.html

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

<!doctype html> <html lang="de"> <head>

 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Das letzte Kind im Grid</title>
 <link rel="stylesheet" media="screen" href="./Beispiel:Grundlayout.css">
 <style>
   body {
     font-family: sans-serif;
     max-width: 40rem;
     margin: auto;
     padding: .7rem;
   }
   section {
     margin-block: 2rem;
   }
   .grid {
     display: grid;
     grid-template-columns: repeat(2, 1fr);
     gap: 1rem;
   }
   .card {
     /*
       Die Karten können sich selbst zählen:
       sibling-index() ist die eigene Position.
       sibling-count() ist die Anzahl aller Karten.
       Daraus berechnen wir den Abstand zum Ende:
       Karte 1: 3 - 1 = 2 Schritte bis zum Ende
       Karte 2: 3 - 2 = 1 Schritt bis zum Ende
       Karte 3: 3 - 3 = 0 Schritte bis zum Ende
     */
     --distance-to-end: calc(sibling-count() - sibling-index());
     /*
       Jetzt machen wir daraus einen einfachen Schalter:
       - Die letzte Karte hat Abstand 0.
       - Nur bei ihr wird --is-last-card zu 1.
       - Bei allen anderen Karten bleibt --is-last-card 0.
     */
     --is-last-card: clamp(0, calc(1 - var(--distance-to-end)), 1);
     /*
       Für die Farbe brauchen wir denselben Schalter als Prozentwert:
       Normale Karte: 0 * 100% = 0%
       Letzte Karte:  1 * 100% = 100%
     */
     --last-card-color: calc(var(--is-last-card) * 100%);
     border: thin solid currentColor;
     /*
       Bei normalen Karten bleibt die Mischung bei #fffbf0.
       Bei der letzten Karte wechselt sie komplett zu ##ebf5d7.
     */
     background-color: color-mix(
       in srgb,
       #fffbf0 calc(100% - var(--last-card-color)),
       #ebf5d7 var(--last-card-color)
     );
     padding-inline: 1rem;
   }
   .card h3 {
   }
   .full-width-last .card {
     /*
       Normale Karten belegen 1 Spalte.
       Die letzte Karte belegt 2 Spalten.
       Nicht letzte Karte: span calc(1 + 0) = span 1
       Letzte Karte:       span calc(1 + 1) = span 2
     */
     grid-column: span calc(1 + var(--is-last-card));
   }
   .centered-half-last .card {
     /*
       Auch hier wird die letzte Karte zuerst auf eine eigene Zeile gesetzt,
       indem sie über beide Spalten läuft.
     */
     grid-column: span calc(1 + var(--is-last-card));
     justify-self: center;
     /*
       Normale Karten bleiben 100% breit.
       Die letzte Karte wird 50% breit.
       Nicht letzte Karte: 100% - 0 * 50% = 100%
       Letzte Karte:       100% - 1 * 50% = 50%
     */
     width: calc(100% - (var(--is-last-card) * 50%));
     box-sizing: border-box;
   }
 </style>

</head> <body>

Das letzte Kind im Grid

 <section>

Letztes Element über die ganze Breite

     <article class="card">

Karte 1

Position 1 von 3, also 2 Schritte bis zum Ende

     </article>
     <article class="card">

Karte 2

Position 2 von 3, also 1 Schritt bis zum Ende

     </article>
     <article class="card">

Karte 3

Position 3 von 3, also 0 Schritte bis zum Ende

     </article>
 </section>
 <section>

Letztes Element halb breit und zentriert

     <article class="card">

Karte 1

Position 1 von 3, also 2 Schritte bis zum Ende

     </article>
     <article class="card">

Karte 2

Position 2 von 3, also 1 Schritt bis zum Ende

     </article>
     <article class="card">

Karte 3

Position 3 von 3, also 0 Schritte bis zum Ende

     </article>
 </section>

</body> </html>