javascript - 通过javascript检测浏览器换行

标签 javascript jquery html css

我需要 javascript 来检测每个浏览器包装的文本行并将其包装到 <span class="line"> 中.

我看到过关于测量每个单词的 y 轴的文章,但没有看到可靠的解决方案。

这是我目前所拥有的。在 Jsfiddle 上查看.

HTML

<div class="inline-bg">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec cursus condimentum metus, et placerat augue rutrum vitae. Donec arcu lorem, eleifend at elementum eget, consectetur vel lacus. Nam euismod iaculis varius. Phasellus sed dui diam. Nullam facilisis, diam sit amet sagittis cursus, metus tortor gravida erat, ut fringilla risus ipsum eu nisl.</div>​

JS/jQuery

(function($){
    $.fn.inlinebackground = function() {
        $.each(this, function(i,t) {
            var split = $(t).html().split(' ');
            var output = '';
            $.each(split, function(i,o){
                output += '<span class="line">'+o+'</span>';
                if (i < (split.length - 1)) {
                    output += '<br>';
                }
            });
            $(t).html(output);
        });
    }
})(jQuery);

/* End Plugin Code */

// Run the plugin on .news-caption 
$(function(){
    $('.inline-bg').inlinebackground();
});

CSS

.inline-bg { width: 200px; line-height:3em; }
.inline-bg span.line { background-color: black; color: white; padding: 15px; }

最佳答案

我不得不承认,一开始我认为这将是一项艰巨的任务,因为没有办法让任务浏览器告诉您自动换行发生的位置。

我创建了一个解决方案,首先将每个单词包装在一个跨度中,然后遍历所有跨度以确定它们在容器中的顶部位置。然后它构建一个行开始和结束跨度的索引数组,并将每行单词跨度包装在一个包装跨度中。

演示: http://jsfiddle.net/KVepp/2/

可能的限制:

  • 在每个跨度末尾添加的空间可能会导致跨度中断 文本可能不在的新行。
  • 不确定换行后是否需要删除每个单词跨度。 (非常简单的模组)
  • 假定容器中除文本外没有其他 html
  • 如果需要,需要做一些额外的工作才能变成插件 用于多个容器
  • 单词的正则表达式是按空格简单分割的。可能需要额外的 重复空格的正则表达式

HTML:

<div id="content">Lorem Ipsum<div> 

CSS:

#content{ position:relative}

JS:

var $cont = $('#content')

var text_arr = $cont.text().split(' ');

for (i = 0; i < text_arr.length; i++) {
    text_arr[i] = '<span>' + text_arr[i] + ' </span>';
}

$cont.html(text_arr.join(''));

$wordSpans = $cont.find('span');

var lineArray = [],
    lineIndex = 0,
    lineStart = true,
    lineEnd = false

$wordSpans.each(function(idx) {
    var pos = $(this).position();
    var top = pos.top;

    if (lineStart) {
        lineArray[lineIndex] = [idx];
        lineStart = false;

    } else {
        var $next = $(this).next();

        if ($next.length) {
            if ($next.position().top > top) {
                lineArray[lineIndex].push(idx);
                lineIndex++;
                lineStart = true
            }
        } else {
            lineArray[lineIndex].push(idx);
        }
    }

});

for (i = 0; i < lineArray.length; i++) {
var start = lineArray[i][0],
    end = lineArray[i][1] + 1;

/* no end value pushed to array if only one word last line*/
if (!end) {
    $wordSpans.eq(start).wrap('<span class="line_wrap">')
} else {
    $wordSpans.slice(start, end).wrapAll('<span class="line_wrap">');
}

}

关于javascript - 通过javascript检测浏览器换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887372/

相关文章:

javascript - 移动浏览器和 100% x 100% 固定元素

javascript - 为什么 IE 拒绝在我的网站上呈现 swf?

jquery隐藏所有图像但不隐藏第一个

javascript - 在 componentDidMount() 下调用 jQuery 函数会阻止 onChange 事件

jQuery 数据表按列标题排序

html - 为什么顶部的边距不会改变?

javascript - 在 Safari 中播放声音

javascript - 检查元素是否具有列表/数组中给出的类

javascript - 使用 FOR 循环将值存储在变量中,例如多维数组值

javascript - jQuery:如果列表项已选中内部单选按钮,则添加类