css连续字符自动换行(word-wrap和word-break)的解决方案

下面是常见浏览器的支持情况:

面是常见浏览器的支持情况:

  IE6/7/8[1] Firefox2/3[2] Firefox3.5 Opera9+ Safari9.5+/Chrome
{word-wrap:break-word;} td元素需设置其宽度
见例4和例5
不支持 不支持td元素
见例4和例5
不支持 不支持td元素
见例4和例5
{word-break:break-all;} 不支持连续的符号
见例3
不支持 不支持连续的符号
见例3
不支持 支持

由于{word-break:break-all;}导致英文和数字可读性严重下降且无法使连续符号换行,所以{word-wrap:break-word;}是一个相对较好的选择。需要注意的是各个浏览器中word-wrap在td上实现不一致,所以避免直接在td上使用。

但面对浏览器的如此糟糕支持,所以不能不借助JavaScript来解决这个问题,即当浏览器不支持CSS解决方案时,在连续字符串的适当位置插入​字符(当然还可以用<wbr />和&shy;,这三个字符在浏览器中的支持情况请看ppk的《The wbr tag》),这些字符写在浏览器中不会显示,却使长字符串换行。​和&shy;都会导致复制用其处理过的文本时有大量不可打印的字符,导致字符数急剧增大,更严重的是导致复制的链接字符串不可用,所以用<wbr />是比较好的方案,虽然<wbr />在IE8中不被支持且在Safari中有bug,但这些浏览器可以直接用CSS{word-wrap:break-word}来实现无需用<wbr />处理。Opera下要兼容<wbr />,需要设置CSS:wbr:after { content: "0200B" }。

重写了实现方法

具体实现代码如下:

function fnBreakWordAll(o){
var o = o || {},
  iWord = o.word || 13,
  iRe = o.re || '[a-zA-Z0-9]',
  bAll = o.all || false,
  sClassName = o.className || 'word-break-all',
  aEls = o.els || (function(){
    var aEls = [],
      aAllEls = document.getElementsByTagName('*'),
      re = new RegExp('(?:^|\s+)' + sClassName + '(?:\s+|$)');
    for(var i =0,iLen = aAllEls.length; i < iLen ; ++i){
      if(re.test(aAllEls[i].className)){
        aEls[aEls.length] = aAllEls[i];
      }
    }
    return aEls;
  })() || [],
  fnBreakWord = function(oEl){
    // 基于http://www.hedgerwow.com/360/dhtml/css-word-break.html修改
    if(!oEl || oEl.nodeType !== 1){
      return false;
    }else if(oEl.currentStyle && typeof oEl.currentStyle.wordWrap==='string'){
      breakWord = function(oEl){
        oEl.runtimeStyle.wordWrap = 'break-word';
        return true;
      }
      return breakWord(oEl);
    }else if(document.createTreeWalker){
      var trim = function  (str) {
        str = str.replace(/^ss*/, '');
        var ws = /s/,
        i = str.length;
        while (ws.test(str.charAt(--i)));
        return str.slice(0, i + 1);
      }
      breakWord = function(oEl){
        var dWalker=document.createTreeWalker(oEl,NodeFilter.SHOW_TEXT,null,false);
        var node,s,c = String.fromCharCode('8203'),
          //re = /([a-zA-Z0-9]{0,13})/;
          re = new RegExp('('+ iRe +'{0,' + iWord + '})');
        while (dWalker.nextNode()){
          node = dWalker.currentNode;
          s = trim(node.nodeValue).split(re).join(c);
          node.nodeValue = s;
        }
        return true;
      }
      return breakWord(oEl);
    }
  };
for(var i=0,n=aEls.length; i<n; ++i){
  var sUa = navigator.userAgent,
    sTn = aEls[i].tagName.toLowerCase() ;
  if((/Opera/).test(sUa) || (/Firefox/).test(sUa) || ((/KHTML/).test(sUa) &&
  (sTn === 'td' || sTn === 'th')) || bAll){
    fnBreakWord(aEls[i]);
  }
}
}

具体应用请看

fnWordBreakAll函数提供一些定制参数,使用方法和参数含义如下:

fnWordBreakAll({word:15,re:'[\w]',all:true});

参数 说明
word 正整数,默认是13 在这个字数内的单词不会被插入u8203,印象中超过13个字母的单词不多,这可以保证绝大部分单词不会被打碎
re 正则表达式,默认[a-zA-Z0-9] 单词的正则表达式,用以确定一个单词是哪些字符组成,注意的转义
all 布尔值,默认false 确定是否在所有的浏览器中执行,默认在Opera和Firefox,以及当class应用在th或td的Safari上执行,这个主要用在.word-break-all没有定义时,会对IE加上样式
className 合法class名,默认word-break-all 执行函数的元素对应属性名

 

时间: 2024-10-29 17:54:05

css连续字符自动换行(word-wrap和word-break)的解决方案的相关文章

css 连续字符自动换行的解决方案

对文本的处理新增了两个新属性word-wrap和word-break来解决这个问题: {word-break:break-all;} :依照亚洲语言和非亚洲语言的文本规则,允许在字内换行,且允许非亚洲语言文本行的任意字内断开 {word-wrap:break-word;}: 内容将在边界内换行,如需要则词内换行(word-break)也行发生   IE6/7/8[1] Firefox2/3[2] Firefox3.5 Opera9+ Safari9.5+/Chrome {word-wrap:br

前端-word wrap和word break为啥设计成一个属性?

问题描述 word wrap和word break为啥设计成一个属性? word-wrap: The word-wrap property is used to specify whether or not the browser may break lines within words in order to prevent overflow when an otherwise unbreakable string is too long to fit in its containing bo

word wrap 解惑

源起 我们经常需要"修复"一个老生常谈的"bug",那就是文本的自动换行问题.在专业术语上,这种期望得到的渲染现象被称作"word wrap",即文本处理器有能力把超出页边的整个词自动传到下一行. 在现实项目中,尤其是在测试阶段,鉴于测试使用非常极端的测试用例,我们经常需要"修复"如图所示的这个问题: 长单词溢出 图中,极长的这个英文单词(虽然是生造的)为了保证完整的显示,无奈地超出了容器的限制,它溢出了.为了"修复

js实现连续英文字符自动换行兼容ie6 ie7和firefox_javascript技巧

复制代码 代码如下: irefox中连续英文字符如果要CSS控制强制换行,探索了N久,发现是实现不了的逼不得已的时候就用js脚本进行控制吧 英文字符自动换行,通过js脚本截断字符串,此方法通用ie6,ie7,firefox兼容解决办法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

Word怎么查询Word中某字符的个数?

  有时候我们在用Word的时候会有一些小问题出现,或是自己想要实现的功能,比如查询数字的问题,问题:怎么查询Word中某字符的个数?比如我在一篇Word文档中查询中国两个字,如何查询中国两个字在这篇文档中出现的次数.当然不能通过查找替换一个个数来解决问题哦? Word教程 解答:我要告诉你一个最简单方法,就是使用Word的"查找/替换",但肯定不是你想像的那样,应该是出乎你的意料!在Word中按快捷键Ctrl+H,打开"替换"对话框,在"查找内容&quo

css中字符换行的一些问题

我们在处理文章的内容的过程中由于文章内容混杂有中文.英文.数字等其他字符,而我们常见的英文和数字是无法在包裹元素中自动换行,这往往会导致元素被撑破,如下图所示: css中word-break可以解决这个问题,写个测试页面来做个笔记 css代码: body{font-size:14px;} p{ border:solid 1px red;width:200px;} html代码: <body>     <p class="test">English中文中文中文中文

[New Paper]A Joint Model for Word Embedding and Word Morphology

大家端午节快乐!本文将分享一篇关于词向量模型最新研究的文章,文章于6月8号提交到arxiv上,题目是A Joint Model for Word Embedding and Word Morphology,作者是来自剑桥大学的博士生Kris Cao. 本文最大的贡献在于第一次将词形联合词向量一同进行训练,从某种程度上解决了未登录词(OOV)的词向量表示问题,同时也得到了一个效果不错的词形分析器. 介绍本文模型之前先简单介绍下本文中采用的词向量训练方法,skip-gram with negativ

把字符串中的任意连续字符换成一个对应字符

<?php //1,把字符串中的任意空格换成一个 $str1 = 'A B C '; echo '<xmp>'; echo '1:'; echo preg_replace ("/\s+/", ' ', $str1); echo '</xmp>'; //2,把字符串中的任意连续字符 M 换成一个 M echo '2: '; $str1 = 'AMMMBMMMMCMM '; echo preg_replace ("/M+/", 'M', $

Word 2003和Word 2007如何快速“无格式粘贴”

  Word 2003和Word 2007如何快速"无格式粘贴"       word 2003 打开Word 2003窗口,依次点击"工具/宏/Visual Basic编辑器",打开"Microsoft visual Basic"窗口,在左侧"工程"栏选中"Normal"选项,点击"插入/模块"选项打开一个模块窗口,输入以下代码: Sub MyPaste() Selection.Pas