CSS可以在元素中的每个单词后强制换行吗?


159

我正在建立一个多语言站点,所有者正在帮助我进行一些翻译。显示的某些短语需要换行以保持网站的风格。

不幸的是,所有者不是计算机专家,所以如果他看到他foo<br />bar有机会在翻译时以某种方式修改数据。

是否有CSS解决方案(除了更改宽度)适用于在每个单词之后都会中断的元素?

(我知道我可以用PHP做到这一点,但是我想知道是否有一个我不知道的CSS技巧可以完成同一件事,也许是在CJK功能中。)

编辑

我将尝试说明发生的情况:

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

长单词会自动中断,短单词不会。我希望它看起来像这样:

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

2
在HTML中,当给定元素的宽度需要时,元素会在每个单词之后中断。你的意思是言语内吗?
Paul D. Waite,2010年

@Paul-不,我需要一个不基于固定宽度的解决方案。问题是,某些短语较长且会自动中断(如您所描述的),而某些短语较短且不会中断,从而导致显示不一致。

@Paul-是的,就像您所描述的一样。并没有真正损害布局,但是看起来会更好。

您可以使用单词间距,但会影响所有单词。我认为您无法解决将这些单词包装在span元素中的问题。
MEO

@meo -看起来像,感谢您的想法

Answers:


261

.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;
}

<parent-width>父元素的宽度在哪里(或不适合一行的任意高值)。这样,您可以确保单个字母后甚至还有换行符。适用于Chrome / FF / Opera / IE7 +(甚至可能支持IE6,因为它也支持单词间距)。


这绝对是最好的答案,恕我直言
Hezad 2012年

31
@ToniMichelCaubet答案的确很难解释,但他的意思是:父元素的宽度.parent { word-spacing: 100px; }在哪里100px。问题是,如果您的父母亲很活泼,则此解决方案将无法正常工作。
约翰·库拉克

5
只需为诸如这样的单词间距设置一个非常高的值word-spacing: 100000px,您就不必担心父元素在宽度方面的变化。将字间距设置为100%会很有意义(它应该是父宽度的100%),但是该css属性不支持以百分比表示的值。
sboisse 2014年

1
这非常有帮助。我将其用于响应性的情况下,在这种情况下,我希望标签中的文本以一种宽度来换行,以便它们都具有相同的高度:word-spacing: 2em; 在移动宽度上,我希望它们是单行的:word-spacing: unset;
2015年

1
这真太了不起了。从未来的几年中,感谢一堆:)
卢卡斯·麦地那

124

@HursVanBloob给出的答案仅适用于固定宽度的父容器,但对于流体宽度的容器无效

我尝试了很多属性,但没有按预期工作。最后,我得出一个结论,即给word-spacing一个非常巨大的价值就可以了。

p { word-spacing: 9999999px; }

或者,对于现代的浏览器,您可以使用CSS vw单位(以屏幕尺寸的百分比表示的可视宽度)。

p { word-spacing: 100vw; }

多数民众赞成在我将尝试!
vaskort 2014年

这是一个很好的解决方案!
乔·康林

与&nbsp;完全分开 虽然。
马特·弗莱彻

2
好吧,这对我来说是行不通的,这会使容器的流体宽度变得非常高。
Onza

@Onza您可以共享一个小提琴链接来显示您的问题吗?
Deepak Yadav'4

37

通过将应用于元素,将替代描述为每行将一个单词分隔成一个句子display:table-caption;


实际上,这仅根据最长单词的宽度对单词进行分组。
詹姆斯·南

1
尽管这可以将单词组合在一行上,但在很多情况下都非常有效,并且不会像庞大的单词间距选项那样令人讨厌。
戴尔

1
这是最适合我的一个,很好!
马特·弗莱彻

1
它没有给出任何结果
jafarbtech '17

32

尝试使用white-space: pre-line;。它会在代码中出现换行符的位置创建换行符,但会忽略多余的空格(制表符和空格等)。

首先,在您的代码的不同行上写下您的单词:

<div>Short
Word</div>

然后将样式应用于包含单词的元素。

div { white-space: pre-line; }

但是请注意,元素内代码中的每个换行符都会创建一个换行符。因此,编写以下内容将导致在第一个单词之前和最后一个单词之后出现额外的换行符:

<div>
    Short
    Word
</div>

CSS Tricks上有一篇很棒的文章介绍了其他空白属性。


您应该解释如何white-space用来回答这个问题。抱歉,我不知道如何。
jlgrall

2
那么在文章CSS技巧充分说明了它,所以我想一个链接就足够了,而不是试图在这里反刍答案。
纳斯

好的,因此,您建议在源代码中放置实际的换行符,并使用CSS“ white-space: pre;”来显示这些换行符,就像<pre>标记一样吗?这可能有效,并且换行符比换行符看起来更自然<br />。我将尝试编辑您的答案以添加它:)
jlgrall 2013年

究竟。实际上,white-space: pre-line;可能会更合适,因为它会忽略代码中的多余空格。我将更新答案。
纳斯

好,也许只是white-space: pre;为IE 7 添加
。– jlgrall

12

如果您希望能够从不同的解决方案中进行选择,那么除了给出的答案外...

另一种方法是使容器的宽度为0,并确保可见溢出。然后,每个单词将从其中溢出,并排成一行。

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

或者,您可以使用这些新提议的width值之一,前提是在阅读本文时这些值仍然存在。

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>


4

您不能在CSS中定位每个单词。但是,使用jQuery可能可以。

使用jQuery时,您可以将每个单词包装在中<span>,然后将CSS设置跨度设置为单独display:block的行。

理论上当然是:P


是的,我很害怕。也可以在PHP中做到这一点,但这似乎是一个丑陋的解决方案。我想可能有一些:first-child技巧或东西在那里...

@Steve:不,CSS选择器当前仅允许您选择HTML元素,而不能选择文本节点。我看过CSS 3文本模块,但是似乎没有什么可以在元素中的每个单词之后强制中断。马克的解决方案是您最好的选择。
Paul D. Waite,2010年

@ Paul,@ Mark-如果你们中的某人想要代表,您可以提出一个答案,我会接受的。根据meta.stackoverflow.com/questions/48013/…,我现在将其标记为无法回答。

我认为Mark已经做出了答案,就我而言,所有代表都是他的。
Paul D. Waite,2010年

@保罗- +1队的球员给这家伙一个徽章或东西:)

2

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

对于那些寻求在带有两个子代的子代的柔性父代容器中工作的解决方案的人。例如。导航栏按钮。

//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;
}

尝试给该范围任何CSS您可以提供的其他属性。说出可能造成财产损失的原因browser reflow
Deepak Yadav

1
浏览器重排?
Onza

2

我遇到了同样的问题,这里没有任何选择可以帮助我。某些邮件服务不支持指定的样式。这是我的版本,它解决了该问题,并且在我检查过的所有地方都可以使用:

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

或使用CSS:

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

2

最好的解决方案是word-spacing财产。

添加<p>在容器中具有特定大小(例如300px),你必须是大小添加为字间距值后。

的HTML

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

的CSS

div {
 width: 300px;
}

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

这样,您的句子将始终被打断并设置在列中,但是段落的with将是动态的。

这是 Codepen 示例


-1

就我而言

    word-break: break-all;

努力工作,希望它对像我这样的其他新手有帮助。


来自我的-1,因为这是错误的答案。这会在需要的每个字符处中断行。
Emobe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.