Diskuze: Stylování čísel v číslovaném seznamu
V předchozím kvízu, Online test znalostí HTML a CSS, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí HTML a CSS, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, žádný konkrétní selektor přímo pro to určený neznám, ale lze toho docílit tak, že „odstraníš“ předdefinované odrážky a za ně si přes pseudoelement :before dosadíš své vlastní, ostylované:
ol {
counter-reset: item;
}
li {
display: block;
}
li:before {
content: counter(item) ". ";
counter-increment: item;
font-weight: bold;
}
S counter-něco jsem nikdy nedělal, je to pěkně těžké na pochopení mi přijde.Prošel jsem si pár webů a zdejší manuál, ale nechápu jednu věc.
ol {
counter-reset: item;
}
Já přeci nebudu potřebovat počítání resetovat(nebo ano?), k čemu je to tedy dobré?
Pokud používáš counter, můžeš si ho představit jako jakousi proměnnou v CSS, která se inkrementuje pokaždé, když je použita u nějakého elementu. Counterů můžeš mít víc (zde jsem ho pojmenoval jako item, ale název může být libovolný, třeba counter(poradi).
Než je ale možné pracovat s nějakým counterem, je nutné ho vytvořit (nastavit jeho hodnotu na 0). To by šlo udělat jen jednou globálně, např. u elementu body:
body {
counter-reset: item;
}
To by ale znamenalo, že bude společný pro všechny prvky na stránce a tudíž, pokud by si měl více číslovaných seznamů za sebou, tak by jejich číslování navazovalo na sebe. Zápis:
ol {
counter-reset: item;
}
prakticky znamená, že pokaždé, když se začne nový seznam, začne se také číslovat od znovu.
Zkoušel jsem to, a v základní verzi výše zmíněný zápis částečně funguje i pro vnořené seznamy:
Pokud by se ale vyžadovalo lepší číslování (2.1., 2.2., ...), je třeba použít dva countery, kde každý bude sloužit pro jednu úroveň seznamu. Na JSFiddle jsem umístil živou ukázku.
li {
display: block;
}
.parent {
counter-reset: parent;
}
.parent > li:before {
content: counter(parent) ". ";
counter-increment: parent;
font-weight: bold;
}
.parent > ol {
counter-reset: child;
}
.parent > ol > li:before {
content: counter(parent) "." counter(child) ". ";
counter-increment: child;
font-weight: bold;
}
Tady už je to trochu problematičtější. Pokud je délka seznamu stanovena předem, můžeš counter nastavit na hodnotu počtu odrážek + 1 a po každé odrážce od counteru odečítat:
ol {
counter-reset: item 4; /* Seznam bude mít 3 položky (3, 2, 1) */
list-style: none;
}
ol li:before {
content: counter(item) ". ";
counter-increment: item -1;
font-weight: bold;
}
V případě, že délka seznamu není pevně dána, nenapadá mě nic jiného, než vytvořit pouhou iluzi toho, že se jedná o převrácený seznam. Jde to přes CSS vlastnost transform, je ale nutné zde také jednotlivé položky psát obráceně (od poslední k první):
ol {
counter-reset: item;
list-style: none;
transform: rotate(180deg);
}
ol li {
transform: rotate(-180deg);
}
ol li:before {
content: counter(item) ". ";
counter-increment: item;
font-weight: bold;
}
Nejideálnější by bylo, kdyby si veškeré seznamy generoval na serveru např. pomocí PHP. Do atributu data-length by si pak mohl uložit velikost seznamu a k té přistoupit v CSS přes vlastnost attr():
ol {
counter-reset: item attr(data-length);
counter-increment: item;
list-style: none;
}
ol li:before {
content: counter(item) ". ";
counter-increment: item -1;
font-weight: bold;
}
Zde jsou živé ukázky na všechny tři způsoby.
Páni, to by mě nenapadlo, to je fakt zajímavý řešení Koukal jsem tedy jen na tu druhou možnost, protože to je to, co potřebuju...
Děkuju moc
Zobrazeno 10 zpráv z 10.