假设我有一个p
元素或div
元素,文本说大约10-15行,现在我的客户端对此有一个奇怪的调用,他需要具有不同文本的奇数/偶数行颜色。比较第1行 - 黑色,因此第2行应该是灰色,第3行应该是黑色等等......
所以我决定使用span并改变颜色但是变量分辨率在这里杀死了东西,我知道:first-line
选择器(在这种情况下不会有用),还有像:odd
这样的选择器&安培; :even
将被排除在这里,因为我没有使用表格,所以有什么方法可以使用CSS实现这一点,还是我需要使用jQuery?
TL; DR:我想在段落或div中定位奇数/偶数行
我需要一个CSS解决方案,如果没有,欢迎使用jQuery和JavaScript
答案 0 :(得分:8)
一个相当难看的小解决方案,因为它是凌晨3:30。不过,它适用于纯文本块,并允许每行都单独设置样式。
小提琴: http://jsfiddle.net/Fptq2/2/
Chrome 26,FF 20,Safari 5.1.7,IE 8/9/10(7可能可以使用)
基本上它:
$(".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);
小提琴: 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);
})();
答案 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);
答案 2 :(得分:1)
现在回答这个问题为时已晚。但如果这个答案对其他想要将包装好的文字段分成单独的行的人有帮助那么我很开心
将包装文本转换为行(用于行号或将每行分成单个元素)是一个问题,在板上出现了很多,我终于需要这样做了,所以这里是(对于两个MooTools)和jQuery - jQuery版本没有经过测试,所以如果有任何问题请发表评论)。这个特殊的化身将每个包裹的行分成一个独特的新元素,但可以修改为只是很容易计算行。
使用Code您可以实现此目的
$("#someElement").linify()
这里的以下URL是此概念证明
jquery-mootools
这是快速小提琴,它演示了包装文本行到各个div项目
http://jsfiddle.net/UANeP/