Depuis le passage de la mise en page TABLE à la mise en page DIV, un problème commun demeure:
PROBLÈME : vous remplissez votre DIV avec du texte dynamique et il y a inévitablement un mot super long qui dépasse le bord de votre colonne div et donne à votre site un aspect non professionnel.
RETRO-WHINING : Cela ne s'est jamais produit avec les dispositions de table. Une cellule de tableau s'étendra toujours bien à la largeur du mot le plus long.
GRAVITÉ : Je vois ce problème même sur les sites les plus importants, en particulier sur les sites allemands où même les mots courants tels que "limitation de vitesse" sont très longs ("Geschwindigkeitsbegrenzung").
Quelqu'un a-t-il une solution viable à cela?
Réponses:
Trait d'union souple
Vous pouvez indiquer aux navigateurs où séparer les mots longs en insérant un trait d'union souple (
­
):peut être rendu comme
ou
Une belle expression régulière peut vous assurer que vous ne les insérerez que si nécessaire:
Les navigateurs et les moteurs de recherche sont suffisamment intelligents pour ignorer ce caractère lors de la recherche de texte, et Chrome et Firefox (n'en ont pas testé d'autres) l'ignorent lors de la copie de texte dans le presse-papiers.
<wbr>
élémentUne autre option consiste à injecter
<wbr>
, un ancien IE-ism , qui est maintenant en HTML5 :Pauses sans trait d'union:
Vous pouvez obtenir la même chose avec un caractère d'espace de largeur nulle
​
(ou​
).FYI, il y a aussi CSS
hyphens: auto
pris en charge par les derniers IE, Firefox et Safari ( mais actuellement pas Chrome ):Cependant, cette césure est basée sur un dictionnaire de césure et il n'est pas garanti de casser les mots longs. Cela peut cependant rendre le texte justifié plus joli.
Solution rétro-pleurnicher
<table>
pour la mise en page est mauvaise, maisdisplay:table
sur d'autres éléments c'est bien. Ce sera aussi décalé (et extensible) que les tables de la vieille école:overflow
et leswhite-space: pre-wrap
réponses ci-dessous sont bonnes aussi.la source
Deux corrections:
overflow:scroll
- cela garantit que votre contenu peut être vu au détriment de la conception (les barres de défilement sont laides)overflow:hidden
- coupe simplement tout débordement. Cela signifie que les gens ne peuvent pas lire le contenu.Si (dans l'exemple SO) vous voulez l'empêcher de chevaucher le remplissage, vous devrez probablement créer un autre div, à l'intérieur du remplissage, pour contenir votre contenu.
Edit: Comme l'indiquent les autres réponses, il existe une variété de méthodes pour tronquer les mots, que ce soit en calculant la largeur du rendu côté client (n'essayez jamais de faire ce côté serveur car cela ne fonctionnera jamais de manière fiable, multiplateforme) via JS et insérer des caractères de rupture, ou utiliser des balises CSS non standard et / ou extrêmement incompatibles (
word-wrap: break-word
ne semble pas fonctionner dans Firefox ).Cependant, vous aurez toujours besoin d'un descripteur de débordement. Si votre div contient un autre élément de contenu de type bloc trop large (image, tableau, etc.), vous aurez besoin d'un débordement pour qu'il ne détruise pas la mise en page / le design.
Par conséquent, utilisez une autre méthode (ou une combinaison de celles-ci), mais n'oubliez pas d'ajouter également un débordement pour couvrir tous les navigateurs.
Edit 2 (pour répondre à votre commentaire ci-dessous):
Commencer à utiliser la
overflow
propriété CSS n'est pas parfait, mais cela empêche la rupture des conceptions. Appliquez d'overflow:hidden
abord. N'oubliez pas que le débordement peut ne pas se rompre lors du remplissage, donc soit imbriquédiv
ou utiliser une bordure (ce qui fonctionne le mieux pour vous).Cela masquera le contenu débordant et vous risquez donc de perdre du sens. Vous pouvez utiliser une barre de défilement (en utilisant
overflow:auto
ouoverflow:scroll
au lieu deoverflow:hidden
), mais en fonction des dimensions du div et de votre conception, cela peut ne pas avoir l'air ou fonctionner correctement.Pour résoudre ce problème, nous pouvons utiliser JS pour récupérer les choses et faire une forme de troncature automatisée. J'étais à mi-chemin de l'écriture d'un pseudo-code pour vous, mais cela devient sérieusement compliqué à mi-chemin. Si vous avez besoin d'en montrer autant que possible, jetez un œil au trait d'union ( comme mentionné ci-dessous ).
Sachez simplement que cela se fait au détriment des processeurs de l'utilisateur. Cela pourrait entraîner un chargement et / ou un redimensionnement des pages long.
la source
overflow: scroll;
au cas où le contenu contiendrait des informations utiles. Et puis l'objectif suivant est d'essayer de créer un CSS tel que les barres de défilement n'apparaissent pas. Et au cas où ils le feraient, vous avez toujours les barres de défilement comme sauvegarde.text-overflow: ellipsis
stackoverflow.com/a/22811590/759452Il s'agit d'un problème complexe, comme nous le savons, et qui n'est pas pris en charge de manière courante entre les navigateurs. La plupart des navigateurs ne prennent pas du tout en charge cette fonctionnalité de manière native.
Dans certains travaux réalisés avec des e-mails HTML, où le contenu utilisateur était utilisé, mais le script n'est pas disponible (et même CSS n'est pas très bien pris en charge), le morceau suivant de CSS dans un wrapper autour de votre bloc de contenu non espacé devrait au moins aider un peu:
Dans le cas des navigateurs basés sur Mozilla, le fichier XBL mentionné ci-dessus contient:
Malheureusement, Opera 8+ ne semble aimer aucune des solutions ci-dessus, donc JavaScript devra être la solution pour ces navigateurs (comme Mozilla / Firefox.) Une autre solution multi-navigateurs (JavaScript) qui inclut les éditions ultérieures d'Opera serait d'utiliser le script de Hedger Wang trouvé ici: http://www.hedgerwow.com/360/dhtml/css-word-break.html
Autres liens / réflexions utiles:
Incoherent Babble »Blog Archive» Émulation de l'habillage de mots CSS pour Mozilla / Firefox
http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/
[OU] Pas de retour à la ligne dans Opera, s'affiche correctement dans IE
http://list.opera.com/pipermail/opera-users/2004-November/024467.html
http://list.opera.com/pipermail/opera- users / 2004-novembre / 024468.html
la source
word-wrap: break-word;
propriété CSS, donc si vous n'avez pas besoin de la prise en charge de Firefox pour les versions antérieures, vous pouvez éliminer le XBL.Emballage de mots CSS Cross Browser
la source
Utilisez le style
word-break:break-all;
. Je sais que cela fonctionne sur les tables.la source
Voulez-vous dire que, dans les navigateurs qui le prennent en charge,
word-wrap: break-word
ne fonctionne pas?S'il est inclus dans la définition du corps de la feuille de style , il devrait fonctionner dans tout le document.
Si le débordement n'est pas une bonne solution, seul un javascript personnalisé pourrait briser artificiellement un mot long.
Remarque: il existe également cette
<wbr>
balise Word Break . Cela donne au navigateur un endroit où il peut diviser la ligne. Malheureusement, la<wbr>
balise ne fonctionne pas dans tous les navigateurs, uniquement Firefox et Internet Explorer (et Opera avec une astuce CSS).la source
Je viens de vérifier IE 7, Firefox 3.6.8 Mac, Firefox 3.6.8 Windows et Safari:
fonctionne pour les liens longs à l'intérieur d'un div avec une largeur définie et aucun débordement déclaré dans le css:
Je ne vois aucun problème d'incompatibilité
la source
Je viens de découvrir le trait d' union à partir de cette question . Cela pourrait résoudre le problème.
la source
Après de nombreux combats, voici ce qui a fonctionné pour moi:
Fonctionne dans les dernières versions de Chrome, Firefox et Opera.
Notez que j'ai exclu de nombreuses
white-space
propriétés suggérées par les autres, ce qui a en fait brisé l'pre
indentation pour moi.la source
Pour moi, sur un div sans taille fixe et avec un contenu dynamique, cela fonctionnait en utilisant:
la source
Re le regex dans ce commentaire , c'est bien, mais il ajoute le trait d'union timide uniquement entre des groupes de 5 caractères non-blancs-ou-tirets. Cela permet au dernier groupe d'être beaucoup plus long que prévu, car il n'y a pas de groupe correspondant après lui.
Par exemple, ceci:
... aboutit à ceci:
Voici une version utilisant une anticipation positive pour éviter ce problème:
... avec ce résultat:
la source
La solution que j'utilise habituellement pour ce problème est de définir 2 règles css différentes pour IE et d'autres navigateurs:
woks parfaits dans IE, mais word-wrap n'est pas une propriété CSS standard. C'est une propriété spécifique à Microsoft et ne fonctionne pas dans Firefox.
Pour Firefox, la meilleure chose à faire en utilisant uniquement CSS est de définir la règle
pour l'élément qui contient le texte que vous souhaitez habiller. Il n'enveloppe pas le texte, mais masque la partie du texte qui dépasse la limite du conteneur . Cela peut être une bonne solution s'il n'est pas indispensable pour vous d'afficher tout le texte (c'est-à-dire si le texte est à l'intérieur d'une
<a>
balise)la source
Mise à jour: gérer cela dans CSS est merveilleusement simple et peu coûteux, mais vous n'avez aucun contrôle sur l'endroit où les pauses se produisent lorsqu'elles se produisent. C'est bien si vous ne vous en souciez pas, ou si vos données ont de longues séries alphanumériques sans interruption naturelle. Nous avions beaucoup de longs chemins de fichiers, d'URL et de numéros de téléphone, qui ont tous des endroits où il est nettement préférable de casser que d'autres.
Notre solution était d'utiliser d'abord un remplacement de regex pour mettre un espace de largeur nulle (& # 8203;) après chaque 15 (disons) caractères qui ne sont pas des espaces ou l'un des caractères spéciaux où nous préférerions les pauses. Nous faisons ensuite un autre remplacement pour mettre un espace de largeur nulle après ces caractères spéciaux.
Les espaces de largeur nulle sont agréables, car ils ne sont jamais visibles à l'écran; les tirets timides étaient déroutants lorsqu'ils se montraient, car les données comportent des tirets importants. Les espaces de largeur nulle ne sont pas non plus inclus lorsque vous copiez du texte hors du navigateur.
Les caractères de coupure spéciaux que nous utilisons actuellement sont le point, la barre oblique, la barre oblique inverse, la virgule, le trait de soulignement, @, | et le trait d'union. Vous ne penseriez pas que vous auriez besoin de faire quoi que ce soit pour encourager la rupture après les traits d'union, mais Firefox (3.6 et 4 au moins) ne se casse pas tout seul aux traits d'union entourés de chiffres (comme les numéros de téléphone).
Nous voulions également contrôler le nombre de caractères entre les pauses artificielles, en fonction de l'espace de disposition disponible. Cela signifiait que l'expression régulière pour correspondre à de longues exécutions insécables devait être dynamique. Cela est souvent appelé, et nous ne voulions pas créer les mêmes regex identiques encore et encore pour des raisons de performances, nous avons donc utilisé un simple cache regex, codé par l'expression regex et ses indicateurs.
Voici le code; vous auriez probablement nommé les fonctions dans un package utilitaire
Testez comme ceci:
Mise à jour 2: Il semble que les espaces en fait zéro largeur sont inclus dans le texte copié dans au moins certaines circonstances, vous ne pouvez pas les voir. Évidemment, encourager les gens à copier du texte avec des caractères cachés est une invitation à avoir des données comme celles entrées dans d'autres programmes ou systèmes, même le vôtre, où cela peut causer des problèmes. Par exemple, s'il se retrouve dans une base de données, les recherches sur celui-ci peuvent échouer, et des chaînes de recherche comme celle-ci risquent également d'échouer. L'utilisation des touches fléchées pour parcourir des données comme celle-ci nécessite (à juste titre) une pression supplémentaire sur une touche pour se déplacer sur le caractère que vous ne pouvez pas voir, quelque peu bizarre pour les utilisateurs s'ils le remarquent.
Dans un système fermé, vous pouvez filtrer ce caractère en entrée pour vous protéger, mais cela n'aide pas les autres programmes et systèmes.
Tout compte fait, cette technique fonctionne bien, mais je ne suis pas sûr du meilleur choix de personnage provoquant une rupture.
Mise à jour 3: Faire en sorte que ce personnage se retrouve dans les données n'est plus une possibilité théorique, c'est un problème observé. Les utilisateurs soumettent des données copiées hors de l'écran, elles sont enregistrées dans la base de données, les recherches interrompent, les choses trient bizarrement, etc.
Nous avons fait deux choses:
Cela fonctionne bien, tout comme la technique elle-même, mais c'est un récit édifiant.
Mise à jour 4: Nous l'utilisons dans un contexte où les données qui y sont transmises peuvent être échappées HTML. Dans les bonnes circonstances, il peut insérer des espaces de largeur nulle au milieu d'entités HTML, avec des résultats funky.
Le correctif consistait à ajouter une esperluette à la liste des caractères sur lesquels nous ne cassons pas, comme ceci:
la source
if(domainName.length > 15) domainName.replace(/([^\\s]{5})(?=[^\\s])/g, '$1​');
Nécessité de définir "mise en page du tableau: fixe" pour que le retour à la ligne fonctionne
la source
MISE À JOUR: Depuis décembre 2011, nous avons maintenant une autre option, avec la prise en charge émergente de ces balises dans FF et Safari:
J'ai fait quelques tests de base et cela semble fonctionner sur une version récente de Mobile Safari et Safari 5.1.1.
Tableau de compatibilité: https://developer.mozilla.org/en/CSS/hyphens#AutoCompatibilityTable
la source
Pour la compatibilité avec IE 8+, utilisez:
Voir ici http://css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/
Tout ce que j'avais à faire était d'appliquer cela au style du conteneur div avec une largeur définie.
la source
Utilisez ceci
la source
Si vous avez ceci -
passez simplement à un format vertical avec des div contenant et utilisez min-width dans votre CSS au lieu de width -
Bien sûr, si vous affichez de véritables données tabulaires, vous pouvez utiliser une vraie table car elle est sémantiquement correcte et informera les personnes utilisant des lecteurs d'écran qui sont censés être dans une table. C'est les utiliser pour la mise en page générale ou le découpage d'images que les gens vous lyncheront.
la source
J'ai dû faire ce qui suit car, si les propriétés n'étaient pas déclarées dans le bon ordre, cela casserait les mots au mauvais endroit et sans ajouter de trait d'union.
Publié à l'origine par Enigmo: https://stackoverflow.com/a/14191114
la source
Ouais, si c'est possible, définir une largeur et un réglage absolus
overflow : auto
fonctionne bien.la source
la source
"word-wrap: break-word" fonctionne dans Firefox 3.5 http://hacks.mozilla.org/2009/06/word-wrap/
la source
Ajoutez ceci à
css
votre div:word-wrap: break-word;
la source
après tout le mot s'enroule et se brise, préservez votre débordement et voyez si cela résout votre problème. changez simplement l'affichage de votre div pour:
display: inline;
la source
Une fonction simple (nécessite un underscore.js) - basée sur la réponse @porneL
la source
J'ai écrit une fonction qui fonctionne très bien où elle insère
­
x lettres dans le mot pour un bon saut de ligne. Toutes les réponses ici ne prennent pas en charge tous les navigateurs et appareils, mais cela fonctionne bien avec PHP:la source