¿Puede CSS forzar un salto de línea después de cada palabra en un elemento?

159

Estoy construyendo un sitio multilingüe, con el propietario ayudándome con algunas traducciones. Algunas de las frases que se muestran necesitan saltos de línea para mantener el estilo del sitio.

Desafortunadamente, el propietario no es un tipo de computadora, por lo que si ve que foo<br />barexiste la posibilidad de que modifique los datos de alguna manera mientras está traduciendo.

¿Existe una solución CSS (además de cambiar el ancho) para aplicar a un elemento que se rompería después de cada palabra?

(Sé que puedo hacer esto en PHP, pero me pregunto si hay un truco ingenioso que no conozco en CSS para lograr lo mismo, tal vez en las características de CJK).

EDITAR

Intentaré diagramar lo que está sucediendo:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

La palabra larga se rompe automáticamente, la palabra corta no. Quiero que se vea así:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------
Ben
fuente
2
En HTML, los elementos se rompen después de cada palabra, cuando el ancho de un elemento dado lo requiere. ¿Te refieres a las palabras?
Paul D. Waite
@Paul - No, necesito una solución que no se base en arreglar el ancho. El problema es que algunas frases son más largas y se rompen automáticamente (como usted describe) y algunas frases son más cortas y no se rompen, haciendo una presentación inconsistente.
Ben
@Paul - Sí, es como si describieras exactamente. Realmente no daña el diseño, pero podría verse mejor.
Ben
podrías usar el espaciado de palabras pero afectaría a todas las palabras. Creo que no puedes evitar envolver esas palabras en elementos de extensión.
Meo
@meo - Parece así, gracias por la idea
Ben

Respuestas:

261

Utilizar

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

donde <parent-width>es el ancho del elemento padre (o un valor alto arbitrario que no cabe en una línea). De esa manera, puede estar seguro de que incluso hay un salto de línea después de una sola letra. Funciona con Chrome / FF / Opera / IE7 + (y probablemente incluso IE6 ya que también admite el espaciado de palabras).

Hurs van Bloob
fuente
Esta es definitivamente la mejor respuesta en mi humilde opinión
Hezad
31
@ToniMichelCaubet La respuesta es realmente difícil de interpretar, pero quiere decir: ¿ .parent { word-spacing: 100px; }dónde 100pxestá el ancho del elemento padre? El problema es que esta solución no funciona si tienes un padre fluido.
John Kurlak
55
Simplemente establezca un valor muy alto para el espaciado de palabras como word-spacing: 100000pxy no tendrá que preocuparse de que el padre sea fluido en términos de ancho. Establecer un espacio entre palabras del 100% tendría sentido (habría sido el 100% del ancho principal), pero los valores expresados ​​en porcentaje no son compatibles con esa propiedad css.
sboisse
1
Esto fue muy útil. Lo utilicé en una situación receptiva, donde en un ancho quiero que el texto en pestañas se ajuste para que todos tengan la misma altura: word-spacing: 2em; y en un ancho móvil, quiero que sean de una sola línea:word-spacing: unset;
Será el
1
Esto es increíble. De años en el futuro, muchas gracias :)
Lucas Medina
124

La respuesta dada por @HursVanBloob funciona solo con contenedores primarios de ancho fijo, pero falla en el caso de contenedores de ancho fluido .

Probé muchas propiedades, pero nada funcionó como se esperaba. Finalmente llegué a la conclusión de que dar word-spacingun valor muy grande funciona perfectamente bien.

p { word-spacing: 9999999px; }

o, para los navegadores modernos se puede utilizar el CSS vwunidad (ancho visual en% del tamaño de la pantalla).

p { word-spacing: 100vw; }
Deepak Yadav
fuente
¡eso es lo que intentaré!
vaskort
Esta es una gran solución!
Joe Conlin
Completamente rompe con & nbsp; aunque.
Matt Fletcher el
2
Bueno, no funciona para mí, lo que hace que el ancho del fluido del contenedor sea muy, muy alto.
Onza
@Onza, ¿puedes compartir un enlace de violín que muestre tu problema?
Deepak Yadav
37

Se describe una solución alternativa en una oración separada para una palabra por línea , aplicando display:table-caption;al elemento

malcomio
fuente
En realidad, esto solo agrupa palabras según el ancho de la palabra más larga.
James South
1
Si bien esto puede agrupar palabras en una línea, funciona muy bien en muchas situaciones y no se siente tan confuso como la opción de espaciado masivo de palabras.
Dale
1
Este es el que funcionó perfectamente para mí, agradable!
Matt Fletcher el
1
No da ningún resultado
jafarbtech
32

Intenta usar white-space: pre-line;. Crea un salto de línea siempre que aparezca un salto de línea en el código, pero ignora los espacios en blanco adicionales (pestañas y espacios, etc.).

Primero, escriba sus palabras en líneas separadas en su código:

<div>Short
Word</div>

Luego aplique el estilo al elemento que contiene las palabras.

div { white-space: pre-line; }

Sin embargo, tenga cuidado , cada salto de línea en el código dentro del elemento creará un salto de línea. Por lo tanto, escribir lo siguiente dará como resultado un salto de línea adicional antes de la primera palabra y después de la última palabra:

<div>
    Short
    Word
</div>

Hay un gran artículo sobre CSS Tricks que explica los otros atributos de espacio en blanco.

Nass
fuente
Debe explicar cómo white-spacese puede usar para responder la pregunta. Lo siento, pero no veo cómo.
jlgrall
2
Bueno, el artículo sobre CSS Tricks lo explica completamente, así que pensé que un enlace sería suficiente, en lugar de intentar regurgitar la respuesta aquí.
Nass
Ok, ¿entonces sugiere poner saltos de línea reales en la fuente y usar el CSS " white-space: pre;" para mostrar esos saltos de línea como <pre>lo haría una etiqueta? Eso podría funcionar, y un salto de línea debería parecer más natural para los traductores que a <br />. Trataré de editar tu respuesta para agregarla :)
jlgrall
Exactamente. Bueno, en realidad, white-space: pre-line;probablemente sería más apropiado, ya que ignora los espacios en blanco adicionales en su código. Actualizaré la respuesta.
Nass
Bien, tal vez solo agregue white-space: pre;para IE 7.
jlgrall
12

Si desea poder elegir entre diferentes soluciones, además de las respuestas dadas ...

Un método alternativo es darle al contenedor un ancho de 0 y asegurarse de que el desbordamiento sea visible. Entonces, cada palabra se desbordará y estará en su propia línea.

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

O puede usar uno de esos widthvalores recién propuestos , siempre que aún existan para cuando lea esto.

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Señor lister
fuente
4

No puede orientar cada palabra en CSS. Sin embargo, con un poco de jQuery probablemente puedas.

Con jQuery puede ajustar cada palabra en <span>ay luego establecer CSS span para display:blockque lo coloque en su propia línea.

En teoría, por supuesto: P

marca
fuente
Sí, tenía miedo de eso. También podría hacerlo en PHP, pero parece una solución fea. Estaba pensando que podría haber algún :first-childtruco o algo por ahí ...
Ben
@Steve: no, los selectores CSS actualmente solo le permiten seleccionar elementos HTML, no nodos de texto. Eché un vistazo al módulo de texto CSS 3 , pero no parece haber nada allí que obligue a una pausa después de cada palabra en un elemento. La solución de Mark es tu mejor apuesta.
Paul D. Waite
@Paul, @Mark - Si uno de ustedes quiere el representante, podrían responderlo y lo aceptaré. Voy a marcar esto como sin respuesta (por ahora) según meta.stackoverflow.com/questions/48013/… .
Ben
Creo que Mark ya ha respondido, en lo que a mí respecta, todo el representante es suyo.
Paul D. Waite
@Paul - +1 jugador del equipo dale al chico una insignia o algo :)
Ben
2

https://jsfiddle.net/bm3Lfcod/1/

Para aquellos que buscan una solución que funcione dentro de un contenedor principal flexible con un elemento secundario que sea flexible en ambas dimensiones. p.ej. botones de la barra de navegación.

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}
Onza
fuente
Intenta darle a ese lapso cualquier otra CSSpropiedad que puedas dar. Decir una propiedad que podría causarbrowser reflow
Deepak Yadav
1
reflujo del navegador?
Onza
2

Me enfrenté al mismo problema, y ​​ninguna de las opciones aquí me ayudó. Algunos servicios de correo no admiten estilos específicos. Aquí está mi versión, que resolvió el problema y funciona en todos los lugares que verifiqué:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

O usando CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>
eep
fuente
2

La mejor solución es la word-spacingpropiedad.

Agregue el <p>en un contenedor con un tamaño específico (ejemplo 300px) y después de que tenga que agregar ese tamaño como el valor en el espacio entre palabras.

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

De esta manera, su oración siempre se romperá y se establecerá en una columna, pero el con del párrafo será dinámico.

Aquí un ejemplo de Codepen

Cosimo wiSe
fuente
-1

En mi caso,

    word-break: break-all;

funcionó a la perfección, espero que ayude a cualquier otro recién llegado como yo.

Emanuel Hiroshi
fuente
Un -1 de mi parte porque esta es una respuesta incorrecta. Esto rompe la línea en cada personaje SI es necesario.
Emobe