如何定位备用奇数/偶数文本行

时间:2013-04-05 09:33:11

标签: javascript jquery css

假设我有一个p元素或div元素,文本说大约10-15行,现在我的客户端对此有一个奇怪的调用,他需要具有不同文本的奇数/偶数行颜色。比较第1行 - 黑色,因此第2行应该是灰色,第3行应该是黑色等等......

所以我决定使用span并改变颜色但是变量分辨率在这里杀死了东西,我知道:first-line选择器(在这种情况下不会有用),还有像:odd这样的选择器&安培; :even将被排除在这里,因为我没有使用表格,所以有什么方法可以使用CSS实现这一点,还是我需要使用jQuery?

  

TL; DR:我想在段落或div中定位奇数/偶数行

我需要一个CSS解决方案,如果没有,欢迎使用jQuery和JavaScript

3 个答案:

答案 0 :(得分:8)

演示1

一个相当难看的小解决方案,因为它是凌晨3:30。不过,它适用于纯文本块,并允许每行都单独设置样式。

小提琴: http://jsfiddle.net/Fptq2/2/
Chrome 26,FF 20,Safari 5.1.7,IE 8/9/10(7可能可以使用)

基本上它:

  1. 将来源拆分为单个单词
  2. 包含跨度中的每个单词(丑陋但有效 - 任何样式现在可以应用于跨度)
  3. 使用简单的位置计算来确定元素是否低于之前的
  4. 根据索引更改更改颜色
  5. 调整大小时执行#3-5(这绝对应该受到限制!)
  6. $(".stripe").each(function(){
      var obj = $(this);
      var html = obj.html().replace(/(\S+\s*)/g, "<span>$1</span>");
      obj.html(html);
    });
    
    function highlight(){
        var offset = 0;
        var colorIndex = 0;
        var colors = ["#eee","#000"];
        var spans = $(".stripe span");
    
        // note the direct DOM usage here (no jQuery) for performance
        for(var i = 0; i < spans.length; i++){
            var newOffset = spans[i].offsetTop;  
    
            if(newOffset !== offset){
                colorIndex = colorIndex === 0 ? 1 : 0;
                offset = newOffset;
           }
    
           spans[i].style.color = colors[colorIndex];
        }
    }
    
    highlight();
    $(window).on("resize", highlight);
    

    演示2

    小提琴: http://jsfiddle.net/Fptq2/4/

    • 使用更大的文本块
    • 显示应用于多个元素的效果
    • 缓存“所有跨度”选择器
    • 添加调整大小限制
    (function () {
        $(".stripe").each(function () {
            var obj = $(this);
            var html = obj.html().replace(/(\S+\s*)/g, "<span>$1</span>");
            obj.html(html);
        });
    
        var offset = 0;
        var colorIndex = 0;
        var colors = ["#ccc", "#000"];
        var spans = $(".stripe span");
    
        function highlight() {
            for (var i = 0; i < spans.length; i++) {
    
                var newOffset = spans[i].offsetTop;
                if (newOffset !== offset) {
                    colorIndex = colorIndex === 0 ? 1 : 0;
                    offset = newOffset;
                }
    
                spans[i].style.color = colors[colorIndex];
            }
        }
    
        highlight(); // initial highlighting
    
        var timeout;
        function throttle(){
            window.clearTimeout(timeout);
            timeout = window.setTimeout(highlight, 100);
        }
    
        $(window).on("resize", throttle);
    })();
    

    输出

    enter image description here

答案 1 :(得分:4)

这是一种可能的解决方案。它会生成许多放置在文本后面的<div>个元素。 <div>元素从父容器继承字体大小,因此不应损坏标记。

HTML:

<div id="test">Lorem ipsum ...</div>

JavaScript的:

var div = document.getElementById("test"),
    layer = document.createElement("div"),
    text = div.innerHTML,
    lineHeight;

layer.appendChild(document.createTextNode("\u00A0"));
div.insertBefore(layer, div.firstChild);

lineHeight = layer.offsetHeight;
div.style.position = "relative";
div.style.overflow = "hidden";
div.style.color = "transparent";
layer.style.position = "absolute";
layer.style.zIndex = "-1";

window.addEventListener("resize", (function highlight() {
    while (layer.firstChild)
        layer.removeChild(layer.firstChild);

    for (var i = 0, n = Math.ceil(div.offsetHeight / lineHeight); i < n; i++) {
        var line = document.createElement("div"),
            block = document.createElement("div");

        line.style.height = lineHeight + "px";
        line.style.color = i % 2 ? "#ccc" : "#aaa";
        line.style.overflow = "hidden";

        block.innerHTML = text;
        block.style.marginTop = -i * lineHeight + "px";

        line.appendChild(block);
        layer.appendChild(line);
    }
    return highlight;
})(), false);

DEMO: http://jsfiddle.net/M3pdy/2/

答案 2 :(得分:1)

现在回答这个问题为时已晚。但如果这个答案对其他想要将包装好的文字段分成单独的行的人有帮助那么我很开心
将包装文本转换为行(用于行号或将每行分成单个元素)是一个问题,在板上出现了很多,我终于需要这样做了,所以这里是(对于两个MooTools)和jQuery - jQuery版本没有经过测试,所以如果有任何问题请发表评论)。这个特殊的化身将每个包裹的行分成一个独特的新元素,但可以修改为只是很容易计算行。
使用Code您可以实现此目的 $("#someElement").linify()
这里的以下URL是此概念证明 jquery-mootools

这是快速小提琴,它演示了包装文本行到各个div项目 http://jsfiddle.net/UANeP/