【问题标题】:Browser compatible word wrap and whitespace: pre?浏览器兼容的自动换行和空格:pre?
【发布时间】:2010-12-10 20:28:58
【问题描述】:

我需要保留和换行 div 中的文本。到目前为止,我很难想出一个解决方案。我能找到的最佳解决方案不适用于所有浏览器。

以下内容在 Chrome 和 IE6+ 中有效,但在 Firefox 中文本不换行。

 white-space: pre; 
 word-wrap: break-word;

我发现无论出于何种原因,文本在 Firefox 中都没有用空格:pre 换行。并且 -moz-pre-wrap 在 Firefox 3.5 中不起作用(为什么??),只能预包装。但是当我将预包装添加到列表中时,IE 6 和 7 不起作用。非常沮丧。

代码:

.introsub {
  position: relative;
  top: 30px;
  left: 25px;
  width: 550px;
  font-weight: normal;
  line-height: 1.5em;
  overflow: auto;
  margin: 0;
  padding: 1.5em; 
  white-space: pre; 
  word-wrap: break-word;
}

【问题讨论】:

  • 文字不是默认自动换行的吗?你能给我看一些示例代码吗?
  • 我以为会,但事实并非如此。 .introsub { 位置:相对;顶部:30px;左:25px;宽度:550 像素;字体粗细:正常;行高:1.5em;溢出:自动;边距:0;填充:1.5em;空白:pre; word-wrap:断词; }
  • 关于 codeplex 的问题视图似乎受到了这个影响。
  • 默认情况下,几乎每个浏览器都会在几乎所有地方进行自动换行。通常问题是如何将其关闭。我认为如果你问“如何打开它”你已经问错了问题。我要问的问题是“为什么 @#$%& 不是默认打开的?”可能搞砸的是一些看似无关的元素在级联中更高的一些奇怪的东西,这些元素在任何地方都被继承。您能否在某处指出一个完整的工作示例,以便我们检查所有代码(包括看起来不相关的部分)?
  • TLDR:white-space: pre-wrap;

标签: css


【解决方案1】:

CSS3 属性并不总是像我们希望的那样工作:)。 不过,我认为混合 white-space:preword-wrap:break-word 没有任何意义。

除非遇到<br /> 标签,否则前者不会换行。第二个会做相反的事情:在必要时打破单词,即使是在单词中间。它们似乎存在冲突,而对于不同浏览器对这些属性的反应为何不同,最明显的答案是

  • 它们支持两种属性中的任何一种
  • 由于它们存在冲突,因此每个浏览器中的优先级未定义或不同

(我不能确定,我不是这里的专家)。

我建议您仔细查看thisthis,然后决定在您的特定情况下应该使用什么。

[编辑]

您可能想试试这个(应该适用于所有浏览器):

white-space: -moz-pre-wrap; /* Firefox */
white-space: -pre-wrap; /* ancient Opera */
white-space: -o-pre-wrap; /* newer Opera */
white-space: pre-wrap; /* Chrome; W3C standard */
word-wrap: break-word; /* IE */

我还没有测试过这个,但我相信它应该对你有用。

【讨论】:

  • 所有浏览器自动换行的解决方案是什么?我尝试了许多不同的组合,但这是我发现的唯一一种适用于大多数浏览器(不包括 Firefox)的组合。但我也需要 Firefox 才能工作。如果我没有 word-wrap:break-word,那么 IE6 和 7 将无法工作。但我不能使用 pre-wrap,它在 Firefox 3.5 b/c 中有效,在 IE6 或 7 中也不起作用。
  • 不幸的是,我也试过这个,但它在 IE6 或 IE7 中不起作用。真的,如果它在这两个 AND Firefox 中工作我会很高兴(其他浏览器并不那么重要),但到目前为止我还没有找到解决方案。 :[
  • 支持 IE6 和 IE7 是你能做的最糟糕的事情,因为它们让 web 程序员失去了头发:D。即使在大型项目中,我也不添加对这些的支持;)。不过,自动换行应该在它们中起作用,我认为它是在 IE5.5 中实现的。
  • 我将 css 用于“pre”,它甚至可以在 IE7 中使用。没有滚动条!
【解决方案2】:

我知道这是一个非常古老的问题,但由于我刚刚遇到它,所以我有回答的冲动。

我的解决方案是:

使用white-space: pre-wrap;,因为它与white-space: pre; 几乎相同,只是添加了换行符。 (参考:http://www.quirksmode.org/css/whitespace.html

然后我会专门针对 old-ie 使用条件 cmets(参考:http://www.quirksmode.org/css/condcom.html)或特定于浏览器的 css hack(http://paulirish.com/2009/browser-specific-css-hacks/)。

第二种方法的例子:

.introsub {
  position: relative;
  top: 30px;
  left: 25px;
  width: 550px;
  font-weight: normal;
  line-height: 1.5em;
  overflow: auto;
  margin: 0;
  padding: 1.5em; 
  white-space: pre-wrap; 
  word-wrap: break-word;
}

/* IE6 and below */
* html .introsub  { white-space: pre  }

/* IE7 */
*:first-child+html .introsub { white-space: pre  } 

这足以强制它换行。

【讨论】:

  • 这应该是公认的答案。如果你想看到段落和文本换行,white-space: pre-wrap;完美运行
  • 我想指出,在<pre> 标签上使用@SoonDead 建议(相对于<div>)对我来说效果最好。我的用例是从<div> 复制文本时需要保留格式。使用white-space: pre-wrap 包装了显示的文本,但是在复制+粘贴时格式化消失了(虽然不是在复制+特殊粘贴上)。我将<div> 更改为<pre>,然后它就起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多