Cheatah: CSS/3.0: Vorfahren-Selektoren

Hi,

meine Frage richtet sich an alle jene, die in die Aktivitäten des W3C etwas mehr involviert sind als ich. Genauer gesagt habe ich ein Verständnisproblem zu den Begründungen, die zu folgendem Anliegen regelmäßig gegeben werden.

In der W3C-Mailingliste zu CSS wird öfter angefragt, ob dem Selectors-Modul ein Eltern- oder Vorfahrenselektor hinzugefügt werden könne (sinnvolle Suchbegriffe sind z.B. "selector" ;-), "parent", "predecessor" und ":matches"). Dies wird immer wieder abgelehnt mit der Behauptung, derlei Selektoren verursachten Performance-Probleme, oder "it doesn't fit the CSS processing model". Belegt werden diese Behauptungen nirgendwo, soweit ich es sehen konnte.

Wieso sollte ein Parent Selector die Performance beeinträchtigen? Ab und zu wird von einem Aufwand O(n*n) gesprochen, ich jedoch erkenne nur ein O(1), zumal die maximale Zahl von Eltern eines Elements recht statisch ist. Ein Vorfahren-Selektor benötigt IMHO O(n), wobei dieses n tendenziell eher klein ist, wenn man es mit dem Nachfahren-Selektor vergleicht. Auch finde ich das o.g. "CSS processing model" nirgendwo - möglicherweise werden meine Fragen dort geklärt, daher wäre ich über einen Link dankbar.

Hat sich jemand mit der Thematik bereits beschäftigt und kann mich erhellen? Gleichwohl würde ich mich über eine Diskussion über den Vorschlag folgender Selektoren freuen:

"E    F" -- Nachfahrenselektor (CSS/1.0)
"E >  F" -- Kindselektor (CSS/2.0)
"E >> F" -- Synonym zu "E F"
"E <  F" -- Vaterselektor
"E << F" -- Vorfahrenselektor

Das "E >> F" dient der Symmetrie zu "E << F" und sollte "E F" ablösen, ähnlich der "::xyz"-Syntax bei Pseudoelementen. Meiner Ansicht nach ist dieser Vorschlag kompatibel und unproblematisch; es sei denn, man rechnet mit fehlerhafter(?) Implementierung bestehender Engines, die z.B. ">>" als ">*>" ansehen.

Meinungen?

Cheatah

P.S.: Besonders schade finde ich, dass auf ähnliche Artikel in der Mailingliste keine Reaktion erfolgt ...

--
X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
  1. Hi,

    Wieso sollte ein Parent Selector die Performance beeinträchtigen? Ab und zu wird von einem Aufwand O(n*n) gesprochen, ich jedoch erkenne nur ein O(1), zumal die maximale Zahl von Eltern eines Elements recht statisch ist. Ein Vorfahren-Selektor benötigt IMHO O(n), wobei dieses n tendenziell eher klein ist, wenn man es mit dem Nachfahren-Selektor vergleicht. Auch finde ich das o.g. "CSS processing model" nirgendwo - möglicherweise werden meine Fragen dort geklärt, daher wäre ich über einen Link dankbar.

    Es kommt immer drauf an, von welcher Seite man das betrachtet.

    Nimmt man einen Selektor und sucht dazu die passenden Elemente?
    Oder hat man ein Element und sucht dazu die passenden Rulesets/Selektoren?

    Wenn ich einen Browser implementieren würde, würde ich eher nach der zweiten Version vorgehen:
    Um die Elemente darzustellen, durchlaufe ich den DOM-Baum.
    Bei jedem Knoten == Element gucke ich, welche Selektoren darauf zutreffen, um die Darstellung des Elements zu regeln.
    Mit den bisherigen Selektoren brauche ich dazu nur das Wissen über das Element selbst sowie dessen Vorfahren bis zum Root-Element *).
    Diese Information liegt mir bereits vor, da ich ja im DOM-Baum über diese Vorfahren-Elemente gewandert bin, um zum aktuellen Element zu gelangen.
    Mit einem Vorfahren-Selektor würde sich das ändern - ich bräuchte auch Informationen über die Kinder, Enkel, Urenkel, sprich: alle Elemente unterhalb des aktuellen Knotens.

    *) sowie ggf. noch die Geschwister auf den Ebenen vom aktuellen Element bis hoch zum Root-Element.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      Es kommt immer drauf an, von welcher Seite man das betrachtet.

      Nimmt man einen Selektor und sucht dazu die passenden Elemente?
      Oder hat man ein Element und sucht dazu die passenden Rulesets/Selektoren?

      Wenn ich einen Browser implementieren würde, würde ich eher nach der zweiten Version vorgehen:

      das ist natürlich ein Punkt. Allerdings muss der Browser ohnehin während des Ladens die bisherigen Ergebnisse ständig revidieren - spätestens anonyme Elemente wie eine table-row zwischen einem table- und vielen table-cell-Elementen machen dies notwendig[1], und auch :last-child und Konsorten sind ganz klare Kandidaten dafür.

      Gut. Ich bin zwar immer noch nicht bereit, die Performance-Begründung als Ausschlusskriterium zu akzeptieren, aber Du hast immerhin mein Verständnis gefördert. Danke!

      Cheatah

      [1] Andernfalls werden in eine Zeile gehörende table-cell-Elemente plötzlich in mehrere Zeilen aufgeteilt.

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Cheatah,

    ich weiss nicht, wie aktuell die inoffizielle www-style FAQ ist, aber die dort genannten Einschränkungen dürften wie von Andreas erklärt das www-style-Abschmettern erklären. Insbesondere der Vorzug für inkrementelles Rendering.

    "E <  F" -- Vaterselektor

    „Selektiert E, wenn F ein Kindknoten von E ist“

    "E << F" -- Vorfahrenselektor

    „Selektiert E, wenn der F-Knoten irgendwo ein Nachfahre von E ist“

    Nehmen wir mal ein XML:

    ~~~xml <E attr="value">
        <n1/>
        <n2>
          <n3>
          <n4>
        </n2>
        <n5/>
        <F/>
      </E>

      
    Als Browser hat man <e attr="value"> geparst, hat daraufhin ein E-DOMElement-Knoten erstellt, alle anderen Selektoren darauf überprüft, ob sie darauf zutreffen, und weil man inkrementell rendert eine (oder ::mehrere Boxen) in den Viewport eingefügt, die nun mit Inhalt befüllt werden.  
      
    Man weiss aber noch nicht, ob nun die Regeln mit Vorfahrenselektoren zutreffen. Dazu muss man erst <n1>, <n2>, <n3>, <n4>, <n5> und <F> parsen und in DOM-Knoten verwandeln und Selektoren darauf anwenden und in das Dokument einfügen, ehe man weiss, dass "E << F { font-size:10em; }" hier wieder alles bislang gerenderte zunichte macht und man neu rendern muss.  
      
      
    Tim
    
    1. Hi,

      ich weiss nicht, wie aktuell die inoffizielle www-style FAQ ist, aber die dort genannten Einschränkungen dürften wie von Andreas erklärt das www-style-Abschmettern erklären. Insbesondere der Vorzug für inkrementelles Rendering.

      ja, danke Dir und auch Orlando für die entsprechenden Links und Erklärungen. Eins aber noch:

      "E <  F" -- Vaterselektor
      „Selektiert E, wenn F ein Kindknoten von E ist“

      Dies sollte lauten: „Selektiert _F_, wenn _E_ ein Kindknoten von _F_ ist“. Ich sehe keinen Grund, hier plötzlich mit der Reihenfolge zu brechen. Analoges gilt natürlich für den Vorfahrenselektor.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
  3. In der W3C-Mailingliste zu CSS wird öfter angefragt, ob dem Selectors-Modul ein Eltern- oder Vorfahrenselektor hinzugefügt werden könne […] Dies wird immer wieder abgelehnt mit der Behauptung, derlei Selektoren verursachten Performance-Probleme, oder "it doesn't fit the CSS processing model". Belegt werden diese Behauptungen nirgendwo, soweit ich es sehen konnte.

    P.S.: Besonders schade finde ich, dass auf ähnliche Artikel in der Mailingliste keine Reaktion erfolgt ...

    Recht viele Antworten erhielt http://lists.w3.org/Archives/Public/www-style/2006Sep/thread.html#msg211. Die Argumentation gegen Elternselektoren läuft dort stets auf die Verunmöglichung inkrementellen Renderings hinaus. Unmöglich im Sinne von adäquat schnell. Stelle ich mir ein wirklich großes Dokument mit tiefer Verschachtelung vor, dürften die meisten CSS-Implementierungen schnell überfordert sein.

    Björn Höhrmann lieferte allerdings bereits 2004 ein meines Erachtens weit stichhaltigeres Argument: Besser geeignetere Sprachen existieren.

    Roland

    --
    -)