Ich habe neulich in einem Artikel von Nicholas Cerminara (vorsichtig beim Besuch dieses Links, sieht so aus, als hätten sie einige Tracking-Skripte außer Kontrolle) gelesen, dass Bootstrap 4 einen neuen CSS-Reset integriert hat, den sie Reboot nennen.
Reboot, eine Sammlung elementbezogener CSS-Änderungen in einer einzigen Datei, startet Bootstrap, um eine elegante, konsistente und einfache Basis zum Aufbau zu bieten.
Wenn Sie neu in der CSS-Entwicklung sind, besteht die gesamte Idee eines CSS-Resets darin, sich mit Stilinkonsistenzen über verschiedene Browser hinweg zu befassen. Zum Beispiel habe ich gerade jetzt ein <button>-Element auf eine Seite mit keinerlei weiterer Formatierung gesetzt. Chrome wendet padding: 2px 6px 3px; an – Firefox wendet padding: 0 8px; an. Ein CSS-Reset würde neues padding auf dieses Element anwenden, damit alle Browser konsistent sind, was sie anwenden. Davon gibt es viele Beispiele.
Ein wenig zur Geschichte...
Im Jahr 2007 sammelte Jeff Starr eine Reihe verschiedener CSS-Resets. Der älteste davon ist Tantek Çeliks undohtml.css (das ist ein direkter Link zur Quelle). Wir sehen, dass der Zweck dahinter darin bestand, Standardstile abzustreifen.
/* undohtml.css */
/* (CC) 2004 Tantek Celik. Some Rights Reserved. */
/* http://creativecommons.org/licenses/by/2.0 */
/* This style sheet is licensed under a Creative Commons License. */
/* Purpose: undo some of the default styling of common (X)HTML browsers */
Bei weitem der beliebteste Reset kam kurz darauf: der Meyer-Reset. Er enthält andere Dinge als Tanteks (er wurde sogar mit einigen HTML5-Elementen aktualisiert), aber der Geist ist derselbe: Standardstile entfernen. Sie werden diesen berühmten Codeblock wahrscheinlich erkennen, der überall in Ihrem DevTools-Style-Panel zu finden ist.
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
Beginnen Sie mit einem Reset wie diesem (am Anfang Ihres Produktions-Stylesheets), und die Stile, die Sie danach schreiben, werden auf einem soliden Fundament stehen.
Jahre später, als HTML5 realer wurde, gewannen Resets wie Richard Clarks HTML5 Reset an Popularität. Es war immer noch eine modifizierte Version des Meyer-Resets, und er behielt diesen Geist bei.
article,aside,details,figcaption,figure,
footer,header,hgroup,menu,nav,section {
display:block;
}
Überall dazwischen gab es viele Entwickler, die minimalistisch vorgingen, indem sie einfach Margin und Padding von allem entfernten und es dabei beließen.
* {
padding: 0;
margin: 0;
}
Dumme Trivia: Das CSS-Tricks-Logo wurde vom Universal-Selektor und dieser Idee inspiriert.
Nun kommt Normalize.css...
Normalize.css stellt die erste sinnvolle Änderung im Geiste dessen dar, was ein CSS-Reset tun sollte. Das schien mir so anders zu sein.
- Es war eine neue Bewertung von allem, was sich browserübergreifend unterschiedlich stylen ließ, und es adressierte alles. Während ältere CSS-Resets eine Handvoll Codezeilen waren, ist das unkomprimierte und dokumentierte Normalize 447 Zeilen lang.
- Es entfernte keine Stile von Elementen, die bereits browserübergreifend konsistent waren (größtenteils). Zum Beispiel gibt es in Normalize nichts für h2-h6-Elemente, nur eine Korrektur für eine seltsame h1-Sache. Das bedeutet, Sie löschen keine Header-Hierarchie, diese Standardstile bleiben erhalten.
- Es war eher entgegenkommend für die Idee, es zu verändern, anstatt es einfach nur einzubinden. Zum Beispiel gibt es einen Abschnitt nur für das
<pre>-Tag und eine Zeile davon setzt seinefont-family. Sie könnten das zu der gewünschten Schriftart ändern, und es wäre genauso effektiv wie ein Reset.
Der Code ist zufriedenstellend zu lesen, da er erklärt, was er tut, ohne sich in Details zu verlieren.
/**
* 1. Remove the bottom border in Chrome 57- and Firefox 39-.
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
Heute ist Normalize bei Version 7.0.0 und hat fast 30.000 GitHub-Sterne. Es ist unglaublich beliebt.
Können Resets also voreingenommen sein?
Wir haben viele verschiedene Ansichten zu CSS-Resets gesehen und grundlegende Änderungen im Ansatz miterlebt, daher denke ich, es ist fair zu sagen, dass CSS-Resets eine voreingenommene Haltung einnehmen können.
Betrachten wir einige Möglichkeiten...
- Berührt der Reset jedes einzelne mögliche Element? Oder eine Teilmenge von Elementen? Wie entscheidet er, welche Elemente berührt und welche nicht?
- Welche Eigenschaften werden geändert? Nur solche mit browserübergreifenden Unterschieden? Oder ein anderes Kriterium, wie die Ähnlichkeit zu anderen Elementen, die Änderungen benötigten? Ist es in Ordnung, Eigenschaften auf Elemente anzuwenden, die keine browserübergreifenden Probleme haben, im Namen von Konsistenz und Effizienz?
- Versuchen Sie, den Geist der User-Agent-Stylesheet zu bewahren? Sinnvolle Standardwerte?
- Wenden Sie Eigenschaften an, die keine browserübergreifenden Probleme haben, aber als "Reset" von Vorteil angesehen werden könnten, wie typografische Standardwerte oder box-sizing?
- Nehmen Sie "Toolbox"-Klassen für gängige Bedürfnisse auf? Oder überlassen Sie das anderen Projekten?
- Macht die Größe Ihnen Sorgen?
- Verwenden Sie einen Präprozessor oder andere Tools?
Schauen Sie sich Vanilla CSS Un-Reset an. Viele Meinungen hier, beginnend mit der Idee, dass es dazu dient, Elemente neu zu stylen, nachdem Sie sie mit einem Reset un-gestylt haben. Es setzt die Body-Schriftgröße in pt, wählt eine sehr spezifische monospace Schriftart aus, enthält einen ol ol ol ol-Selektor, einen clearfix und Ausrichtungshilfeklassen. Kein Urteil hier. Leute erschaffen Dinge, um ihre eigenen Probleme zu lösen, und ich bin sicher, das war dem Schöpfer hilfreich. Aber wir können die Meinungen dort glänzen sehen.
Schauen Sie sich jetzt MiniReset.css an. Ganz anders! Es löscht Typografiestile "damit die Verwendung von semantischem Markup das Styling nicht beeinflusst", lässt aber einige Standardwerte bewusst bestehen "damit Schaltflächen und Eingaben ihr Standardlayout beibehalten", fügt einige Dinge hinzu, die keine browserübergreifenden Probleme haben, aber global nützlich sind (box-sizing), und fügt einige kleine Helfer für responsives Design hinzu.
Ein völlig anderer Satz von Meinungen dort.
Jonathan Neal hat einen Reset namens sanitize.css erstellt, der sehr klar seine Meinungen darlegt. Suchen Sie nach dem Wort "opinionated" im Quellcode und Sie werden es 19 Mal finden. All dies sind Entscheidungen, die Jonathan auf der Grundlage von Recherchen und dem, was wie moderne Best Practices aussieht, getroffen hat, und zweifellos mit seinen eigenen Bedürfnissen und Wünschen für das, was in einem Reset enthalten sein sollte, gespickt.
/*
* Remove the text shadow on text selections (opinionated).
* 1. Restore the coloring undone by defining the text shadow (opinionated).
*/
::-moz-selection {
background-color: #b3d4fc; /* 1 */
color: #000000; /* 1 */
text-shadow: none;
}
::selection {
background-color: #b3d4fc; /* 1 */
color: #000000; /* 1 */
text-shadow: none;
}
Das Wort "Reset"
Persönlich denke ich, es ist nützlich, sie alle unter dem gleichen Oberbegriff zu betrachten und sich einfach der philosophischen Unterschiede bewusst zu sein. Aber Normalize trennt sich bewusst.
Eine moderne, HTML5-fähige Alternative zu CSS-Resets
Sanitize nennt sich selbst eine CSS-Bibliothek und verwendet das Wort "reset" nicht, außer um den Meyer-Reset zu zitieren.
Neustart
Reboot ist interessant, da es vielleicht der neueste Akteur in dieser Welt ist. Seine Dateihistorie reicht bis 2015 zurück, was wahrscheinlich damit zusammenhängt, dass Bootstrap 4 nach Bootstrap 3 eine Weile zum Veröffentlichen brauchte. Reboot hat kein eigenes Repository, es ist Teil von Bootstrap. Hier ist die direkte Datei und die Dokumentation.
Die Art und Weise, wie sie darüber denken, ist interessant.
Reboot baut auf Normalize auf und liefert vielen HTML-Elementen etwas voreingenommene Stile, indem es nur Elementselektoren verwendet. Zusätzliche Formatierung erfolgt nur mit Klassen. Zum Beispiel starten wir einige
<table>-Stile für eine einfachere Basis neu und stellen später.table,.table-borderedund mehr zur Verfügung.
Sie können eine Klasse haben, die Stile anwendet, aber wenn Sie einen Reset verwenden, müssen Sie diese Klasse nicht mit Reset-Stilen überladen, die browserübergreifende Konsistenzprobleme lösen.
//
// Tables
//
table {
border-collapse: collapse; // Prevent double borders
}
caption {
padding-top: $table-cell-padding;
padding-bottom: $table-cell-padding;
color: $text-muted;
text-align: left;
caption-side: bottom;
}
th {
// Matches default `<td>` alignment by inheriting from the `<body>`, or the
// closest parent with a set `text-align`.
text-align: inherit;
}
Es ist definitiv voreingenommen, aber auf eine Weise, die gut zu Bootstrap passt. Die Tatsache, dass es in Bootstrap eingebettet ist, signalisiert ziemlich gut, dass es für diese Welt konzipiert ist und nicht als Drop-in für jedes Projekt. Dennoch habe ich mein Bestes getan, eine reine CSS-Version davon hier zu kompilieren.
Anpassen eines Resets basierend auf der Browserunterstützung
Solange wir über Vergangenheit und Zukunft von Resets sprechen, lohnt es sich, Browserslist noch einmal zu erwähnen, was ein standardisiertes Format zur Deklaration der von einem Projekt unterstützten Browser/Versionen ist.
Ein Reset könnte so aufgebaut sein, dass die enthaltenen Elemente wissen, warum sie da sind. Genau welchen Browser und welche Version sie unterstützen sollen. Wenn dann die Browserslist-Konfiguration besagt, dass dieser spezielle Browser sowieso nicht vom Projekt unterstützt wird, könnte dieser CSS-Code entfernt werden.
Das ist es, was PostCSS Normalize tut.
Es gibt einen interessanten Artikel über Resets und Reboots, der eine ganz andere Geschichte erzählt: https://meiert.com/en/blog/reasons-against-resets/
Wenn man einen Reset entfernen kann und das Layout gleich bleibt (es gibt gute Screenshots und Tests, aber ich kann sie nicht schnell finden), verstehe ich, warum Leute Resets problematisch finden. Dann sind sie nutzlos.
Ich habe noch nie Resets benutzt und nie Probleme gehabt.
Etwas damit ist sehr seltsam.
Ich denke, Chris hat das voll auf den Punkt gebracht. Die Geschichte der Resets war schon immer umstritten – welche man benutzen sollte (in jeder Ära der letzten 17 Jahre) bis hin zu der Frage, ob sie überhaupt verwendet werden sollten. Aber Normalize (obwohl oft als "Reset" bezeichnet) ist eigentlich kein klassischer Reset – es soll Probleme browserübergreifend im gleichen Sinne wie jQuery beheben. Normalize war sehr wichtig, als HTML5 herauskam, weil es den Browsern auch zeigte, welche Standardwerte die neuen semantischen Tags haben sollten (für die Browser, die nicht auf dem neuesten Stand der Spezifikation waren). Aber da die Browser besser geworden sind und heutzutage viel besser sind, hat die Nützlichkeit von Normalize abgenommen, aber ich glaube nicht, dass sie ganz verschwunden ist.
Ich verstehe, dass Sie sagten, Sie benutzen keine und haben keine Probleme, ich muss Ihnen vielleicht leicht widersprechen. Sie hatten wahrscheinlich einige Probleme, von denen Sie nichts wussten, in bestimmten seltsamen Randfällen in Browsern, die Sie nicht verwenden. Wenn Sie sich den Normalize-Code ansehen, wird sehr gut dokumentiert, welche Probleme er behebt. Probleme, von denen viele von uns nicht wussten, dass sie existieren.
Seine Methode ist irgendwie fehlerhaft (siehe Kommentare unten zu seinem Test: https://meiert.com/en/blog/stop-using-resets/). Er verglich die Ergebnisse desselben Browsers, nicht verschiedener Browser.
Ich habe alle Resets in das CSS meiner Frameworks integriert. Der Grund dafür war, dass der Reset überall dort benötigt wurde, wo das Framework benötigt wurde, und nirgends dort, wo ich das Framework nicht verwendete. (Verstehen Sie das?)
Außerdem fügte eine zusätzliche CSS-Schicht nur eine zusätzliche Datei hinzu, auf die man zurückgreifen konnte.
Das Endergebnis? Wir verwenden fast GAR KEINE Resets mehr. Ich verwende eine magische Schriftgrößenbasis für HTML, einen Box-Sizing-Tweak und Margin/Padding-Clear für Body/HTML. (Oh, und Block-Display für dumme alte Browser bei HTML5-Elementen)
Aber bedenken Sie selbst H1-H6, da jedes Website-Design eine Meinung zur Marge haben kann, warum sollten wir uns überhaupt darum kümmern, es zurückzusetzen? Sind wir Designer so engstirnig, dass wir nicht damit umgehen können, dass Chrome 3 Pixel mehr Margin hat als Firefox? Und wenn es wichtig ist, packen Sie das in das tatsächliche DESIGN (Meinung) und nicht in den Reset/Framework (Basis).
Halleluja dafür!
Eine Zeit lang hatte ich ein paar Inline-CSS auf einem Element auf meiner Website, da Chrome das Flexbox-Layout seltsam handhabte und es ungewöhnlich breit machte. Aber letztendlich habe ich es entfernt, da ich erkannte, dass es wirklich keine Rolle spielte.
Ich liebe das Bootstrap Reboot CSS Reset. Ich weiß, Chris hat eine reine CSS-Version erstellt, aber ich habe auch eine reine CSS-Version erstellt, aber ich habe alle SASS-Kommentare aus der SASS-Datei hinzugefügt und sie in reine CSS-Kommentare umgewandelt. Warum? Ich unterrichte CSS und dachte, es wäre hilfreich für meine Studenten, die sehr aufschlussreichen Kommentare des Bootstrap- (oder Normalize-)Teams zu sehen, warum sie bestimmte Reset-Stilentscheidungen getroffen haben. Ich unterrichte Resets vor SASS. Wahrscheinlich nicht nützlich für jemanden hier, aber wenn Sie die Datei als Referenz haben möchten, können Sie sie hier herunterladen: https://github.com/michaelwhyte/bootstrap-reboot/blob/master/bootstrap-reboot-with-comments.css
Was es wert ist, ich habe eine ganz andere Ansicht von "Resets": http://www.cssmojo.com/css-reset_versus_css-starter/
CSS Reset, sind alle gut. Es ist auch schön zu sehen, wie sie sich entwickelt haben. Bis Normalize aufkam, hatten die meisten Browser bereits eine gewisse Konsistenz. Aber hat die Leistung von Websites durch das Zurücksetzen von allem und die erneute Anwendung durch diese Resets beeinträchtigt? Und wenn sie vom CSS-Autor erneut angewendet werden?
Ich habe eine Seite gemacht, auf der Sie verschiedene Resets hier in der Vorschau anzeigen können (mit HTML5-Küchenspüle).
Danke dafür, was dies zeigt, ist, dass die meisten dieser Resets völlig nutzlos sind. Browserübergreifende Display-Probleme beheben, JA. Die Standard-Schriftart, Linkfarbe, Textfarbe ändern? Hä? Wer in seinem rechten Verstand würde jemals die Standard-Schriftart oder irgendwelche Farben des Browsers in einem Design verwenden?
Um die Kritik eines anderen Artikels zum Zustand von Resets zu wiederholen, warum diese Werte dreimal setzen? (Browser -> Reset -> Site Design)
Welche dieser Bibliotheken hilft also wirklich bei tatsächlichen Multi-Browser-Problemen? Das ist der einzige wirkliche Wert, den ich in so etwas wie einem Reset sehe.
@Daniel Ziemlich praktisch!