CSS menü szélesség
Sziasztok!
Egy apró, de számomra mégis elég nagy problémába ütköztem.
Adott az alábbi html és css kód.Így egy két soros menüt kapok. Az eredeti kódban ha ráviszem a főmenüben az egyik elemre a kurzort akkor akkor egy másik almenü jelenik meg(nem hiszem, hogy a probléma szempontjából releváns volna). és a probléma az, hogy ha az almenü tartalma szélesebb a főmenü eleménél, akkor megnő a hozzá tartozó főmenü elemének a szélesség is így a tovább főmenü elemek is eltolódnak.
Eddig rendben is volna, meg kéne határoznom a a főmenü elemek szélességét, de én ezt nem nagyon szeretném mert nem túl szép megoldás.
Tudtok rá valami elegánsabb módszert?
Segítségeteket előre is köszönöm
Bence
■ Egy apró, de számomra mégis elég nagy problémába ütköztem.
Adott az alábbi html és css kód.
<div>
<ul>
<li>
<a href="#">menü1</a>
</li>
<li>
<a href="#">menü2</a>
<ul>
<li>
<a href="#">almenü1</a>
</li>
<li>
<a href="#">almenü2</a>
</li>
<li>
<a href="#">almenü3</a>
</li>
</ul>
</li>
<li>
<a href="#">menü3</a>
</li>
</ul>
</div>
div>ul>li{
float:left;
}
div>ul>li>ul>li{
float: left;
}
Eddig rendben is volna, meg kéne határoznom a a főmenü elemek szélességét, de én ezt nem nagyon szeretném mert nem túl szép megoldás.
Tudtok rá valami elegánsabb módszert?
Segítségeteket előre is köszönöm
Bence
div>ul>li{ float:left;
Probléma
Nálam nem, de mi lenne, ha
Ezeken a böngészőkön kipróbáltam:
Chrome/26.0 működik
MSIE 10.0 nem működik
Valahogy
Műkdik
Gyerekválasztó
div li
, a másodiknál pedigdiv li li
, szebb, egyszerűbb, gyorsabb.Köszi
Gyorsabb?
Azt is tegyük hozzá, hogy a két fajta selector egészen mást jelent. Tehát a
div li
nem csak adiv>ul>li
-re illeszkedik, hanem adiv>ol>li
-re, vagy még rengeteg más szerkezetre is, ami nem biztos, hogy cél. Adiv li li
pedig még több variációra fog illeszkedni, ami az idő előrehaladtával egyre zavaróbb lehet, ha bővül az oldal.Ha már a css szépségéről, gyorsaságáról van szó, akkor inkább ajánljunk tag selectoroknál specifikusabb kiválasztókat (pl class), amiknél nem is kell azzal az egyre kisebb súlyú tényezővel foglalkozni, hogy esetleg régebbi böngészők (IE6) nem támogatják (vagy csak DOCTYPE meglétekor: IE7+) például a child selectort.
Amikor tegnap keresgéltem ezt
div li
változatnál figyelembe kell venni a környező kódot, mert valóban nem jó minden esetben, ahogy írod is; a példát az adott HTML-hez készítettem.Jó lenne lemérni, mert nem egyértelmű. Persze nem ismerem pontosan a böngészők működését, de nagyjából így történhet:
1,
div li
esetében:a
div
-en belül getElementsByTagName()-mel összegyűjti az összesli
-t, egy cikluson belül2,
div > ul > li
esetében:a, a
div
-en belül összeszedi az összes gyermek közül azul
-eketb, az
ul
-eken belül összeszedi az összes gyermek közül ali
-eketA helyzetet bonyolítja, ha minden
li
-re szeretnénk (a példából kiindulva)float:left;
-et tenni,div > ul > li
ésdiv > ul > li > ul > li
esetében kétszer kell, mígdiv li
-nél pedig egyszer. Nekem úgy általában az a tapasztalatom, hogy minél kevesebb ciklus van egymásba ágyazva, azaz minél egyszerűbb a kód, annál gyorsabb.Jobbról balra
Tehát:
1.
div li
esetében:Minden egyes
li
esetében elkezd felfelé menni a DOM fában, egészen addig, amíg nem talál egydiv
-et, vagy el nem éri a fa tetejét.2.
div>ul>li
esetében:Minden egyes
li
esetében megnézi, hogyul
-e a szülője, ha nem, akkor nem alkalmazódik a szabály, ha igen, akkor megnézi, hogy azul
szülőjediv
-e, ha igen, érvényes a szabály, egyébként nem.Persze lehet méricskélni, csak kérdés, hogy JS esetén ugyanaz az algoritmus fut-e, mint a stílusok ellenőrzésénél, alkalmazásánál.
Ez a post is érdekes, még ha rég(ebb)i is.
[szerk]
Itt azt írja, hogy nem is csak a kész dokumentum kerül kirajzolásra, hanem nyilván, ahogy érkezik a tartalom, úgy kerülnek az egyes részek ki- és újrarajzolásra a stílusszabályok alapján, ahogy egyre több tartalom érhető el, amíg meg nem érkezik a teljes tartalom. Továbbá ha jól értem, minden egyes új elemre végigpróbálja az összes szabályt (első kirajzoláskor és reflow-nál), nem pedig a szabályok alapján keresi ki az elemeket (ami belegondolva logikus is ebben a folyamatban). Így azt gondolom, közepes méretű, összetettségű oldalnál is észrevehető lehet, ha nem kellő körültekintéssel íródik a CSS.
[/szerk]
Selectorok, szabályok írásánál érdemes mindezen elgondolkodni. Természetesen lehet olyan eset, ahol a kettő közül a
div li
lenne a nyerő, akár teljesítmény, akár jelentés szempontjából; ahogy írtuk, a környezettől függ, mérlegelni/mérni kell, ha gondot okoz a megjelenítés sebessége.A JS-t most felejtsük el, az
1, Minél kevesebb stílus van az oldalon, annál gyorsabb a renderelés és a scrollozás (ez megerősíti azt, amit idézel), ezt úgy értem el, hogy kitöröltem a css-ből azokat a stílusokat, amelyeket nem használt az oldal.
2, A css elején lévő "reset" definíciók, amelyek minden elemre vonatkoznak, nagymértékben lassítják a kirajzolást.
Mindezek hatására azzal az eretnek gondolattal is eljátszottam, hogy mi lenne, ha – ahol érdemes és lehetséges – inline stílusokkal dolgoznék? Ha dinamikusan állítjuk elő a HTML-t, ez nem gond, plusz ha tömörítjük, nem lesz sokkal nagyobb.