Seit dem Wechsel vom TABLE-Layout zum DIV-Layout bleibt ein häufiges Problem bestehen:
PROBLEM : Sie füllen Ihren DIV mit dynamischem Text und es gibt unweigerlich ein super langes Wort, das sich über den Rand Ihrer div-Spalte erstreckt und Ihre Site unprofessionell aussehen lässt.
RETRO-WHINING : Dies ist bei Tabellenlayouts nie passiert. Eine Tabellenzelle wird immer schön auf die Breite des längsten Wortes erweitert.
SEVERITY : Ich sehe dieses Problem auch auf den wichtigsten Websites, insbesondere auf deutschen Websites, auf denen selbst gebräuchliche Wörter wie "Geschwindigkeitsbegrenzung" sehr lang sind.
Hat jemand eine praktikable Lösung dafür?
Antworten:
Weicher Bindestrich
Sie können den Browsern mitteilen, wo lange Wörter geteilt werden sollen, indem Sie einen weichen Bindestrich (
­
) einfügen :kann gerendert werden als
oder
Ein netter regulärer Ausdruck kann sicherstellen, dass Sie sie nur einfügen, wenn dies erforderlich ist:
Browser und Suchmaschinen sind intelligent genug, um dieses Zeichen beim Durchsuchen von Text zu ignorieren, und Chrome und Firefox (haben andere nicht getestet) ignorieren es beim Kopieren von Text in die Zwischenablage.
<wbr>
ElementEine andere Möglichkeit ist das Injizieren
<wbr>
eines früheren IE-Ismus , der jetzt in HTML5 vorliegt :Pausen ohne Bindestrich:
Sie können dasselbe mit einem Leerzeichen
​
(oder​
) mit einer Breite von Null erreichen .Zu Ihrer Information, es gibt auch CSS,
hyphens: auto
das von den neuesten IE-, Firefox- und Safari- Versionen unterstützt wird ( derzeit jedoch nicht Chrome ):Diese Silbentrennung basiert jedoch auf einem Silbentrennungswörterbuch und es ist nicht garantiert, dass lange Wörter gebrochen werden. Es kann jedoch gerechtfertigten Text schöner machen.
Retro-jammernde Lösung
<table>
denn Layout ist schlecht, aberdisplay:table
auf anderen Elementen ist in Ordnung. Es wird so schrullig (und dehnbar) sein wie Tische der alten Schule:overflow
und diewhite-space: pre-wrap
Antworten unten sind auch gut.quelle
Zwei Korrekturen:
overflow:scroll
- Dadurch wird sichergestellt, dass Ihre Inhalte auf Kosten des Designs angezeigt werden (Bildlaufleisten sind hässlich).overflow:hidden
- schneidet einfach jeglichen Überlauf ab. Es bedeutet jedoch, dass die Leute den Inhalt nicht lesen können.Wenn Sie (im SO-Beispiel) verhindern möchten, dass sich das Padding überlappt, müssen Sie wahrscheinlich ein weiteres Div innerhalb des Padding erstellen, um Ihren Inhalt zu speichern.
Bearbeiten: Wie in den anderen Antworten angegeben, gibt es eine Vielzahl von Methoden zum Abschneiden der Wörter, z. B. das Ermitteln der Renderbreite auf der Clientseite (versuchen Sie niemals, dies serverseitig zu tun, da dies niemals zuverlässig und plattformübergreifend funktioniert) JS und das Einfügen von Unterbrechungszeichen oder die Verwendung von nicht standardmäßigen und / oder inkompatiblen CSS-Tags (
word-wrap: break-word
scheint in Firefox nicht zu funktionieren ).Sie benötigen jedoch immer einen Überlaufdeskriptor. Wenn Ihr div einen anderen zu breiten blockartigen Inhalt enthält (Bild, Tabelle usw.), müssen Sie überlaufen, damit das Layout / Design nicht zerstört wird.
Verwenden Sie also auf jeden Fall eine andere Methode (oder eine Kombination davon), aber denken Sie daran, auch einen Überlauf hinzuzufügen, damit Sie alle Browser abdecken.
Bearbeiten Sie 2 (um Ihren Kommentar unten zu adressieren):
Die Verwendung der CSS-
overflow
Eigenschaft ist zunächst nicht perfekt, verhindert jedoch das Brechen von Designs.overflow:hidden
Zuerst bewerben . Denken Sie daran, dass der Überlauf beim Auffüllen möglicherweise nicht bricht, also entweder verschachtelndiv
oder einen Rand verwenden (was auch immer für Sie am besten funktioniert).Dadurch werden überlaufende Inhalte ausgeblendet, sodass Sie möglicherweise an Bedeutung verlieren. Sie könnten eine Bildlaufleiste verwenden (mit
overflow:auto
oderoverflow:scroll
anstelle vonoverflow:hidden
), aber abhängig von den Abmessungen des Div und Ihrem Design sieht dies möglicherweise nicht gut aus oder funktioniert nicht gut.Um dies zu beheben, können wir JS verwenden, um Dinge zurückzuziehen und eine Form der automatischen Kürzung durchzuführen. Ich war auf halbem Weg, einen Pseudocode für Sie zu schreiben, aber auf halbem Weg wird es ernsthaft kompliziert. Wenn Sie so viel wie möglich anzeigen müssen, werfen Sie einen Blick auf den Silbentrenner ( wie unten erwähnt ).
Beachten Sie jedoch, dass dies auf Kosten der CPUs des Benutzers geht. Das Laden und / oder Ändern der Größe von Seiten kann lange dauern.
quelle
overflow: scroll;
Fall entscheiden, dass der Inhalt nützliche Informationen enthält. Und dann ist das nächste Ziel, zu versuchen, ein solches CSS zu erstellen, dass die Bildlaufleisten nicht angezeigt werden. Und falls doch, haben Sie immer die Bildlaufleisten als Backup.text-overflow: ellipsis
stackoverflow.com/a/22811590/759452Dies ist bekanntlich ein komplexes Problem, das von Browsern in keiner Weise unterstützt wird. Die meisten Browser unterstützen diese Funktion von Haus aus überhaupt nicht.
Bei einigen Arbeiten mit HTML-E-Mails, bei denen Benutzerinhalte verwendet wurden, das Skript jedoch nicht verfügbar ist (und sogar CSS nicht sehr gut unterstützt wird), sollte das folgende CSS-Bit in einem Wrapper um Ihren nicht räumlichen Inhaltsblock zumindest etwas helfen:
Bei Mozilla-basierten Browsern enthält die oben genannte XBL-Datei:
Leider scheint Opera 8+ keine der oben genannten Lösungen zu mögen, daher muss JavaScript die Lösung für diese Browser sein (wie Mozilla / Firefox). Eine andere browserübergreifende Lösung (JavaScript), die die späteren Editionen von Opera enthält wäre es, Hedger Wangs Skript zu verwenden, das hier zu finden ist: http://www.hedgerwow.com/360/dhtml/css-word-break.html
Andere nützliche Links / Gedanken:
Incoherent Babble »Blog-Archiv» Emulieren von CSS-Zeilenumbrüchen für Mozilla / Firefox
http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/
[OU] Kein Zeilenumbruch in Opera, wird im IE gut angezeigt
http://list.opera.com/pipermail/opera-users/2004-November/024467.html
http://list.opera.com/pipermail/opera- Benutzer / 2004-November / 024468.html
quelle
word-wrap: break-word;
CSS-Eigenschaft. Wenn Sie also in früheren Versionen keine Unterstützung in Firefox benötigen, können Sie das XBL entfernen.CSS Cross Browser Word Wrap
quelle
Verwenden Sie den Stil
word-break:break-all;
. Ich weiß, dass es auf Tischen funktioniert.quelle
Meinen Sie damit, dass in Browsern, die dies unterstützen,
word-wrap: break-word
dies nicht funktioniert?Wenn es in der Textdefinition des Stylesheets enthalten ist , sollte es im gesamten Dokument funktionieren.
Wenn Überlauf keine gute Lösung ist, kann nur ein benutzerdefiniertes Javascript lange Wörter künstlich auflösen.
Hinweis: Es gibt auch dieses
<wbr>
Word Break-Tag . Dies gibt dem Browser eine Stelle, an der er die Aufstellung aufteilen kann. Leider<wbr>
funktioniert das Tag nicht in allen Browsern, nur in Firefox und Internet Explorer (und Opera mit einem CSS-Trick).quelle
Ich habe gerade IE 7, Firefox 3.6.8 Mac, Firefox 3.6.8 Windows und Safari überprüft:
funktioniert für lange Links innerhalb eines Divs mit einer festgelegten Breite und ohne im CSS deklarierten Überlauf:
Ich sehe keine Inkompatibilitätsprobleme
quelle
Ich habe gerade aus dieser Frage etwas über Bindestrich herausgefunden . Das könnte das Problem lösen.
quelle
Nach vielen Kämpfen hat das für mich funktioniert:
Funktioniert in den neuesten Versionen von Chrome, Firefox und Opera.
Beachten Sie, dass ich viele der von den
white-space
anderen vorgeschlagenen Eigenschaften ausgeschlossen habe - das hat diepre
Einrückung für mich tatsächlich gebrochen .quelle
Für mich auf einem Div ohne feste Größe und mit dynamischem Inhalt funktionierte es mit:
quelle
Bezüglich des regulären Ausdrucks in diesem Kommentar ist es gut, aber es fügt den schüchternen Bindestrich nur zwischen Gruppen von 5 Zeichen hinzu, die keine Leerzeichen oder Bindestriche sind. Dadurch kann die letzte Gruppe viel länger als beabsichtigt sein, da danach keine passende Gruppe mehr vorhanden ist.
Zum Beispiel:
... ergibt dies:
Hier ist eine Version mit positivem Lookahead, um dieses Problem zu vermeiden:
... mit diesem Ergebnis:
quelle
Die Lösung, die ich normalerweise für dieses Problem verwende, besteht darin, zwei verschiedene CSS-Regeln für den IE und andere Browser festzulegen:
Woks perfekt im IE, aber Zeilenumbruch ist keine Standard-CSS-Eigenschaft. Es ist eine Microsoft-spezifische Eigenschaft und funktioniert in Firefox nicht.
Für Firefox ist es am besten, die Regel festzulegen, wenn Sie nur CSS verwenden
für das Element, das den Text enthält, den Sie umbrechen möchten. Der Text wird nicht umgebrochen, sondern der Teil des Texts ausgeblendet, der die Grenze des Containers überschreitet . Es kann eine gute Lösung sein, wenn Sie nicht unbedingt den gesamten Text anzeigen müssen (dh wenn sich der Text in einem
<a>
Tag befindet).quelle
Update: Die Handhabung in CSS ist wunderbar einfach und mit geringem Aufwand verbunden, aber Sie haben keine Kontrolle darüber, wo Pausen auftreten, wenn sie auftreten. Das ist in Ordnung, wenn Sie sich nicht darum kümmern oder Ihre Daten lange alphanumerische Läufe ohne natürliche Unterbrechungen haben. Wir hatten viele lange Dateipfade, URLs und Telefonnummern, die alle Orte haben, an denen man deutlich besser brechen kann als an anderen.
Unsere Lösung bestand darin, zuerst einen Regex-Ersatz zu verwenden, um nach jeweils 15 (sagen wir) Zeichen, die keine Leerzeichen sind, oder einem der Sonderzeichen, bei denen wir Unterbrechungen bevorzugen, ein Leerzeichen mit der Breite Null (& # 8203;) einzufügen. Wir ersetzen dann erneut, um nach diesen Sonderzeichen ein Leerzeichen mit der Breite Null einzufügen.
Leerzeichen mit einer Breite von Null sind schön, weil sie auf dem Bildschirm nie sichtbar sind. schüchterne Bindestriche waren verwirrend, als sie angezeigt wurden, da die Daten signifikante Bindestriche enthalten. Leerzeichen mit der Breite Null sind ebenfalls nicht enthalten, wenn Sie Text aus dem Browser kopieren.
Die Sonderzeichen, die wir derzeit verwenden, sind Punkt, Schrägstrich, Backslash, Komma, Unterstrich, @, | und Bindestrich. Sie würden nicht glauben, dass Sie etwas tun müssten, um das Brechen nach Bindestrichen zu fördern, aber Firefox (mindestens 3.6 und 4) bricht bei Bindestrichen, die von Zahlen (wie Telefonnummern) umgeben sind, nicht von selbst.
Wir wollten auch die Anzahl der Zeichen zwischen künstlichen Pausen basierend auf dem verfügbaren Layoutbereich steuern. Das bedeutete, dass der Regex für lange, nicht brechende Läufe dynamisch sein musste. Dies wird häufig aufgerufen, und wir wollten aus Leistungsgründen nicht immer wieder dieselben identischen regulären Ausdrücke erstellen. Daher haben wir einen einfachen regulären Ausdrucks-Cache verwendet, der durch den regulären Ausdruck und seine Flags gekennzeichnet ist.
Hier ist der Code; Sie würden wahrscheinlich die Funktionen in einem Dienstprogrammpaket mit einem Namespace versehen:
Test wie folgt:
Update 2: Es scheint, dass Leerzeichen mit einer Breite von null tatsächlich in kopiertem Text enthalten sind, zumindest unter bestimmten Umständen. Sie können sie einfach nicht sehen. Das Ermutigen von Personen, Text mit versteckten Zeichen zu kopieren, ist natürlich eine Einladung, solche Daten in andere Programme oder Systeme, auch in Ihre eigenen, einzugeben, wo dies zu Problemen führen kann. Wenn es beispielsweise in einer Datenbank landet, schlagen die Suchvorgänge möglicherweise fehl, und Suchzeichenfolgen wie diese schlagen wahrscheinlich ebenfalls fehl. Die Verwendung von Pfeiltasten zum Bewegen solcher Daten erfordert (zu Recht) einen zusätzlichen Tastendruck, um sich über das nicht sichtbare Zeichen zu bewegen. Dies ist für Benutzer etwas bizarr, wenn sie es bemerken.
In einem geschlossenen System können Sie dieses Zeichen bei der Eingabe herausfiltern, um sich zu schützen, aber das hilft anderen Programmen und Systemen nicht.
Alles in allem funktioniert diese Technik gut, aber ich bin mir nicht sicher, welche die beste Wahl für einen Bruch verursachenden Charakter wäre.
Update 3: Dass dieses Zeichen in Daten landet, ist keine theoretische Möglichkeit mehr, sondern ein beobachtetes Problem. Benutzer senden Daten, die vom Bildschirm kopiert wurden, sie werden in der Datenbank gespeichert, Suchanfragen werden unterbrochen, die Dinge werden seltsam sortiert usw.
Wir haben zwei Dinge getan:
Dies funktioniert gut, ebenso wie die Technik selbst, aber es ist eine warnende Geschichte.
Update 4: Wir verwenden dies in einem Kontext, in dem die hier eingegebenen Daten möglicherweise HTML-maskiert sind. Unter den richtigen Umständen können Leerzeichen mit der Breite Null in die Mitte von HTML-Entitäten eingefügt werden, was zu unkonventionellen Ergebnissen führt.
Die Korrektur bestand darin, der Liste der Zeichen, auf die wir nicht verzichten, kaufmännisches Und hinzuzufügen:
quelle
if(domainName.length > 15) domainName.replace(/([^\\s]{5})(?=[^\\s])/g, '$1​');
Sie müssen "Tabellenlayout: behoben" festlegen, damit der Zeilenumbruch funktioniert
quelle
UPDATE: Ab Dezember 2011 haben wir jetzt eine weitere Option, mit der neuen Unterstützung dieser Tags in FF und Safari:
Ich habe einige grundlegende Tests durchgeführt und es scheint auf einer aktuellen Version von Mobile Safari und Safari 5.1.1 zu funktionieren.
Kompatibilitätstabelle: https://developer.mozilla.org/en/CSS/hyphens#AutoCompatibilityTable
quelle
Zur Kompatibilität mit IE 8+ verwenden Sie:
Sehen Sie es hier http://css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/
Alles was ich tun musste, war dies auf den Stil des Div-Containers mit einer festgelegten Breite anzuwenden.
quelle
Benutze das
quelle
Wenn Sie dies haben -
Wechseln Sie einfach zu einem vertikalen Format mit Divs und verwenden Sie in Ihrem CSS die Mindestbreite anstelle der Breite -
Wenn Sie echte Tabellendaten anzeigen, ist es natürlich in Ordnung, eine echte Tabelle zu verwenden, da diese semantisch korrekt ist und Personen mit Bildschirmleseprogrammen informiert, die in einer Tabelle enthalten sein sollen. Sie werden für das allgemeine Layout oder das Schneiden von Bildern verwendet, für die die Leute Sie lynchen werden.
quelle
Ich musste Folgendes tun, weil, wenn die Eigenschaften nicht in der richtigen Reihenfolge deklariert würden, Wörter zufällig an der falschen Stelle und ohne Hinzufügen eines Bindestrichs gebrochen würden.
Ursprünglich gepostet von Enigmo: https://stackoverflow.com/a/14191114
quelle
Ja, wenn es möglich ist,
overflow : auto
funktioniert das Einstellen einer absoluten Breite und Einstellung gut.quelle
quelle
"Zeilenumbruch: Wortumbruch" funktioniert in Firefox 3.5 http://hacks.mozilla.org/2009/06/word-wrap/
quelle
Fügen Sie dies zu
css
Ihrem div hinzu:word-wrap: break-word;
quelle
Bewahren Sie nach all dem Umbrechen und Brechen des Wortes Ihren Überlauf und prüfen Sie, ob dies Ihr Problem löst. Ändern Sie einfach die Anzeige Ihres Divs in:
display: inline;
quelle
Eine einfache Funktion (erfordert underscore.js) - basierend auf der @ porneL-Antwort
quelle
Ich habe eine Funktion geschrieben, die hervorragend funktioniert, wenn
­
x Buchstaben in das Wort eingefügt werden, um einen guten Zeilenumbruch zu erzielen. Alle Antworten hier unterstützten nicht alle Browser und Geräte, aber dies funktioniert gut mit PHP:quelle