Zuviel Markup
heinetz
- css
- html
Hallo Forum,
ich habe hier das Verhalten zweier Content-Elemente im Viewport simuliert:
a) https://codepen.io/heinetz/pen/jQpBKZ
b) https://codepen.io/heinetz/pen/pQZbEg
Man sieht das beide Elemente sich konstruktionsbedingt unterschiedlich ausbreiten. Um diese Darstellung zu erreichen, braucht es um jedes Content-Element zusätzliches Markup. Ohne das zusätzlich Markup kann ich die Darstellung nur bis hierher annähern:
c) https://codepen.io/heinetz/pen/wQxddX
d) https://codepen.io/heinetz/pen/mQjmEw
Ist die Darstellung von a und b mit dem Markup aus c und d möglich? Mit Pseudoelementen vielleicht? Oder kommt man zumindest mit weniger Markup aus?
Was meint Ihr?
danke und
gruss, heinetz
(Edit by Rolf B: Links zu Links und Listen zu Listen gemacht)
Hallo heinetz,
Codepen a) ist falsch, da sind die divs nicht paarig. Aber das Extradiv kann man entfernen ohne das Ergebnis zu verändern.
Ansonsten sehe ich zwischen a) und c) keinen Unterschied.
Was ich angesichts der Demo-Eigenschaft ignoriere:
Worauf ich hinweisen möchte:
Bei c) und d) sehe ich nur den Unterschied, dass in d) die Margins des Content 1 fehlen, aber die hast Du ja auch nicht gesetzt.
Also - eigentlich ist deine Aufgabe doch von Dir gelöst - da ist kein unnötiges Markup mehr. Vielleicht die falschen Elemente, aber wie gesagt: das kann man erst bei Kenntnis des Usecase richtig stellen.
Rolf
@@heinetz
Was meint Ihr?
Na, da hast du uns ja ein schönes Rätsel zum Wochenanfang gestellt. Wobei das Rätsel nicht darin besteht umzusetzen, was du willst; sondern darin herauszufinden, was du willst.
Ich rate mal: Bei schmalem Viewport sollen manche Elemente (Bilder bspw.) über die volle Breite vom linken bis zum rechten Viewportrand gehen. Andere Elemente (Text) sollen links und rechts Abstand zum Viewportrand haben. Bei breitem Viewport sollen aber alle (Bilder und Texte) dieselbe Maximalbreite haben und horizontal zentriert sein.
Dafür brauchst du keine dreifach verschachtelten Elemente. Nur den Container und dessen Kinder. In meinem Beispiel sind das:
<figure>
<img/>
<figcaption>…</figcaption>
<footer>…</footer>
</figure>
Mit Grid ist das einfach gemacht: 3 Spalten, die linke und rechte gleich breit, mindestens 1rem (bspw.). Die mittlere Spalte höchtens 40rem (bspw.). Die Spaltenlinien erhalten sprechende Namen:
figure
{
display: grid;
grid-template-columns:
[full-start] minmax(1rem, 1fr)
[text-start] minmax(auto, 40rem)
[text-end] minmax(1rem, 1fr)
[full-end];
}
Bild über volle Breite:
figure > img
{
grid-column: full;
}
Text im Bereich zwischen den Linien text-start und text-end:
figcaption,
figure > footer
{
grid-column: text;
}
Ab einem Breakpoint wird das Bild auch durch die Linien text-start und text-end begrenzt:
@media (min-width: 42em)
{
figure > img
{
grid-column: text;
}
}
Fertig.
Anstatt die Breiten der Elemente von außen durch ein Grid festzulegen, kann man auch für die Elemente Breiten und Außenabstände angeben.
LLAP 🖖
hallo
Ist die Darstellung von a und b mit dem Markup aus c und d möglich? Mit Pseudoelementen vielleicht? Oder kommt man zumindest mit weniger Markup aus?
Klar
Dazu musst du einfach die sich verschieden zu verhaltenden Elemente mit verschiedenen Klassen bezeichnen, oder mit anderen Selektoren wie :nth-child() arbeiten.