Hva du kanskje ikke vet om Z-indeksen

De z-indeks eiendom i CSS virker enkelt nok, men det er mye å oppdage under overflaten hvis du virkelig vil forstå hvordan det fungerer. I denne opplæringen vil vi tydeliggjøre Z-indeksens indre arbeid ved å se på stabling sammenhenger og noen få praktiske eksempler.

CSS gir tre forskjellige posisjoneringsordninger for utformingen av bokser:

  • normal dokumentflyt
  • flyter
  • absolutt posisjonering

Den siste fjerner helt et element fra den normale strømmen og bygger på utvikleren for å fortelle elementet hvor det skal vises.

Du gir den øverste, venstre, nederste og høyre verdien for å plassere elementet i todimensjonalt mellomrom, men CSS lar deg også plassere det i den tredje dimensjonen ved hjelp av z-indeksegenskapen.

På overflaten ser z-indeks ut som en enkel eiendom å bruke. Du angir verdier for å bestemme hvor på elementet som ligger på denne tredje aksen, og du er ferdig. Under overflaten er det mye mer å dykke inn, inkludert en rekke regler for hvilke typer elementer som sitter på toppen av andre.

La oss starte med det grunnleggende for å være sikker på at vi er alle på samme side, og så snakker vi om stabling for å forstå mer av hva som skjer med z-indeks bak kulissene.


Z-indeks grunnleggende

Jeg er sikker på at du er kjent med tredimensjonal koordinasjonsplass. Vi har en x-akse som vanligvis brukes til å representere den horisontale, en y-akse som representerer vertikal, og en z-akse brukes til å representere hva som skjer inn og ut av siden, eller skjermen i vårt tilfelle.


3-dimensjonalt koordinasjonsrom

Vi gjør ikke bokstavelig talt se z-aksen, da skjermen er et todimensjonalt plan. Vi ser det i form av perspektiv og av enkelte elementer som kommer foran eller bak andre elementer når de deler det samme todimensjonale rommet.

For å fastslå hvor langs denne tredje aksen et element er plassert, tillater CSS oss å angi tre verdier på z-indeksegenskapen.

  • auto (standard)
  • (Heltall)
  • arve

For øyeblikket la oss fokusere på heltallverdien. Dette kan være positivt, negativt eller 0. Jo større verdien, jo nærmere betrakteren vises elementet. Jo lavere verdien, jo lenger unna vises det.

Hvis to elementer er plassert slik at de begge opptar et delt område av todimensjonalt rom, vil elementet med den større z-indeksen skjule eller okkludere elementet med den nedre z-indeksen i områdene hvor de deler plassen.

Jeg antar at ovennevnte er lett nok til å forstå og sannsynligvis oppfører seg akkurat som du forventer. Det er imidlertid noen ubesvarte spørsmål som henger rundt.

  • Som vises øverst når et posisjonert element med en z-indeks overlapper et element i den normale dokumentstrømmen?
  • Som vises øverst når ett element er plassert og en er floated?
  • Hva skjer når plasserte elementer er nestet inne i andre posisjonerte elementer?

For å svare på disse spørsmålene må vi forstå mer om hvordan z-indeksen fungerer, spesielt ideen om stabling av sammenhenger, stablingsnivåer og stabling av ordrer.


Stableringskontekster og stablingsnivåer

Stacking sammenhenger og stabling nivåer kan være litt vanskelig å konseptualisere, så for et øyeblikk, bilde et bord med en haug med elementer sitter på toppen av det. Tabellen representerer en stablingskontekst. Hvis det er et annet bord ved siden av det første, representerer det en annen stablingskontekst.


Stacking kontekst 1 er dannet av roten av dokumentet. Begge stablingskontekstene 2 og 3 er stablingsnivåer på stablingskontekst 1. Hver danner også en ny stablingskontekst med nye stablingsnivåer inne.

Forestill deg nå på den første bordet, er det fire små blokker, alle sitter direkte på bordet. På toppen av disse fire blokkene er en tallerken med glass og på toppen av glassplaten er en bolle med frukt. Blokkene, glassplaten og fruktskålen representerer hverandre et annet stablingsnivå innenfor stablingskonteksten som er tabellen.

En enkelt standard stabling kontekst er opprettet for hver nettside. Roten til denne konteksten (tabellen) er html element. Alt inne i html-taggen sitter på et stablingsnivå i denne standard stablingskonteksten (objekter som sitter på bordet).

Når du tilordner en z-indeksverdi annet enn auto til et element, oppretter du en ny stablingskontekst med nye stablingsnivåer som er uavhengige av andre stablingskontekster og stablingsnivåer på siden. Du tar med deg et annet bord inn i rommet for gjenstander å sitte på.


Stacking Order

Den enkleste måten å forstå stablingsordren er med et enkelt eksempel, så enkelt vil vi ikke engang vurdere posisjonerte elementer for et øyeblikk.

Tenk på en veldig enkel nettside. Annet enn standard , , , etc. du finner på hver nettside er det en enkelt

. I CSS-filen setter du bakgrunnsfargen til HTML-elementet til blått. På div, setter du verdier for bredde og høyde og en bakgrunnsfarve på rødt.

Hva forventer du å se når du laster inn siden?

Forhåpentligvis tok det deg ikke lang tid til å bilde et stort sett blått skjerm med unntak av en blokk med rød farge som har dimensjonene du angir for bredden og høyden på div. Den røde blokken er sannsynligvis øverst til venstre på siden, med mindre du lar fantasien løpe vilt litt og ga det mer css å vise det et annet sted.

Du kan tenke "så hva, det var ganske tydelig", men det som kanskje ikke er så opplagt, er hvorfor du ser en rød blokk på toppen av en blå bakgrunn. Hvorfor ser du diven på toppen av html-elementet? Årsaken er at begge har følgende stablingsordre.

Når det gjelder dette enkle eksempelet, sier reglene at etterkommende blokker i normalflyten (div) sitter på et høyere nivå enn bakgrunnen og grensen til rotelementet (html-elementet). Du ser div på toppen fordi den er på et høyere stablingsnivå.

Mens eksemplet ovenfor bare inneholder en to-nivå stabel, er det syv mulige nivåer på hver stablingskontekst, som er oppført nedenfor.

  1. Bakgrunn og grenser - av elementet som danner stablingskonteksten. Det laveste nivået i stabelen.
  2. Negativ Z-indeks - Stableringskonteksten av etterkommereelementer med negativ z-indeks.
  3. Block Level Boxes - In-flow non-inline-nivå ikke-posisjonerte etterkommere.
  4. Floated Boxes - ikke-posisjonerte flyter
  5. Inline bokser - in-flow inline-nivå ikke-posisjonerte etterkommere.
  6. Z-indeks: 0 - posisjonerte elementer. Disse danner nye stablingskontekster.
  7. Positiv Z-indeks - posisjonerte elementer. Det høyeste nivået i stabelen.

De syv nivåene i en stablingskontekst

Disse syv nivåene danner regler for stablingsordre. Et element på nivå sju vil vise over (nærmere seeren) enn elementer på nivå 1 til 6. Et element på nivå fem viser over et element på nivå to. Et element på ... vel, du får ideen.

Første gang jeg støttet regleringsordningene ovenfor, stod noen ting ut for meg. Hvis du bare ser på nivåene to, seks og syv (de der z-indeksen er nevnt), passer den til det du sannsynligvis antar om z-indeksen. Positiv z-indeks er på et høyere nivå enn 0 z-indeksen, som er på et høyere nivå enn negativ z-indeks. Det er sannsynligvis der de fleste av oss slutter å tenke på alle disse stablingslagene, skjønt.

Før disse reglene hadde jeg antatt alt annet var ekvivalent med en z-indeks på 0. Klart det er ikke så. Faktisk sitter det meste på et nivå under z-indeksen = 0 nivå.

Det som også er interessant er at ikke-posisjonerte elementer ligger på fire forskjellige stablingsnivåer. Det er fornuftig når du tenker på det. Hvis alle ikke-posisjonerte elementene var på samme stablingsnivå, ville vi ikke se tekst (inline-boks) på toppen av en div (blokknivå-boks).


Sette alt sammen

Et par ganger har jeg nevnt å skape nye stablingskontekster. Når du tilordner en z-indeksverdi annet enn auto til et element du lager en ny stablingskontekst, uavhengig av andre stablingskontekster.

La oss tenke igjen på tabeller som stablingskontekster. Før hadde vi et bord og på toppen av bordet var fire blokker, en tallerken med glass og en fruktskål. Tenk deg at det andre bordet vi introduserte også har fire blokker av samme størrelse og en tallerken glass på toppen, men ingen fruktskål.

Du forventer at fruktskålen fra tabell 1 blir den høyeste gjenstanden i rommet. Den sitter på høyeste nivå (den har den største z-indeksen). Hva ville skje om vi flyttet bord ett og alt på toppen av det til kjelleren? Denne fruktskålen ville nå være lavere enn alt på bord to, fordi bordet selv har blitt flyttet til et nivå under tabell to.

Det samme skjer med plasserte elementer på en nettside. Vurder merkingen og stylingen nedenfor. Vil div.two Vis over eller under div.four?

HTML:

CSS:

div bredde: 200px; høyde: 200px; polstring: 20px;  .one, .two,. tre, .four posisjon: absolutt;  .on bakgrunn: # f00; omriss: 5px solid # 000; topp: 100px; venstre: 200px; z-indeks: 10;  .two bakgrunn: # 0f0; omriss: 5px solid # 000; topp: 50px; venstre: 75px; z-indeks: 100;  .three bakgrunn: # 0ff; omriss: 5px solid # 000; topp: 125px; venstre: 25px; z-indeks: 150;  .four bakgrunn: # 00f; omriss: 5px solid # ff0; topp: 200px; igjen: 350px; z-indeks: 50; 

Selv om div.two har den større z-indeksen (100), sitter den faktisk under div.four (z-index = 50) på siden. Du kan se resultatet av koden ovenfor i bildet nedenfor. De svarte og gule grensene viser de forskjellige stablingskontekstene hvert element er i.


Siden div.two er inneholdt i div.one, er z-indeksen relativ til div.ones bunke. I virkeligheten er det som vi egentlig har:

  • .en-z-indeks = 10
  • .to-z-indeks = 10.100
  • .tre-z-indeks = 10.150
  • .fire-z-indeks = 50

Det vi har gjort er flyttet div.one og alt det inneholder nedenfor div.four. Uansett hvilke verdier vi satte på z-indeksegenskapen til elementer inni div.one de vil alltid vise nedenfor div.four.

Hvis du er som meg, har dette sannsynligvis trukket deg opp en eller to ganger når du arbeider med z-indeksen. Forhåpentligvis hjelper disse eksemplene til å klare hvorfor et element med en større z-indeks noen ganger ender med å vise bak et annet element med en lavere z-indeks.


Konklusjon

Når du først møter det, ser z-indeksegenskapen ut som en veldig enkel egenskap å forstå. Verdier representerer et sted på en akse inn og ut av skjermen, og det er alt.

Et dypere kikk på z-indeksen viser at det er litt mer på gang bak scenene. Det er stabling av sammenhenger, stablingsnivåer og regler for å bestemme hvilket element som vises høyere eller lavere i stablingsordren.

Posisjonerte elementer kan skape nye stablingskontekster, og hele stablingsnivået vil vise over eller under alle nivåene i en annen stablingskontekst.


Videre lesning

  • Hva ingen sa deg om Z-indeksen av Philip Walton
  • Z-indeksen CSS Property: En omfattende titt på smashing Magazine
  • Hvor godt forstår du CSS-posisjonering?
  • Stableringskonteksten på Mozilla Developer Network
  • Z-indeks og CSS Stack: Hvilket element viser først?