A legjobb módja a “Wrapper” CSS implementálásának

Néha az első HTML-elem, amit egy új dokumentumba írunk, egy olyan elem, amely minden mást beburkol az oldalon. Erre szokták használni a wrapper kifejezést. Adunk neki egy osztályt, és ez az osztály felelős az oldalon lévő összes vizuális elem beburkolásáért.

Azzal mindig is küzdöttem, hogy mi a legjobb módja a megvalósításnak. Találtam egy kapcsolódó témát a StackOverflow-n, amelynek több mint 250.000 megtekintése van, tehát nyilván nem én vagyok az egyetlen, aki csodálkozik! A legfrissebb gondolataimat ebben a cikkben foglalom össze.

Mielőtt belemerülnénk, először vizsgáljuk meg a “wrapper” és a “container” közötti különbséget.

“Wrapper” vs “Container”

Hiszem, hogy van különbség a wrapper és a container elemek között.

A programozási nyelvekben a container szót általában olyan struktúrákra használják, amelyek egynél több elemet tartalmazhatnak. A wrapper ezzel szemben olyasvalami, ami körbeölel egy objektumot, hogy több funkcionalitást és felületet biztosítson neki.

Az én véleményem szerint tehát van értelme a két különböző elnevezésnek, mert különböző funkciókat szánnak.

A wrapperről szólva, általában egy <div>-re gondolunk, ami tartalmazza a dokumentum összes többi HTML elemét. Biztos vagyok benne, hogy sokan éltünk már át olyan időszakot, amikor ezt 960px szélességűre állítottuk be, és középre igazítottuk az összes fő tartalmunkat. A wrappereket olyan dolgokra is használják, mint például egy ragadós lábléc alkalmazása.

A konténer viszont általában másfajta elszigetelést szándékozik. Olyat, amely néha több komponens viselkedésének vagy stílusának megvalósításához szükséges. Az elemek szemantikai és vizuális csoportosítását szolgálja. A Bootstrapnek például vannak “konténer osztályai”, amelyek a rácsrendszerüknek adnak otthont, vagy különböző más komponenseket tartalmaznak.

A wrapper és a konténer kifejezések a fejlesztőtől és a szándékától függően ugyanazt is jelenthetik. Más konvenciók is létezhetnek, így a legjobb tanács általában az, hogy azt alkalmazzuk, aminek a legtöbb értelme van számunkra. De ne feledje, a névadás a fejlesztői tevékenység egyik legalapvetőbb és legfontosabb része. Az elnevezési konvenciók olvashatóbbá és kiszámíthatóbbá teszik a kódunkat. Válassz körültekintően!

Itt egy példa egy általános oldalcsomagolásra:

/** * 1. Centers the content. Yes, it's a bit opinionated. * 2. See the "width vs max-width" section * 3. See the "Additional Padding" section */.wrapper { margin-right: auto; /* 1 */ margin-left: auto; /* 1 */ max-width: 960px; /* 2 */ padding-right: 10px; /* 3 */ padding-left: 10px; /* 3 */}

width vs max-width

A blokkszintű elem width beállítása megakadályozza, hogy az elem a konténerének szélére nyúljon ki (jó például az olvasható sorhosszúság szempontjából). Ezért a wrapper elem a megadott szélességet fogja elfoglalni. A probléma akkor jelentkezik, ha a böngészőablak keskenyebb, mint a wrapper adott szélessége. Ilyenkor vízszintes görgetősáv jelenik meg, ami szinte mindig nem kívánatos.

A max-width használata helyette ebben a helyzetben jobb a keskenyebb böngészőablakok esetében. Ez akkor fontos, ha egy webhelyet kis eszközökön is használhatóvá teszünk. Íme egy jó példa a probléma bemutatására.

Lásd a Pen CSS-Tricks: The Best Way to Implement a CSS Wrapper by Kaloyan Kosev (@superKalo) on CodePen.

A reszponzivitás szempontjából a max-width a jobb választás!

Additional Padding

Sok fejlesztővel találkoztam, akik elfelejtettek egy bizonyos éles esetet. Tegyük fel, hogy van egy wrapperünk, amelynek max-width értéke 980px. Az edge case akkor jelenik meg, ha a felhasználó eszközének képernyőszélessége pontosan 980px. A tartalom ekkor pontosan a képernyő széleihez tapad, és nem marad lélegzetvételnyi hely.

A “nem marad lélegzetvételnyi hely” probléma.

A széleken általában szeretnénk egy kis kitömést. Ezért ha egy 980px teljes szélességű wrappert kell megvalósítanom, akkor így csinálnám:

.wrapper { max-width: 960px; /* 20px smaller, to fit the paddings on the sides */ padding-right: 10px; padding-left: 10px; /* ... */}

Ezért lehet jó ötlet padding-left és padding-right hozzáadása a wrapperhez, különösen mobilon.

Vagy fontolja meg a dobozméret használatát, hogy a kitöltés egyáltalán ne változtassa meg a teljes szélességet.

Melyik HTML-elemet válassza

A wrappernek nincs szemantikai jelentése. Egyszerűen csak megtartja az oldalon lévő összes vizuális elemet és tartalmat. Ez csak egy általános konténer. A szemantika szempontjából a <div> a legjobb választás. A <div> szintén nem rendelkezik szemantikai jelentéssel, és csak egy általános konténer.

Elgondolkodhatunk azon, hogy esetleg egy <section> elem megfelelhetne erre a célra. A W3C specifikációja azonban a következőket mondja:

A <section> elem nem egy általános konténerelem. Ha egy elemre csak stilisztikai célokból vagy a szkriptelés kényelme miatt van szükség, a szerzőknek ajánlott helyette a div elemet használniuk. Általános szabály, hogy a section elem csak akkor megfelelő, ha az elem tartalma explicit módon szerepelne a dokumentum vázlatában.

A <section> elem saját szemantikát hordoz. A tartalom tematikus csoportosítását jelenti. Az egyes szakaszok témáját azonosítani kell, jellemzően egy címsor (h1-h6 elem) beillesztésével a szakasz elem gyermekeként.

A szakaszokra példák lehetnek a fejezetek, a különböző füles oldalak egy füles párbeszédpanelben, vagy egy szakdolgozat számozott szakaszai. Egy webhely kezdőlapját fel lehetne osztani a bevezető, a hírek és az elérhetőségek szakaszaira.

Ez első látásra talán nem tűnik túl nyilvánvalónak, de igen! A sima régi <div> illik a legjobban egy wrapperhez!

A <body> tag használata vs. Egy további <div>

Meg kell említeni, hogy lesznek olyan esetek, amikor a <body> elemet használhatjuk wrapperként. A következő megvalósítás tökéletesen működni fog:

body { margin-right: auto; margin-left: auto; max-width: 960px; padding-right: 10px; padding-left: 10px;}

És eggyel kevesebb elemet eredményez a jelölésedben, mert így elhagyhatod azt a felesleges wrapper <div> elemet.

A rugalmasság és a változásokkal szembeni rugalmasság miatt azonban ezt nem javasolnám. Képzeld el, ha a projekt egy későbbi szakaszában a következő forgatókönyvek bármelyike bekövetkezik:

  • Kényszerítened kell, hogy a lábléc a dokumentum végére “tapadjon” (a nézetablak aljára, ha a dokumentum rövid). Még akkor is, ha a legmodernebb módot használhatod – flexbox-szal, szükséged van egy további <div> wrapperre.
  • Az egész oldal background-color-jét kell beállítanod. Normális esetben bármilyen hátteret állítasz be a <body> elemen, az úgy fog viselkedni, mintha a <html> elemen lenne beállítva, ha annak még nincs háttere. Csak egy furcsa dolog a CSS-ben. De ha a <html> elemednek már van háttere, és a testet valami másra állítod be, és a testnek bármilyen távolsági megkötése van, a háttér furcsa lesz. Ez egy trükkös dolog.

Azt a következtetést vonnám le, hogy még mindig az a legjobb gyakorlat, ha van egy további <div> a CSS wrapper megvalósításához. Így ha a specifikációs követelmények később megváltoznak, nem kell később hozzáadni a wrappert, és nem kell a stílusok áthelyezésével foglalkozni. Végül is csak egy extra DOM-elemről van szó.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.