webForumDet fria alternativet

Få fram ett elements värde så som det är satt i css filen

JavaScript

6 svar · 677 visningar · startad av Dino

Medlem sedan sep. 20011 914 inlägg
Frågan#1

Undrar hur man via javascript kommer åt ett elements css värde så som det är satt i css filen, inte det renderade värdet.
I nedan kod vill jag alltså för #span kunna få fram 167% och inte 22px.

Testat via window.getComputedStyle men den ger ju oxå 22px, kan ju gå via document.styleSheets[0] men tycker den är väldigt omständig.

Så finns det något "riktigt" sätt?

test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test</title>
    <link rel="stylesheet" type="text/css" href="test.css" />
</head>
<body>
    <p id="p">Lalala lalala <span id="span">hmm</span> lalala lalala</p>
</body>
</html>

test.css

body{font-size:13px;}
#p{font-size:100%;}
#span{font-size:167%;color:green;}
Medlem sedan aug. 20039 340 inlägg
#2

Jag har själv funderat på det där förut så jag sate mig ner och kikade på det. Kom fram med detta:

function getCSSRule(id, selectorText, jsStyleProperty){
	var styleSheetElem = (typeof id=='string') ? document.getElementById(id) : id;
	var styleSheet = styleSheetElem.sheet || styleSheetElem.styleSheet || styleSheet;
	var rules = styleSheet.cssRules || styleSheet.rules;

	for (var i=0; i<rules.length; i++){
		if(rules[i].selectorText.toLowerCase() == selectorText.toLowerCase() && rules[i].style[jsStyleProperty] != '')
			return rules[i].style[jsStyleProperty];
	}
	return null;
}
...
alert(getCSSRule('mystyle', '#span', 'fontSize'));

Kan t ex anropas som ovan och ger då tillbaka 167%. Testad och funkar i Opera 9.5, FF3 och IE6. Dock otestad på Safari och Chrome, och det är inte helt omöjligt att koden inte funkar där.
Notera att egenskaper måste skriva i Javascript-notation, t ex fontSize som ovan eller backgroundColor. (Istället för font-size eller background-color)
Returnerar null om ingen egenskap hittas, annars returneras den första matchande regeln. (Man kanske borde söka igenom reglerna baklänges?) Dessutom söks bara en style-tagg igenom, som måste specificeras till funktionen, t ex genom att ge den ett id som du skickar med.

<style id="mystyle" type="text/css">
body{font-size:13px;}
#p{font-size:100%;}
#span{font-size:167%;color:green;}
</style>
Medlem sedan sep. 20011 914 inlägg
#3

Lösningen i sig fungerar bra, men då de flesta idag använder externa css filer framför style taggar så kan man istället använda,

<link [B]id="mystyle"[/B] rel="stylesheet" type="text/css" href="test.css" />

för att istället köra emot css filen.

Problemet är ju att man är bunden till att veta den precisa css regeln elementet har i css filen tex, "#div #p #span" och då "div #span" inte fungerar.
Istället för att kunna jobba direkt utifrån elementet, tex som inline: element.style.fontSize.

Så det är ju en fungerande lösning, men begränsad.

Skall försöka sätta mig in och fråga runt lite mer, och postar om jag hittar något. Gör detsamma vetja. :)

Tack för svaret.

Medlem sedan aug. 20039 340 inlägg
#4

#div #p #span betyder ju "Ett element med id="span" inuti ett element med id="p" inuti ett element med id="span"". I det fallet, hur vill du att sökningen ska ske? Ska en sökning efter #div #span matcha #div #p #span eftersom båda anger ett #span någonstans inom #div. Det känns lite rörigt.
Däremot om du anger samma regel för flera element med komma-separering så har du en poäng. IE tolkar detta som två olika regler, däremot tolkar FF och Opera det som en regel med en selector som typ "#a, #b". Detta går förstås också att lösa.

function getCSSRule(id, selectorText, jsStyleProperty){
	var styleSheetElem = (typeof id=='string') ? document.getElementById(id) : id;
	var styleSheet = styleSheetElem.sheet || styleSheetElem.styleSheet || styleSheet;
	var rules = styleSheet.cssRules || styleSheet.rules;

	for (var i=0; i<rules.length; i++){
		var selectors = rules[i].selectorText.split(/, */g);

		for (var j=0; j<selectors.length; j++){
			if(selectors[j].toLowerCase() == selectorText.toLowerCase() && rules[i].style[jsStyleProperty] != '')
				return rules[i].style[jsStyleProperty];
		}
	}
	return null;
}

Denna matchar nu

<style id="mystyle" type="text/css">
#span,#div #p #span{font-size:167%;color:green;}
</style>

om man söker efter antingen #span eller #div #p #span.

För övrigt, om du berättar vad du faktiskt vill åstadkomma kan jag försöka hjälpa dig bättre. Det du vill göra kanske går att göra helt utan att rota i CSS-filerna t ex...

Medlem sedan sep. 20011 914 inlägg
#5

Läste igenom mitt första inlägg och det är lite missvisande ser jag, så här är i alla fall upplägget.

Det jag försöker göra är att med ett antal element ta fram dess fontSize värde som det är satt i %. I .css filen har då body 13px och alla andra har 100% som default. Sen finns det ju olika cssRules.
I nedan script så skall alltså den första p ge 100% och den andra 167% och den tredje oxå 167% då den ärver från #p.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test</title>
    <link rel="stylesheet" type="text/css" href="test.css" />
</head>
<body>
    <p>Lalala lalala</p>   
    <p id="p">Lalala lalala <p>hmm</p> lalala lalala</p>
</body>
</html>
body{font-size:13px;}
*{font-size:100%;}
#p{font-size:167%;}
//Bara exempel
var ptags=document.getElementsByTagName("p");
for (i=0; i< ptags.length; i++){
    var size1 = ptags[i].style.fontSize;//Bad
    //Do something
}
Medlem sedan aug. 20039 340 inlägg
#6

Aha... Ge tusan i att lägga p inuti p. Standarden tillåter bara inline-element inuti <p>, och <p> är i sig ett sk block-element. Vill du modifiera text inuti <p>, använd <span>.
Och kolla lite på vad CSS-klasser och rekursive regler kan göra för dig.

  • CSS-id'n ska du använda för regler för element som det bara finns ett av. Sådana regler definieras av # följt av id't, t ex

    #logo {width: 100px; height 50px;}
    
  • CSS-klasser ska du använda för regler som ska appliceras på vissa element. Sådana regler definieras av . följt av klass-namnet. T ex

    .focused {font-size: 1.4em; }
    
  • Regler kan även appliceras skoningslöst på alla taggar av en viss typ. T ex

    div {border-top: 1px solid black; }
    
  • Man kan även kombinera tagg-namn och klass-namn för att applicera en regel på ett element bara om elementet har både rätt tagg och klass:

    span.remark {background-color: #300; }
    

    (Ger alla span med class="remark" en mörkröd ton, men låter t ex p med class="remark" vara.)

  • Regler kan appliceras rekursivt. Genom att placera identifierarna efter varandra, separerade med mellanslag, t ex:

    a img{border: none;}
    

    är ett betydligt enklare sätt att få bort ramar runt bilder som ligger i a-taggar, än att skriva border="0" i alla img-taggar.

  • Med hjälp av två regler kan du särskilja bilder som beroende på typ av länk. T ex:

    a img{border: border: 1px solid black; padding: 2px;}
    a.menulink img{border: none; padding: 0px;}
    

    Dessa ger generellt bilder en enpixelsram och padding på två pixlar innanför ramen. Utom bilder som liggar i länkar med class="menulink", som förskonas de reglerna.

    <p>Lalala lalala</p>
    <p class="style1"><span class="focused">Jag</span> är standardfärg, 1.4x större och fet.</p>
    <div class="style1"><span class="focused">Jag</span> är bara 1.4x så stor.</div>
    <p class="style2"><span class="focused">Jag</span> är mörkröd, 1.4x större och kursiv.</p>
    <div class="style2"><span class="focused">Jag</span> är också mörkröd, 1.4x större och kursiv.</p>
/* Regel för alla element med class="focused" */
.focused {font-size: 1.4em; }

/* Regel för alla element med class="focused" som ligger i just ett p-element som har class="style1" */
p.style1 .focused {font-weight:bold;}

/* Regel för alla element med class="focused" som ligger i valfritt element med class="style2" */
.style2 .focused {font-style:italic; color: #700;}

Hoppas du har lärt dig något nytt om CSS. :)

Medlem sedan sep. 20011 914 inlägg
#7

nitro2k01 skrev:

Hoppas du har lärt dig något nytt om CSS. :)

Tack, har visst en hel del att lära om CSS.

Hur som helst så har saker och ting löst sig. Gjorde lite ändringar i tillvägagångssättet och...

272 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)