Nicolas Gallagher (@necolas) ist ein Frontend-Entwickler bei Twitter und hat an großen Projekten wie HTML5 Boilerplate und Normalize.css mitgearbeitet. Nicolas sprach darüber, alte Annahmen über die Frontend-Webentwicklung zu hinterfragen.
Dies sind meine Notizen von ihrem Vortrag auf der W3Conf in San Francisco als Teil dieser Live-Blog-Serie.
„Best Practices“ sind keine „absoluten Wahrheiten“.
Nicolas war länger Anthropologiestudent als Webentwickler.
Heraklit (535 v. Chr.): Philosoph. Verachtung für die Menschheit. Elend ist der Weg. Trauriger Keanu seiner Zeit. Starb, indem er Kuhmist auf sich rieb und sich in die Sonne legte. Hauptidee: Alles ist eine Illusion. „Man kann nicht zweimal in denselben Fluss treten; denn frisches Wasser fließt auf dich ein.“
Demokrit (460 v. Chr.): Auch Verachtung für die Menschheit. Der „lachende Philosoph“. Der erste Troll der Welt. Erhaltung von Masse und Energie. Atome.
Diese Ideen blieben Tausende von Jahren liegen, bis die Wissenschaft sie entdeckte. Platon und Aristoteles lehnten diese Ideen ab, aber man kann es ihnen nicht verübeln. Die Ideen kamen zurück, als die Zeit reif war.
Die Webentwicklung ist ebenfalls eine Welt sich ständig ändernder Kontexte. Nicolas zweifelt weiterhin an Annahmen, die selbst vor sechs Monaten noch wahr waren.
HTML-Klassenattribute wurden für CSS1 hinzugefügt, „um die Granularität der Kontrolle über Elemente zu erhöhen“.
Der CSS Zen Garden (2003) bestand aus einer HTML-Seite, aber es gab viele verschiedene Designs dafür, bei denen nur das CSS geändert wurde.
Echte Aussagen von echten Leuten und echten Spezifikationen
„Verwenden Sie keine unsemantischen Klassennamen.“
„Ihr HTML ist wie Diamanten, für immer.“
„Autoren werden ermutigt, Klassenattributwerte zu verwenden, die die Art des Inhalts beschreiben, anstatt Werte, die die gewünschte Darstellung des Inhalts beschreiben.“
Das ist für Nicolas verrückt. Er hat seinen Blog einmal mit null Klassen gestaltet. Er machte (sogenannte „perfekte Semantik“). Aber Änderungen vorzunehmen wurde unpraktisch. Schwer zu lesen. Schwer zu verstehen. Schwer, Stiländerungen vorzunehmen.
Das ist wahrer
„Klassennamen sind für uns, nicht für Maschinen.“ — @necolas #w3conf
— Carwin Young (@carwin) 22. Februar 2013
Es gibt jedoch die Vorstellung von „hässlichen“ HTML-Klassennamen. Diese Art von Klassennamen ist im Moment angesagt: `hyphenated-lowercase-4-life`. Z.B.
.button { }
.button-group {}
.button-primary {}
.button-group-item {}
Diese Art von Dingen vermittelt nicht viel. Vergleichen Sie das mit diesen „hässlichen“ Klassennamen
.Button {}
.ButtonGroup {}
.Button--primary {}
.ButtonGroup-item {}
Diese Namenskonvention vermittelt viel mehr. Doppelte Bindestriche sind ein Modifikator. Ein einfacher Bindestrich ist ein Elementkind. Diese sind nicht hässlich. Sie sind im Moment vielleicht nicht angesagt, aber vielleicht werden sie es ja. Dieses Muster stammt vom russischen Suchmaschinenanbieter Yandex.
#W3Conf Also nach der ungarischen Notation für C schlägt @necolas die russische Notation für CSS-Klassen vor (von Yandex)
— Kevin Marks (@kevinmarks) 22. Februar 2013
Hinweis: Möglicherweise gibt es historische Gründe dafür, warum Klassennamen bestimmte Zeichen haben
#w3conf Es gibt tatsächlich einen historischen Grund, warum wir Unterstriche in Klassen- (und ID-)Namen vermieden haben: developer.mozilla.org/en-US/docs/Und…
— Eric A. Meyer (@meyerweb) 22. Februar 2013
Eine weitere alte Best Practice lautet: „Verwenden Sie keine zusätzlichen Elemente.“ Nicolas ist tief in die Welt der Pseudo-Elemente eingetaucht, um die Verwendung zusätzlicher Elemente zu vermeiden. Rückblickend hat dies das Verständnis dessen, was vor sich geht, erheblich erschwert. Nicht, dass „Junk“-Markup gut ist, aber Dinge wie Web Components ergeben viel mehr Sinn.
CSS ist das falsche Werkzeug, um dem Inhalt/Design Struktur zu verleihen. HTML ist dafür da. Web Components gibt uns die Möglichkeit, die richtigen Werkzeuge zu verwenden, ohne sich Gedanken über „Junk“-Markup machen zu müssen.
Ist es also klug, die BEM-Namenskonvention mit Unterstrich/Bindestrich zu verwenden, die Nicolas verwendet, oder nicht?
Ich denke, die Antwort ist wie immer… „es kommt darauf an“
@dimitrie Es liegt an Ihnen, Unterstriche können Probleme verursachen, weshalb Yandex wahrscheinlich auf einfache und doppelte Bindestriche umgestiegen ist, um zwischen Elementen und Modifikatoren zu unterscheiden.
Ob Sie BEM als Namenssystem übernehmen, liegt bei Ihnen / Ihrem Team.
Ich denke, die Quintessenz hier ist, dass ein Namenssystem als Teil Ihres Styleguides eine gute Idee ist. Es wird ein wenig dauern, bis man sich daran gewöhnt hat, aber sobald es in Ihre Dokumente eingeprägt ist, werden Sie viel Zeit sparen, wenn Sie darüber nachdenken, wie Sie Ihre Klassen benennen sollen.
Ich habe gerade mit der Planung der Verwendung von BEM-Namenskonventionen für neue Projekte begonnen – ich weiß, dass es am Anfang mühsam sein wird, aber ich sehe große Vorteile für die Zukunft. SASS war am Anfang mühsam, aber ich möchte es jetzt nicht mehr missen.
Solange Sie keine Browser **unterhalb** von IE 6, Netscape 7, Navigator 5 oder Opera 6 unterstützen, ist die Verwendung von Unterstrichen absolut sicher. Ob Sie sie verwenden möchten, bleibt Ihnen überlassen.
(Lesen Sie: „Historisch“)
Sie sagen auch, dass es keine „absoluten Wahrheiten“ gibt, aber es ist immer ratsam, einigen gebräuchlichen Verfahren zu folgen.
Gute Themen, bitte weiter so…
Klingt nach einem großartigen Vortrag. Ich denke, wir müssen „Best Practices“ neu überdenken.
Ich habe den Link von Eric Meyer über Unterstriche gelesen. Wenn Sie ihn lesen, werden Sie sehen, dass die Verwendung von Unterstrichen in IDs/Klassennamen nicht funktioniert in **Netscape Navigator 4.x** und **Opera 3.x bis 5.x**.
Wenn es 1998 wäre, könnte ich verstehen, warum man keine Unterstriche in ID/Klassennamen verwendet, aber es ist 2013.
Ich bevorzuge die Verwendung von Bindestrichen bei der Benennung von Klassen.
Obwohl ich zuvor Unterstriche für Modulkomponenten verwendet habe, oder was Yandex als Elemente bezeichnet. Wenn ich einen Überschriftentitel in meiner Notiz hätte, könnte ich eine Klasse verwenden wie.
Ich konnte mir auch vorstellen, eine andere Namenskonvention zu entwickeln wie
Die steigende Popularität von Webanwendungen verändert vieles in der Welt der Webentwicklung und der Best Practices. OOCSS entstand aus Webanwendungen, und aus OOCSS heraus haben wir begonnen, die bisherigen Best Practices zu hinterfragen. Jetzt sind wir mit weniger Semantik zufrieden (Webanwendungen werden sowieso nicht von Suchmaschinen gelesen), mehr Klassen, viel mehr mehrdeutigen Attributen (data-) und mehr Markup.
Ich denke, es ist ziemlich klar, dass es zwei Zweige der Webentwicklung gibt – es gibt Websites und es gibt Webanwendungen. Sie verwenden dieselben Werkzeuge, haben aber völlig unterschiedliche Bedürfnisse. Daher müssen die Best Practices, die beide umgeben, für jede einzigartig sein.
Viele Leute, mich eingeschlossen, fragen sich tatsächlich, ob ein Dokumentenformat (was HTML ist) das beste Werkzeug für die Erstellung von Webanwendungen ist. Es ist das Werkzeug, das wir haben, aber ist es das richtige Werkzeug? Das ist eine weitere Annahme, die hinterfragt werden muss – dass eine Webseite letztendlich auf HTML, CSS und JavaScript aufgebaut sein muss. Gibt es keinen Raum für andere Formen nativ ausführbaren Codes in einem Browser?
Ich sehe eigentlich keine Notwendigkeit, das HTML-Dokument als grundlegendes Container aufzugeben. Es ist nicht auf HTML, CSS und JavaScript beschränkt. Ich benutze auch PHP, MySQL und werde Node.js, IndexDB, Python, Ruby und andere verwenden, wenn ich sie lerne.
Ein gemeinsames Dokumenten-Container für webbasierte Inhalte, ob als App oder statisches Dokument betrachtet, macht das Web für Browserhersteller und Benutzer irgendwie besser handhabbar. Es schränkt die Vielfalt möglicher Interaktionen mit einer Website nicht ein.
Ich denke, die ganze Vorstellung, Apps nutzen zu müssen, die von einer Handvoll Megakonzerne siloisiert sind, nur weil man vom Laptop zum Smartphone gewechselt hat, muss verschwinden. Ich denke auch, dass die neuen und aufkommenden Generationen von SOCs kleineren tragbaren Geräten die Kapazität geben werden, bei der Rechenleistung aufzuholen.
Websites oder Webanwendungen, OOCSS passt zu beidem und funktioniert dort sehr gut. Wie Necolas sagte: Klassennamen sind für Entwickler da, nicht für Maschinen. OOCSS ist einfach ein Ansatz, um Klassennamen für uns härter arbeiten zu lassen.
Manchmal denke ich, dass Object Oriented CSS ein schlechter Name für das ist, was es ist. Es impliziert eine völlig neue Sprache oder zumindest eine völlig neue Art, CSS anzugehen; aber es ist keines von beiden, es ist eine Herausforderung dessen, was wir als Best Practices betrachten, durch das, was tatsächlich funktioniert.
Es gab keine wirkliche Abweichung von Webanwendungen und Websites. Sicher, das Konzept der Webanwendungen ist in den letzten Jahren entstanden, aber es war nichts Neues und kein vollständiger Bruch zwischen den beiden. Sowohl Websites als auch Apps haben sich zusammen und auf die gleiche Weise verändert.
Die Idee ist, dass das Web erwachsen geworden ist, aber unsere Best Practices mehr oder weniger nicht.
Nicole Sullivans Ziel war es nicht, das Rad neu zu erfinden. Sie sah, dass unsere Best Practices keine optimalen Ergebnisse lieferten, und sie sah ein Muster, das nicht dokumentiert war, aber sehr gut funktionierte.
Schließlich erweitern sich HTML/CSS/JS über den Browser hinaus. Sie sind extrem mächtige Werkzeuge, die nicht so schnell ersetzt werden (und wahrscheinlich niemals ersetzt werden sollten).
@JamesKyle danke :D das war die klarste Antwort
Die Leute scheinen die BEM-Methodik überhaupt nicht zu verstehen. Es geht nicht um Unterstriche, Bindestriche oder Camel Case. Es ist **Block-Element-Modifikator**, es geht darum, Ihren Klassennamen Struktur zu geben, die von einem gesamten Projekt oder einer Organisation verstanden werden kann.
Das System, das ich verwende, ist
Beispiel mit einem CSS-Präprozessor
Der generierte CSS-Output wäre
Dafür wäre der Markup
Sie könnten Unterstriche und Bindestriche durch alles ersetzen, was Sie wollen. Wichtig ist, ein System zu konstruieren, das Ihnen hilft, Ihre Stile so zu organisieren, dass Sie Zeit sparen. Ich habe meines optimiert, damit ich nicht ständig wirklich lange Klassennamen schreiben muss (die sich schnell ansammeln).
Mein Ansatz zur Klassennamengebung ist die Verwendung von teilweise semantischen, teilweise generischen Begriffen. Z.B.
#nav-facebook{float:right;margin:0;padding:5px 20px 5px 0;}#logo-container{position:relative;top: 18px;max-width: 550px;}#logo{width: 100%;z-index: 0;}#logo-position-fix {max-width:1080px;margin:auto;}.headerbg{background:url(images/soul-sanctuary-header-bg.jpg) center center #000;height:100%;}Es ist schön, ein System zu haben, nach dem man arbeiten kann, und eines, das andere lesen können, wenn man mit anderen Programmierern zusammenarbeitet, aber ich denke, wenn man zu viel Zeit damit verbringt, sich zu fragen, wie eine Klasse oder ID heißen soll, wird man nie etwas fertigstellen. Wenn Ihr System verständlich und effizient ist. Das ist die Hauptsache.
Darum geht es, sich ein System auszudenken, das für Sie funktioniert, und es zu verwenden, damit Sie nicht jedes Mal über Selektoren nachdenken müssen, wenn Sie einen schreiben.
Wenn Sie kein System haben (insbesondere wenn Sie in einem Team arbeiten), wird jeder Selektor, den Sie schreiben, Ihre Codebasis verschlechtern, bis sie unüberschaubar wird.
Was ich heutzutage seltsam finde, ist, dass die Verwendung von Klassen für die Bearbeitung von Dingen mit CSS zunehmend weniger nützlich wird. Der schlimmste limitierende Faktor heutzutage ist IE8 (zusätzlich zu einigen mobilen Browsern), der viele der neuen CSS3-Selektoren nicht unterstützt, insbesondere :nth-of-type, :target oder :checked, die sehr nützlich sein können.
Im Allgemeinen stelle ich fest, dass Klassen oft für JavaScript-Entwickler vorhanden sind, damit sie dieselben CSS-Klassennamen wie Variablennamen verwenden können. Aber wenn ich aus der reinen HTML- und CSS-Perspektive arbeite, verwende ich lieber Klassen nur auf Elternelementen und bearbeite dann direkt die eigentlichen Elemente. Ein aktuelles Beispiel dafür…
HTML
CSS
Alle aktuellen großen Desktop-Browser spielen gut mit dieser Syntax, und ich finde sie auch ziemlich lesbar. Viele Interaktionen können allein mit HTML und CSS durchgeführt werden, man braucht kein JavaScript für viele dieser einfachen Übergänge. Zum Beispiel könnte die Suchleiste auf dieser Seite problemlos in reinem HTML und CSS realisiert werden.
Natürlich verstehe ich, dass die Übernahme dieses Ansatzes für ein großes Projekt etwas anderes ist.
MEINE AUGEN!!!!
Im Ernst, ich hoffe, Sie verwenden nicht tatsächlich solche Selektoren. Selbst wenn jeder Browser sie unterstützen würde, wären sie immer noch keine gute Idee.
Außerdem haben sich Klassen nicht geändert, wie könnten sie also weniger nützlich sein?
Sie sagen „keine gute Idee“, aber Sie geben keine Begründung.
Hahaha, nun, erstens haben Sie, wie ich bereits sagte, keine Browserunterstützung. Zweitens, in welchem Projekt verwenden Sie mehr Selektoren wie diese als Klassen? Drittens, wenn es ein solches Projekt gibt, müssen Ihre Stile riesig sein. Viertens, wenn das, was ich glaube, was Sie mit diesen Selektoren tun, das ist, was Sie tatsächlich tun, dann sollten Sie JavaScript und nicht CSS verwenden (Stil vs. Funktion). Fünftens, dieser Code ist vollständig vom Markup abhängig (eine winzige Sache bricht alles). Sechstens, verdammt, dieses CSS ist hässlich. Siebtens, nur weil etwas getan werden kann, heißt das nicht, dass es getan werden sollte. Achtens, reichen das noch nicht aus? Neuntens, es gibt tausend Wege, wie Sie saubereren und kürzeren Code schreiben könnten als das. Zehntens, lesen Sie ein Buch. Elftens, ich bin hier fertig.
Obwohl Sie komplexe Selektoren mit CSS3 erstellen können, wie Sie gezeigt haben, würde ich es nicht wirklich empfehlen. Gründe, warum ich es nicht tue, sind:
Browserunterstützung in IE8 ist nicht vorhanden
Ihre Stile sind nicht sehr modular. Sie können nicht an vielen Stellen verwendet werden, da sie an diese spezifischen DOM-Abschnitte gebunden sind.
Ihr CSS/HTML ist stark gekoppelt und daher fragil. Wenn Sie ein einziges neues HTML-Element in Ihr DOM einfügen, könnte dies potenziell Ihre gesamte Formatierung beeinträchtigen.
Es ist ein Spezifitäts-Albtraum. Wenn Sie eines dieser Elemente anders als die anderen gestalten möchten, müssen Sie entweder einen längeren Selektor erstellen, eine ID verwenden oder das gefürchtete `!important` verwenden.
Ich style fast ausschließlich mit Klassen und wenn ich IDs/Klassen in meinem JavaScript verwenden möchte, benutze ich ein `js-` Präfix, z. B. `js-rotator`. Ich verwende niemals CSS-Styling-Klassen in meinem JS, da ich dadurch mein Markup/CSS ändern kann und es keine Auswirkungen auf das JS hat.