最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to target alternate oddeven text lines - Stack Overflow

programmeradmin5浏览0评论

Say I've a p element or div element having a text say about 10-15 lines, now my client has a weird call on this, he needs odd/even lines having different text color. Say Line 1 - Black, so Line 2 should be Grey, Line 3 should be again black and so on...

So I decided using span's and changed the color but variable resolution is killing things here, Am aware of the :first-line selector (Which won't be useful in this case), also selectors like :odd & :even will be ruled out here as am not using tables, so is there any way I can achieve this using CSS or do I need to use jQuery?

TL; DR : I want to target odd/even lines in a paragraph or a div

I need a CSS solution, if not, jQuery and JavaScript are wele

Say I've a p element or div element having a text say about 10-15 lines, now my client has a weird call on this, he needs odd/even lines having different text color. Say Line 1 - Black, so Line 2 should be Grey, Line 3 should be again black and so on...

So I decided using span's and changed the color but variable resolution is killing things here, Am aware of the :first-line selector (Which won't be useful in this case), also selectors like :odd & :even will be ruled out here as am not using tables, so is there any way I can achieve this using CSS or do I need to use jQuery?

TL; DR : I want to target odd/even lines in a paragraph or a div

I need a CSS solution, if not, jQuery and JavaScript are wele

Share Improve this question edited Apr 7, 2013 at 9:41 VisioN 145k34 gold badges286 silver badges289 bronze badges asked Apr 5, 2013 at 9:33 Mr. AlienMr. Alien 157k36 gold badges303 silver badges285 bronze badges 4
  • 1 It's "TL;DR" for "too long; didn't read", not "TLTR"/"too long to read" :) – BoltClock Commented Apr 5, 2013 at 9:34
  • Anyway, you can't style the nth line with CSS. You'll need JavaScript. – BoltClock Commented Apr 5, 2013 at 9:35
  • @BoltClock Just a typo :p – Mr. Alien Commented Apr 5, 2013 at 9:37
  • There is no way to do this is css; you will have to use jQuery. I think the answer you're looking for is here Another useful answer here – Bill Commented Apr 5, 2013 at 9:57
Add a ment  | 

3 Answers 3

Reset to default 12

Demo 1

http://jsfiddle/Fptq2/2/
Should work in all modern browsers.

Essentially it:

  1. Splits the source into individual words once
  2. Wraps each word in a span (ugly but effective-any style can now be applied to the span)
  3. Uses a simple position calculation to determine if the element is lower than the previous
  4. Changes colors based on index change
  5. Performs #3-5 on resize (this should definitely be throttled!)
$(".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);

Demo 2

Fiddle: http://jsfiddle/Fptq2/4/

  • Uses a larger block of text
  • Shows effect applied to multiple elements
  • Caches the "all spans" selector
  • Adds resize throttling
(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);
})();

Output

Here is one possible solution. It generates a number of <div> elements that are placed behind the text. <div> elements inherit font size from the parent container, so the markup shouldn't be damaged.

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/M3pdy/2/

It is too late to answer this question.. But if this answer help to others who wants to separate a wrapped text paragraph into separate lines then I am very happy
Converting wrapped text to lines (either for line numbering or to break each line into individual elements) is a question that es up on the boards quite a bit, and I finally had a need to do so, so here it is (for both MooTools and jQuery – the jQuery version is not tested, so if there’s any issues please leave a ment). This particular incarnation breaks each wrapped line into a distinct new element, but could be modified to just count lines pretty easily.
using the Code you can achieve this $("#someElement").linify()
Here the following URL is the Proof Of Concept for this
jquery-mootools

Here is the Quick fiddle which demonstrates the wrapped text lines to individual div items.
http://jsfiddle/UANeP/

发布评论

评论列表(0)

  1. 暂无评论