Omdat IE toch enigszins beperkt is mbt css ondersteuning en we er toch nog wel een tijdje aan vast zitten dacht ik; waarom bouwen we het er zelf niet in dan? Zo wil ik bijvoorbeeld gewoon min-height kunnen gebruiken, en als ik iets met left, top, right en bottom definieer wil ik dat het de juiste dimensies aanneemt. Ook in combinatie met padding, border en min- height en width.
Omdat het alleen in IE hoeft te werken heb ik een test htc gemaakt. Die link je als behavior aan de body, en die gaat dan recursief door het document lopen en al het werk voor je doen;
In de htc zit een klein stukje jscript dat het hele document uitkamt:
En dan beginnen de problemen
In de testcase heb ik een CSSElement object gemaakt die met een validate() functie css properties uitleest en volgens de standaard probeert toe te passen. properties hebben eigen "fix" functies, en als ze inderdaad nodig zijn kunnen ze zichzelf aan een resize event koppelen, zodat er niet teveel meuk aan de resize event komt te hangen:
ResizeListener.trigger(); hangt met een attachEvent aan het window. Een CSSElement kan dan b.v. de fixMinHeight functie aan de resize hangen met:
Tot zover werkt het. Het moet alleen wel goed gaan werken
en de problemen komen bij het opvragen van waardes uit de currentStyle en node zelf. Een simpele parseInt gaat niet werken, want 2em is niet 2px, en ik wil b.v. wel 2em van 100% af kunnen trekken, een element met:
zal b.v aan alle kanten die 100px moeten hebben. de width wordt dan (met padding en border alletwee left en right) met het w3c boxmodel: 100% - 2cm - 2em. Mozilla/firebird doen dat uiteraard vanzelf, in IE moet het berekend worden...
Wat ik dus eigenlijk zoek is een mooie generieke manier om met niet teveel code te kunnen rekenen met totaal verschillende eenheden. Een manier is b.v. om een factor te gebruiken en het cssElement bij de init vol te stauwen met omgerekende pixelwaarden. Maar misschien zijn er veel betere (en niet statische) andere manieren. Als dit een keer werkt en niet te groot of zwaar wordt wil ik het namelijk ook gewoon standaard gaan gebruiken
Omdat het alleen in IE hoeft te werken heb ik een test htc gemaakt. Die link je als behavior aan de body, en die gaat dan recursief door het document lopen en al het werk voor je doen;
HTML:
1
2
3
4
5
| <style type="text/css"> body { behavior:url("css.htc"); } </style> |
In de htc zit een klein stukje jscript dat het hele document uitkamt:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <attach event="ondocumentready" handler="initCSS" /> <script language="JScript"> function initCSS() { parseNode(this); } function parseNode(node) { if(!node || !node.currentStyle) return; // - hier - iets met node doen for(var i=0; i<node.childNodes.length; i++) { parseNode(node.childNodes[i]); } } ... |
En dan beginnen de problemen
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ResizeListener = { actions:[], add:function(scope, func) { this.actions.push(function(){ scope[func](); }); }, trigger:function() { for(var i=0; i<this.actions.length; i++) { this.actions[i](); } } } |
ResizeListener.trigger(); hangt met een attachEvent aan het window. Een CSSElement kan dan b.v. de fixMinHeight functie aan de resize hangen met:
JavaScript:
1
| ResizeListener.add(this, 'fixMinHeight'); |
Tot zover werkt het. Het moet alleen wel goed gaan werken
Cascading Stylesheet:
1
2
3
4
5
6
7
8
9
| position:absolute; left:100px; top:100px; right:100px; bottom:100px; border:1em solid silver; padding:1cm; background:#f0f0f0; |
zal b.v aan alle kanten die 100px moeten hebben. de width wordt dan (met padding en border alletwee left en right) met het w3c boxmodel: 100% - 2cm - 2em. Mozilla/firebird doen dat uiteraard vanzelf, in IE moet het berekend worden...
Wat ik dus eigenlijk zoek is een mooie generieke manier om met niet teveel code te kunnen rekenen met totaal verschillende eenheden. Een manier is b.v. om een factor te gebruiken en het cssElement bij de init vol te stauwen met omgerekende pixelwaarden. Maar misschien zijn er veel betere (en niet statische) andere manieren. Als dit een keer werkt en niet te groot of zwaar wordt wil ik het namelijk ook gewoon standaard gaan gebruiken
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin