webForumDet fria alternativet

Formatera ul/li i olika för olika nivåer?

HTML & CSS

11 svar · 1 867 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej alla glada!

Jag har ett gäng kategorier och underkategorier som jag skriver ut och vill formatera nivåerna olika. Jag vill att det ska se ut såhär:

HUVUDKATEGORI 1
--UNDERKATEGORI 1
----Kategori 1
----Kategori 2
--UNDERKATEGORI 2
HUVUDKATEGORI 2
--Kategori 1
--Kategori 2
HUVUDKATEGORI 3

Problemet är att ibland vill jag formatera nivå 2 med versaler och ibland inte beroende på om det är en underkategori eller en kategori som ligger på nivå 2. Jag kommer inte att ha fler nivåer än så. Jag skulle kunna skriva underkategorierna med versaler direkt, men det är ju fusk ;) Jag skulle vilja lösa detta med CSS och utan att använda klasser/id om det över huvud taget är möjligt, annars blir det en flytt till PHP-forumet av det här med frågor hur jag ska få in klasserna i min utskrivningsfunktion ;)

Finns det t.ex. någon css-finess som kollar om det är de sista barnen och då skriver på ett sätt och ett annat om det finns ytterligare barn?
Och om det finns, vad är kompatibiliteten för det (css-version)?

Tack!

Koden för det ovan ser ut så här:

<ul>
  <li>HUVUDKATEGORI 1
    <ul>
      <li>UNDERKATEGORI 1
        <ul>
          <li>Kategori 1</li>
          <li>Kategori 2</li>
        </ul>
      </li>
    <ul>
      <li>UNDERKATEGORI 2</li>
    </ul>
  </li>
  <li>HUVUDKATEGORI 2
    <ul>
      <li>Kategori 1</li>
      <li>Kategori 2</li>
    </ul>
  </li>
  <li>HUVUDKATEGORI 3</li>
</ul>
Medlem sedan juni 201161 inlägg
#2

Nu är jag ju lite halvsovande, så jag kanske missar något, men jag hade nog använt jQuery för att lägga på en class på alla "li ul li" som inte har någon "ul" under sig. För du hade inget principiellt emot att använda klasser?

Medlem sedan nov. 20016 480 inlägg
#3

Nä, det har jag visserligen inte, men om man måste javascripta så kanske jag överväger att grotta in i php-koden och lägga på klasser där i stället.

Medlem sedan juni 201161 inlägg
#4

Om du nu tycker att jQuery är så tungt javaskriptande... men annars är det ju egentligen bara två selektorer om inte jag tänker helt fel:
$(document).ready(function(){
$("li").css("text-transform", "none");
$("li").has("ul").css("text-transform", "uppercase");
});

Medlem sedan juni 2006244 inlägg
#5

Utan att kolla på någon cheatsheet känns det enklaste som att använda child-of-selektorn:

ul > li > ul > li

Denna väljer en li på nivå 2 (eftersom det är en li inuti en ul inuti en li inuti en ul)

Edit:
Tänk på att du bör göra toppnivåns lista unik, så att du inte råkar peka på en helt annan typ av li i strukturen.
T.ex med ett id:

ul#tree>li>ul>li

Detta är en CSS2-selektor.

Vad jag vet finns ingen selector som väljer ett element utan descendants.
Detta är vad du frågar efter när du säger "sista barnet". Sista barnet är något annat och fås med selektorn (CSS3)

:last-child

.

Lite nyttig läsning:
http://www.w3.org/TR/CSS2/selector.html

Medlem sedan juni 201161 inlägg
#6

Fast ett problem är ju att även ett "löv-li" har descendants - textnoden. Så alla "li" i listan har ju descendants.

Det känns ju ändå som om det enklaste är att ha en speciell CSS-klass för de noder som skall vara versaler. Antingen peta på den i PHP eller med jQuery.

Medlem sedan nov. 20016 480 inlägg
#7

Oldtimer skrev:

Om du nu tycker att jQuery är så tungt javaskriptande... men annars är det ju egentligen bara två selektorer om inte jag tänker helt fel:
$(document).ready(function(){
$("li").css("text-transform", "none");
$("li").has("ul").css("text-transform", "uppercase");
});

Det gör ju faktiskt precis det jag vill, så jag kör på det om jag inte får svar i den andra tråden. Tack!

Medlem sedan juni 2006244 inlägg
#8

funkade inte min lösning?

Edit:
Inte för att jag vill ha en blåmarkering runt mitt inlägg, utan snarare av intresse... =)

Medlem sedan nov. 20016 480 inlägg
#9

doridori skrev:

funkade inte min lösning?

Edit:
Inte för att jag vill ha en blåmarkering runt mitt inlägg, utan snarare av intresse... =)

Men din lösning fixade väl bara fasta utseende per nivå?
Jag behövde ett sätt att t.ex. styla nivå två på ett vis om det inte fanns en nivå tre och på ett annat sätt om det fanns en nivå tre.

Medlem sedan juni 20019 519 inlägg
#10

bassebhu skrev:

Men din lösning fixade väl bara fasta utseende per nivå?
Jag behövde ett sätt att t.ex. styla nivå två på ett vis om det inte fanns en nivå tre och på ett annat sätt om det fanns en nivå tre.

Ser inget större problem att lösa det med CSS (även om inte alla webbläsare har stöd för :last-child). Men känns som jquery är enklare då du kan använda :has(ul) om du vill göra något speciellt med li element som har ul-element i sig.

Medlem sedan juni 2006244 inlägg
#11

bassebhu skrev:

Men din lösning fixade väl bara fasta utseende per nivå?
Jag behövde ett sätt att t.ex. styla nivå två på ett vis om det inte fanns en nivå tre och på ett annat sätt om det fanns en nivå tre.

Ja, det gjorde den. Missade ditt krav där :)

Tänk på att om du använder Javascript så kan du inte få samma stil om användaren inte kör Javascript.
Se därför till att sidan är funktionell även utan Javascript.

Vill du inte sätta klasser i HTML så är Javascript absolut enklast.

voigtann1 skrev:

Ser inget större problem att lösa det med CSS (även om inte alla webbläsare har stöd för :last-child)

:last-child är dock inte rätt selektor i det här fallet.
Den väljer sista child under en nod. T.ex den li som förekommer sist inuti en ul.

<ul>
  <li>1</li>
  <li>2
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
    </ul>
  </li>
  <li>3</li>  <---- :last-child
</ul>

Att välja en nod utifrån dess descendants går inte med CSS, eftersom det inte finns någon selektor som söker i underliggande element.

Medlem sedan juni 20019 519 inlägg
#12

jag utgick ifrån ditt svar att det var det bassebhu var ute efter

267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)