Greedyness von Kombinatoren
bearbeitet von
Hallo alle,
in MBs Frage zu seinen Kommentarblöcken ist mir etwas aufgefallen.
Gegeben sei dieses HTML (jaaaa - da fehlen Attribute)
~~~html
<a>a1</a> <b>b1</b>
<a>a2</a> <b>b2</b>
<a>a3</a> <b>b3</b>
<a>a4</a> <b>b4</b>
<a>a5</a> <b>b5</b>
~~~
Und diese Regeln:
~~~css
b { color: green; }
a:active ~ b { color: blue; }
a:active ~ b ~ a ~ b { color: red; }
~~~
Ohne Klick sind alle b-Elemente grün. Klicke ich auf ein a-Element, wird das darauf folgende b-Element blau und alle weiteren rot.
**ABER**
Das müsste ja nicht so sein. Die zweite Regel matcht **jedes** b hinter einem a:active-Element. Die Existenz eines weiteren a Elementes ist für CSS also kein Grund, mit der Suche nach b Elementen aufzuhören. Das Matching ist *greedy*.
Wer sagt dem Browser, dass die dritte Regel *non-greedy* zu sein hat und das erste gefundene a hinter dem :active a matchen muss? CSS könnte ja auch wie in Regel 2 greedy vorgehen und solange b Elemente matchen, bis es nicht mehr anders geht, und dann das letzte a matchen.
Aus Performancegründen ist die non-greedy Logik vermutlich vorzuziehen, denn ein greedy-Verhalten setzt regexiges Backtracking voraus. Aber ich will nicht spekulieren. Weiß jemand, ob und wo dieses Verhalten **spezifiziert** ist? In CSS-Selectors 4 scheint das nicht zu stehen.
_Rolf_
--
sumpsi - posui - obstruxi
Greedyness von Kombinatoren
bearbeitet von
Hallo alle,
in MBs Frage zu seinen Kommentarblöcken ist mir etwas aufgefallen.
Gegeben sei dieses (Dummy-)HTML
~~~html
<a>a1</a> <b>b1</b>
<a>a2</a> <b>b2</b>
<a>a3</a> <b>b3</b>
<a>a4</a> <b>b4</b>
<a>a5</a> <b>b5</b>
~~~
Und diese Regeln:
~~~css
b { color: green; }
a:active ~ b { color: blue; }
a:active ~ b ~ a ~ b { color: red; }
~~~
Ohne Klick sind alle b-Elemente grün. Klicke ich auf ein a-Element, wird das darauf folgende b-Element blau und alle weiteren rot.
**ABER**
Das müsste ja nicht so sein. Die zweite Regel matcht **jedes** b hinter einem a:active-Element. Die Existenz eines weiteren a Elementes ist für CSS also kein Grund, mit der Suche nach b Elementen aufzuhören. Das Matching ist *greedy*.
Wer sagt dem Browser, dass die dritte Regel *non-greedy* zu sein hat und das erste gefundene a hinter dem :active a matchen muss? CSS könnte ja auch wie in Regel 2 greedy vorgehen und solange b Elemente matchen, bis es nicht mehr anders geht, und dann das letzte a matchen.
Aus Performancegründen ist die non-greedy Logik vermutlich vorzuziehen, denn ein greedy-Verhalten setzt regexiges Backtracking voraus. Aber ich will nicht spekulieren. Weiß jemand, ob und wo dieses Verhalten **spezifiziert** ist? In CSS-Selectors 4 scheint das nicht zu stehen.
_Rolf_
--
sumpsi - posui - obstruxi
Greedyness von Kombinatoren
bearbeitet von
Hallo alle,
in MBs Frage zu seinen Kommentarblöcken ist mir etwas aufgefallen.
Gegeben sei dieses HTML
~~~html
<a>a1</a> <b>b1</b>
<a>a2</a> <b>b2</b>
<a>a3</a> <b>b3</b>
<a>a4</a> <b>b4</b>
<a>a5</a> <b>b5</b>
~~~
Und diese Regeln:
~~~css
b { color: green; }
a:active ~ b { color: blue; }
a:active ~ b ~ a ~ b { color: red; }
~~~
Ohne Klick sind alle b-Elemente grün. Klicke ich auf ein a-Element, wird das darauf folgende b-Element blau und alle weiteren rot.
**ABER**
Das müsste ja nicht so sein. Die zweite Regel matcht **jedes** b hinter einem a:active-Element. Die Existenz eines weiteren a Elementes ist für CSS also kein Grund, mit der Suche nach b Elementen aufzuhören. Das Matching ist *greedy*.
Wer sagt dem Browser, dass die dritte Regel *non-greedy* zu sein hat und das erste gefundene a hinter dem :active a matchen muss? CSS könnte ja auch wie in Regel 2 greedy vorgehen und solange b Elemente matchen, bis es nicht mehr anders geht, und dann das letzte a matchen.
Aus Performancegründen ist die non-greedy Logik vermutlich vorzuziehen, denn ein greedy-Verhalten setzt regexiges Backtracking voraus. Aber ich will nicht spekulieren. Weiß jemand, ob und wo dieses Verhalten **spezifiziert** ist? In CSS-Selectors 4 scheint das nicht zu stehen.
_Rolf_
--
sumpsi - posui - obstruxi