Ich habe mir kürzlich diesen Becher für die Arbeit gekauft. Als professioneller Webentwickler entschied ich, dass er mich als König der Ironie im Büro etablieren würde. Der Witz darauf ist natürlich nicht einzigartig. Ich habe ihn überall gesehen, von T-Shirts bis hin zu Konferenzpräsentationen.

Die meisten von Ihnen, die dies lesen, sind wahrscheinlich mindestens einmal mit diesem Bild in Berührung gekommen. Es ist ein Witz, mit dem wir uns alle identifizieren können, oder? Sie versuchen, etwas Einfaches mit CSS zu machen, und die mysteriösen Wege, auf denen sogar grundlegende Eigenschaften interagieren, machen es unweigerlich kaputt.
Wenn dieser Witz die kollektive Frustration widerspiegelt, die Entwickler mit CSS haben, dann wollte ich, auf die Gefahr hin, den Spaß zu verderben, die zugrunde liegende Fehlfunktion als Fallstudie untersuchen, warum Leute von CSS frustriert sind.
Das Problem
Siehe den Pen CSS ist Großartig von Brandon (@brundolf) auf CodePen.
Es gibt drei Bedingungen, die erfüllt sein müssen, damit dieses Problem auftritt
- Der Inhalt kann nicht schrumpfen, um in den Container zu passen
- Der Container kann nicht wachsen, um den Inhalt aufzunehmen
- Der Container behandelt Überlauf nicht ordnungsgemäß
In realen Szenarien ist die zweite Bedingung am wahrscheinlichsten das Problem, das behoben werden muss, aber wir werden alle drei untersuchen.
Größe des Inhalts anpassen
Dies ist ein wenig unfair gegenüber dem Inhalt der Box, da das Wort **AWESOME** bei der gegebenen Schriftgröße und Containerbreite nicht auf einer Zeile Platz findet. Standardmäßig wird Text am Leerzeichen umgebrochen und Wörter nicht getrennt. Aber nehmen wir für einen Moment an, dass wir die Größe des Containers auf keinen Fall ändern können. Vielleicht ist der Text zum Beispiel eine aufgeblasene Überschrift auf einer Website, die auf einem besonders kleinen Handy betrachtet wird.
Wörter umbrechen
Damit ein durchgehendes Wort umgebrochen wird, müssen wir die CSS-Eigenschaft word-break verwenden. Wenn wir sie auf break-all setzen, wird der Browser angewiesen, Wörter bei Bedarf zu trennen, um Textinhalte innerhalb ihres Containers umzubrechen.
Siehe den Pen CSS ist Großartig: word-break von Brandon (@brundolf) auf CodePen.
Anderer Inhalt
In diesem Fall war die einzige Möglichkeit, den Inhalt responsiver zu gestalten, die Aktivierung des Wortumbruchs. Aber es gibt andere Arten von Inhalten, die überlaufen könnten. Wenn word-wrap auf nowrap gesetzt wäre, würde der Text nicht einmal zwischen Wörtern umgebrochen. Oder der Inhalt könnte ein Block-Level-Element sein, dessen width oder min-width größer als die Breite des Containers ist.
Containergröße anpassen
Es gibt viele mögliche Wege, wie das Container-Element gezwungen werden könnte, nicht zu wachsen. Zum Beispiel: width, max-width und flex. Aber was sie alle gemeinsam haben, ist, dass *die Breite durch etwas anderes als seinen Inhalt bestimmt wird*. Das ist an sich nicht schlecht, besonders da es keine feste Höhe gibt, was in den meisten Fällen dazu führen würde, dass sich der Inhalt einfach nach unten ausdehnt. Aber wenn Sie auf eine Variation dieser Situation stoßen, lohnt es sich zu überlegen, ob Sie die Breite wirklich *kontrollieren* müssen oder ob sie der Seite überlassen werden kann.
Alternativen zur Festlegung der width
Meistens meinen Sie, wenn Sie die width eines Elements festlegen und diese in Pixeln angeben, eigentlich min-width oder max-width. Fragen Sie sich, was Ihnen wirklich wichtig ist. Verschwand dieses Element ganz, wenn es keinen Inhalt hatte, weil es auf eine Breite von 0 schrumpfte? Setzen Sie min-width, damit es Abmessungen hat, aber immer noch Platz zum Wachsen hat. Wurde es so breit, dass ein ganzer Absatz auf einer Zeile Platz fand und schwer zu lesen war? Setzen Sie max-width, damit es nicht über ein bestimmtes Limit hinausgeht, aber auch auf kleinen Geräten nicht über den Bildschirmrand hinausragt. CSS ist wie ein Assistent: Sie wollen ihn leiten, nicht jeden seiner Schritte diktieren.
Überlauf durch Flexbox verursacht
Wenn eines Ihrer Flex-Items überlaufenden Inhalt hat, wird es etwas komplizierter. Das Erste, was Sie tun können, ist zu prüfen, ob Sie seine Breite angeben, wie im vorherigen Abschnitt. Wenn nicht, passiert wahrscheinlich, dass das Element "flex-shrinking" betreibt. Flex-Items werden zuerst nach den normalen Regeln dimensioniert; width, Inhalt usw. Die resultierende Größe wird als ihre flex-basis bezeichnet (die auch explizit mit einer gleichnamigen Eigenschaft festgelegt werden kann). Nach der Festlegung der Flex-Basis für jedes Item werden flex-grow und flex-shrink angewendet (oder flex, das beides auf einmal angibt). Die Items wachsen und schrumpfen gewichtet, basierend auf diesen beiden Werten und der Containergröße.
Das Festlegen von flex-shrink: 0 weist den Browser an, dass dieses Item niemals kleiner als seine Flex-Basis werden soll. Wenn die Flex-Basis durch Inhalt bestimmt wird (Standard), sollte dies Ihr Problem lösen. Seien Sie damit aber vorsichtig. Möglicherweise stoßen Sie im Elternteil des Elements wieder auf dasselbe Problem. Wenn sich dieses Flex-Item weigert zu schrumpfen, selbst wenn der Flex-Container kleiner ist als es, wird es überlaufen und Sie sind wieder am Anfang.
Überlauf behandeln
Manchmal gibt es einfach keinen Ausweg. Vielleicht ist die Containerbreite durch die Bildschirmgröße selbst begrenzt. Vielleicht ist der Inhalt eine Datentabelle, mit Zeilen, die nicht umgebrochen werden können und Spalten, die nicht weiter komprimiert werden können. Wir können den Überlauf immer noch eleganter behandeln, als ihn einfach überall hinauslaufen zu lassen.
overflow: hidden;
Die direkteste Lösung ist, den überlaufenden Inhalt zu verbergen. Das Setzen von overflow: hidden; schneidet Elemente einfach dort ab, wo sie die Grenze des Container-Elements erreichen. Wenn der Inhalt eher ästhetischer Natur ist und keine kritischen Informationen enthält, könnte dies akzeptabel sein.
Siehe den Pen CSS ist Großartig: overflow:hidden von Brandon (@brundolf) auf CodePen.
Wenn der Inhalt Text ist, können wir dies etwas visuell ansprechender gestalten, indem wir text-overflow: ellipsis; hinzufügen, das automatisch ein schönes "..." zu Text hinzufügt, der abgeschnitten wird. Es ist jedoch erwähnenswert, dass Sie dann etwas weniger vom eigentlichen Inhalt sehen, um Platz für die Ellipse zu schaffen. Beachten Sie auch, dass hierfür overflow: hidden; gesetzt sein muss.
Siehe den Pen CSS ist Großartig: ellipsis von Brandon (@brundolf) auf CodePen.
overflow: auto;
Die vorzuziehende Lösung ist in der Regel das Setzen von overflow-x: auto;. Dies gibt dem Browser die Erlaubnis, eine Scrollleiste hinzuzufügen, wenn der Inhalt überläuft, und ermöglicht dem Benutzer, den Container in diese Richtung zu scrollen.
Siehe den Pen CSS ist Großartig: overflow:auto von Brandon (@brundolf) auf CodePen.
Dies ist ein besonders elegante Fallback-Lösung, da sie bedeutet, dass der Benutzer *egal was passiert*, auf alle Inhalte zugreifen kann. Außerdem erscheint die Scrollleiste nur, wenn sie benötigt wird, was bedeutet, dass es keine schlechte Idee ist, diese Eigenschaft an wichtigen Stellen hinzuzufügen, selbst wenn Sie nicht erwarten, dass sie zum Einsatz kommt.
Warum resoniert dieses Rätsel so universell bei Menschen, die CSS verwendet haben?
CSS ist schwer, weil seine Eigenschaften interagieren, oft auf unerwartete Weise. Denn wenn Sie eine davon festlegen, legen Sie nie nur diese eine Sache fest. Diese eine Sache kombiniert sich, prallt ab und widerspricht einem Dutzend anderer Dinge, einschließlich Standarddinge, die Sie nie selbst festgelegt haben.
Eine Faustregel zur Minderung dieses Problems ist: **Seien Sie niemals expliziter, als Sie sein müssen**. Webseiten sind standardmäßig responsiv. Gutes CSS zu schreiben bedeutet, diese Tatsache zu nutzen, anstatt sie zu überschreiben. Verwenden Sie Prozente oder Viewport-Einheiten anstelle einer Media Query, wenn möglich. Verwenden Sie min-width anstelle von width, wo Sie können. Denken Sie in Regeln, was Sie wirklich sagen wollen, anstatt nur Eigenschaften hinzuzufügen, bis die Dinge richtig aussehen. Versuchen Sie, ein Gefühl dafür zu bekommen, wie der Browser Layout und Größenbestimmung auflöst, und nehmen Sie Ihre Änderungen und Ergänzungen darauf bedacht. Arbeiten Sie mit CSS, nicht dagegen.
Eine weitere Faustregel ist: **Lassen Sie entweder Breite oder Höhe vom Inhalt bestimmen**. In diesem Fall war das nicht genug, aber in den meisten Fällen wird es das sein. Geben Sie Dingen einen Raum zum Wachsen. Wenn Sie Regeln für die Größenbestimmung Ihrer Elemente festlegen, insbesondere wenn diese Texte enthalten, denken Sie über die Randfälle nach. „Was passiert, wenn dieser Inhalt auf ein einzelnes Zeichen reduziert wird? Was passiert, wenn dieser Inhalt auf drei Absätze erweitert wird? Es sieht vielleicht nicht gut aus, aber wäre mein Layout völlig kaputt?“
CSS ist seltsam. Es ist anders als jeder andere Code, und das macht viele Programmierer unbehaglich. Aber klug eingesetzt kann es tatsächlich großartig sein.
Obligatorischer Link zum berühmten (und sehr vorausschauenden) Artikel „A Dao of Web Design“ von John Alsop: https://alistapart.com/article/dao
Ein großartiges Zitat daraus, das gut zu Ihren Gedanken passt
„Wenn Sie Stylesheets richtig verwenden, um das Erscheinungsbild einer Seite vorzuschlagen, nicht um das Erscheinungsbild einer Seite zu kontrollieren, und Sie sich nicht *auf* Ihr Stylesheet verlassen, um Informationen zu vermitteln, dann werden Ihre Seiten in jedem Browser, ob alt oder neu, gut „funktionieren“.
Nutzen Sie die inhärente Flexibilität – kämpfen Sie nicht dagegen an. :-)
Aus Entwicklersicht stimme ich zu 100%. Leider, egal wie sehr man dafür argumentiert, haben einige (wenn nicht die meisten) Kunden – und sogar Designer und Projektmanager – eine sehr engstirnige Vorstellung von „funktioniert in jedem Browser“. Im Grunde, wenn eine Seitenkomponente in jedem Browser nicht genau gleich aussieht, dann funktioniert sie nicht und Sie sind ein inkompetenter Entwickler (ich paraphrasiere). Vielleicht muss ich besser überzeugen lernen, aber manchmal wollen die Leute Geld ausgeben, nur um Geld auszugeben, also berechne ich es ihnen in Rechnung.
Ich habe auch einen Pen gemacht, nachdem ich diesen Becher erhalten hatte :-) https://codepen.io/netsi1964/pen/QEVKzz
Ich habe auch einen Pen gemacht
Siehe den Pen CSS ist großartig von Andy Parsons (@andparsons) auf CodePen.
Klassisches „kämpfe damit, nicht dagegen“. Mein Leben wurde als Entwickler viel einfacher, als ich tief in die HTML- und CSS-Spezifikationen eintauchte, die Standardstile und Eigenschaften für jedes einzelne Element studierte und sie dann zu meinem Vorteil nutzte.
Ironischerweise scheint das Beispiel mit dem Wortumbruch in Firefox kaputt zu sein :)
:P
Ich habe das Originalbild immer unironisch genossen, weil es die Macht von CSS wunderschön illustriert. Versuchen Sie schließlich einmal, dasselbe in einem einzigen Element zu tun, *ohne* CSS. Mir fallen nur
imgoderembedein, und das sind schreckliche Hacks für etwas, das nur drei Wörter und eine Box ist. Und sie würden alle die Fähigkeit untergraben, den Text in einem einzigen Block per Drag & Drop auszuwählen.Ich stimme zu.
Alle Lösungen sind min-lustig: 25 % Aber wie sollte das Originaldesign eigentlich aussehen? Niemand weiß es ;)
Ich kann mich irren – das passiert ab und zu – aber ist dieses „Problem“ nicht das Verschulden des Browsers? Warum geben wir CSS die Schuld daran, wie der Browser den Inhalt standardmäßig rendert?
Mir fehlt eine wichtige Referenz in diesem Artikel: Ich bin ziemlich sicher, dass sich die Abbildung auf dem Becher auf den Internet Explorer bezieht. Bis Version 6 (die dank der Vorinstallation mit Windows XP einen Marktanteil von verrückten 90 Prozent hatte) trieb er Webentwicklern den Wahnsinn, indem er die einfache Einrichtung, die der Becher zeigt, *nicht* zuließ.
Was auch immer man mit seinem CSS machen würde, IE 6 dehnte die Box, die das lange Wort („AWESOME“) enthielt, einfach, um es passend zu machen, selbst wenn eine feste Breite darauf eingestellt war.
Der Kampf um Browserkompatibilität („Diese Seite ist optimiert für Netscape Version 5+ und eine Auflösung von 1024 × 768 px“) war damals wirklich eine andere Sache.
So wurde es von der Community nicht aufgenommen, als es auftauchte – laut mehreren Quellen im März 2009, daher bezweifle ich, dass es sich auf IE6 und Netscape 5 bezog –, aber ich habe den Ersteller kontaktiert, um ihn zu fragen, ob er vorbeikommen und den Hintergrund erklären würde.
Interessant. Obwohl ich immer noch bei meiner Aussage bleibe, dass es nicht CSS' Schuld ist. Wenn Ihr Kommentar zu IE also wahr ist, sollte der Becher dann „IE IST SCHRECKLICH“ lauten?
@Eric: Cool, ich bin wirklich neugierig.
Nun, meine Arbeit musste IE 6 im Jahr 2009 vollständig unterstützen, aber ich bin hier in Deutschland und leider ist unsere Browserlandschaft (in Bezug auf IE) normalerweise einige Jahre hinter den USA. Daher war ich wahrscheinlich sehr voreingenommen bei meiner Bewertung der Herkunft des Bechers.
@James: Ich würde lieber lesen: „CSS IST GROSSARTIG [wenn es richtig behandelt wird]“
Hallo! Ich bin Steve, der ursprüngliche Schöpfer des Designs „CSS IS AWESOME“.
Eric fragte, ob ich vorbeikommen und den „Hintergrund und die ursprüngliche Bedeutung“ von CSS IS AWESOME diskutieren könnte. Nun, ich wünschte, es wäre interessanter...
Es war 2009, und ich hatte Stunden damit verbracht, etwas in CSS zu machen, von dem ich bereits wusste, dass ich es mit Tabellen in Sekunden erledigen konnte. Ich habe mich *wirklich angestrengt*, es mit CSS zu tun, weil man das tun soll, aber ich war einfach nicht sehr gut darin (Spoiler-Alarm: Ich bin immer noch nicht sehr gut darin).
Ich habe jetzt ein etwas besseres Verständnis des Konzepts von Überlauf, aber damals hat es mich einfach umgehauen, dass jemand dachte, das Standardverhalten sei, den Text einfach aus der Box quellen zu lassen, anstatt die Box einfach zu vergrößern, wie es meine schönen, vernünftigen Tabellen immer getan hatten.
Auf jeden Fall hatte ich diesen Moment reiner Frustration und anstatt das Problem richtig zu lösen, habe ich 5 Minuten damit verbracht, einen spöttischen Becher zu erstellen und bin zu Tabellen zurückgekehrt. Weil das mein Markenzeichen in Krisenzeiten ist.
Das ist wirklich alles, was es gab. Es war nicht auf einen bestimmten Browser oder eine Person gerichtet oder so etwas. Ich dachte, vielleicht würden sich ein paar Leute mit der Erfahrung identifizieren und einen dummen Becher kaufen, aber verdammt, die Orte, an die er gegangen ist.
PS: Es ist meine aufrichtige Hoffnung, dass mein dummer Witz niemanden beleidigt hat, der im Laufe der Jahre an der Entwicklung von CSS beteiligt war. Ich schätze ehrlich gesagt die Komplexität des Themas und wie ärgerlich es sein kann, wenn jemand mit einem billigen Witz vorbeikommt, der auf seinem eigenen Unverständnis beruht.
Aww. Wirklich interessante Sache. Ich mochte meine Interpretation immer noch. :D
Danke für das Teilen! Ich mag Florians Interpretation, und ich stehe zu meinem Hass auf Browser. Sie können sich auf kaum etwas einigen, und das zwingt Entwickler zu Dingen wie Autoprefixer, mehreren Dateitypen für dieselbe Ressource, SVG-Hacks, Polyfills und verwirrenden Bechern. :)
Wow, ich hätte definitiv nicht erwartet, einen Kommentar vom ursprünglichen Schöpfer des Bechers zu erhalten. Ich bin geschmeichelt :)
Fairerweise muss ich sagen, dass CSS im Jahr 2009 wahrscheinlich nicht sehr großartig war. Ich selbst habe erst 2012 damit angefangen, also weiß ich es nicht aus erster Hand, aber selbst 2012 waren Dinge wie Float-Hacks noch gängige Praxis.
Auf jeden Fall vielen Dank für die zusätzlichen Kontextinformationen und vielen Dank für den fantastischen Becher!
Es fehlt jedoch eine alternative Option: Silbentrennung. Könnte das Problem des „Ausbruchs aus der Box“ etwas eleganter lösen als die Überlaufmanipulation.
cu, w0lf.
Könnte nicht mehr zustimmen! Das gefällt mir an CSS.
Alle Lösungen außer Ellipse schlugen in Firefox Mobile fehl. CSS ist nicht großartig. Kämpfen Sie noch mehr.
Wenn Sie die HTML-Steuerung haben, können Sie den ersten Fall mit optionalen Silbentrennungszeichen () etwas schöner gestalten.
Details: https://css-tricks.de/almanac/properties/h/hyphenate/
Da der fragliche Fall davon ausgeht, dass Inhalt und Container nicht in ihrem normalen (idealen) Zustand sind, sei es aufgrund der Bildschirmgröße oder eines anderen Faktors, möchten wir keine Silbe in das Markup selbst einfügen. Sie haben jedoch Recht, die
hyphens-Eigenschaft von CSS zu erwähnen, die ich nicht kannte. Die erste (word-break) Lösung würde absolut vonhyphens: autoprofitieren.Ich denke, der Becher 2.0 ist versandfertig!
Interessanterweise habe ich dieses Bild nie so gesehen
„Sie versuchen, etwas Einfaches mit CSS zu machen, und die mysteriösen Wege, auf denen sogar grundlegende Eigenschaften interagieren, machen es unweigerlich kaputt“
Ich habe dieses Bild immer eher als symbolisch interpretiert. Das bedeutet, CSS ist so mächtig, dass es die Grenzen sprengte und Entwicklern erlaubte, über den Tellerrand hinaus mit ihren Designs zu denken.
Aber jetzt sehe ich genau, woher Sie kommen, und Sie haben mir die Augen geöffnet :)
Entschuldigen Sie, wenn das unnötig pingelig ist, aber im Absatz unter der Überschrift Größe des Inhalts anpassen sagen Sie: „Aber nehmen wir für einen Moment an, dass wir die Größe des Containers auf keinen Fall ändern können.“
Dieser Satz sollte das Wort „Größe“ durch „Breite“ ersetzen, da Sie die Containerhöhe mit Ihrer Lösung erhöht haben.
Unter den gegebenen Einschränkungen hätte ich angenommen, dass Sie die Schriftgröße anpassen würden.
Ich (wie viele Leute) habe dies in einer Präsentation über Debugging von CSS verwendet. Es gipfelte darin, dass ich Fehler behob, bis ich zu einer reinen CSS-Discokugel gelangte.
Versuchen Sie das mal mit Tabellen ;)
Ich liebe es, dass wir ein so geliebtes universelles Symbol der Frustration mit CSS haben. Wir waren alle schon mal da.
Ich habe eine Lösung mit SVG, aber die wird Ihnen nicht gefallen.
Gute Idee, aber sie funktioniert nicht mit Microsoft Edge!
Ich habe diesen Becher wirklich noch nie woanders gesehen, und jetzt wächst mein Herz um drei Größen, während ich diesen Beitrag lese, danke :)
Meine erste Mentorin besaß diesen Becher und schenkte ihn mir, als sie unser Unternehmen verließ, und seitdem schätze ich ihn sehr (7 Jahre und 3 Jobs) – er war mein Büro-Bierkrug in meinem letzten Job und ist mein täglicher Seltzer-Becher in meinem jetzigen Job.
Und dann, vor 2 Monaten, ließ ich ihn in unserer Bürokantine fallen und er zerbrach. Ich gab ihn meinem Bruder, da er ein Superkleber-Zauberer ist. Wenn er ihn nicht wieder in einen getränkegeeigneten Zustand bringen kann, werde ich ihn wohl als Mini-Pflanzgefäß verwenden, damit ich ihn trotzdem auf meinem Schreibtisch haben kann. Ich weiß, dass ich einen neuen kaufen könnte, aber darum geht es natürlich nicht :)
Jedenfalls, danke!! Prost,
Alison
Oh, die Ironie, dass dein CSS (Becher) zerbrochen ist. Es tut mir leid zu hören, aber er funktioniert wahrscheinlich trotzdem in Chrome.
hahaha @Kel, guter Punkt :)
CSS ist großartig, warum überhaupt HTML verwenden ;P
Von Christian Kaindl, nach Abpfiff
Thread