CSS
Prince
CSS
Børre Stenseth

CSS og JavaScript

Hva

Når vi skal lage dynamikk på en vevside har vi mange ting å spille på som involverer CSS. Vi kan:

  • Vi kan identifisere elementer ved hjelp av stilangivelse
  • Vi kan bruke JS til å skru stilsett av og på
  • Vi kan endre hvilke stilbeskrivelser vi vil kople opp mot et element, endre class
  • Vi kan endre selve stilbeskrivelsen

Identifikasjon

Som kort vist i modulen Selectorer kan vi identifisere elementer på en vevside med følgende:

  • getElementsByClassName(c)
  • querySelectorAll(s)
  • querySelector(s)

der altså parameteren c er et classname og s en CSS-selector.

Dette kommer altså i tillegg til de "gamle" getElementsByTagName() og getElementById(). Og vi kan også ta med de grunnleggende DOM-rutinene som lar oss navigere rundt med parent, sibling, children osv.

Merk også at siden elementnavnet er en lovlig selector kan vi skrive:
var alldivs=document.querySelectorAll('div')
og oppnå det samme som
var alldivs=document.getElementsByTagName('div')

Skru stilsett av og på

Det første vi må ha kontroll på er hvordan vi skal identifisere et stilsett. Her kan vi bruke flere strategier.

Vi kan få tak i en komplett liste av stilsett med å skrive:
var styleSheetList = document.styleSheets.
Deretter kan vi velge hvilke stilsett vi vil ha tak i ved hjelp av indeks. Et stilsett kan i denne sammenhengen være et <style>-element eller en link til et stilsett <link href="myStyle.css" rel="stylesheet" type="text/css" />.

Vi kan også identifisere det stilsettet vi vil ved å merke dem med id, og på vanlig måte identifisere stilsettet med document.getElementById(). Fordelen med dette er at vi ikke trenger passe på rekkefølgen dersom vi editerer vevsiden og endrer/reorganiserer stilbeskrivelser.

Når vi har identifisert et (eller flere) stilsett kan vi bruke egenskapen disabled til et stilsett. Denne er en boolean og vi kan skru den av og på.

Der vi har følgende stilsett og javaskript, og paragrafen ovenfor har class="may-be-red".

<style id="showred">
.may-be-red{color:red}
</style>
 
 function toggle(sheetId){
	var elt=document.getElementById(sheetId);
	elt.disabled=!elt.disabled;
 }
 

Endre class

Vi har mulighet for å angi flere stilklasser for et element, <p class="a b c"<, der a, b og c er uavhengige klassenavn med hver sin beskrivelse i et stilsett. Vi kan manipulere denn list av klassenavn på forskjellige måter. Vi kan bruke className-egenskapen til elementet og rett og sette denne til en ny verdi. Det btyr da at den nye verdien også kan ha en string med klassenavn skilt med blank. Alternativet er å bruke classList. Dette gjør det mulig for oss å manipulere lista med klassenavn på en mye mer fleksibel måte. classList har følgende metoder:

  • add()
  • remove()
  • contains()
  • toggle()

Vi kan f.eks. lage oss et veldig enkelt eksempel med følgende lille javaskript:

 function showMe(eltId){
	var elt=document.getElementById(eltId);
	elt.classList.remove("hide");
	elt.classList.add("show");
 }
 function hideMe(eltId){
	var elt=document.getElementById(eltId);
	elt.classList.add("hide");
	elt.classList.remove("show");
  }
  function toggleMe(eltId){
	var elt=document.getElementById(eltId);
	if(elt.classList.contains("hide"))
		showMe(eltId);
	else
		hideMe(eltId);
  }

Hvis vi kombinerer dette med følgende stilangivelser:

.hide{display:none}
.show{display:block}
 

har vi en enkel mekanisme for å skru av og på elementer på en vevside.

denne teksten er en paragraf med klasse "bluetext show" og id="test".

Endre stilbeskrivelsen

Vi kan også bruke JavaScript til å endre innholdet et stilsett. Vi trenger da å identifisere et stilsett, en selektor og den stilregelen vi vil endre. Det betyr at vi kan få et ganske omfattende søk (løkke) for å finne riktig stilregel i riktig selektor i riktig stilsett. Igjen er det litt å hente ved å identifisere stilsettet, slik som vi gjorde ovenfor. Hvis vi gjør dette kan vi ende opp med følgende funksjon, som et utgangspunkt som kan endres og tilpasses:

function setClassRule(sheetId,rule,name,val)
{
    // the stylesheet element
    var styleElt=document.getElementById(sheetId);
    // as a styleshhet
    var styleSheet=styleElt.sheet;
    // loop rules   
    var myrules=styleSheet.cssRules;
    for(i=0; i < myrules.length; i++){
        if(myrules[i].selectorText==rule){
            for(p in myrules[i].style){
                if(myrules[i].style.getPropertyValue(name))
                    myrules[i].style.setProperty(name,val,null);
            }
        }
    }
}

Vi bruker følgende stilsett på en paragraf:

<style id="showgreen">
#greentext{color:green}
</style> 

Denne paragrafen har id="greentext" og er derfor grønn, helt til vi endrer fargen til rød:

Varianter av denne teknikken skal vi bruke i noen av de neste modulene for å manipulere stilregler som blandt gir oss muligheter til å animere rotasjoner og bevegelse.