我可以用CSS完成这个吗?

时间:2012-07-17 08:28:59

标签: css css-selectors

如果我有这样的元素:

<a href="something">A</a>
<a href="something_else">B</a>
<a href="something">A</a>
<a href="...">C</a>

我知道我可以使用像

这样的东西
body
{
    counter-reset:section;
}

a:before
{
    counter-increment:section;
    content:counter(section)". ";
}

获取

1. A
2. B
3. A
4. C

但有没有办法获得以下内容?

1. A
2. B
1. A
3. C

即。通过在文本前加上相同的数字来唯一标识页面上的所有链接。

注意:硬编码特定的URL不是一个选项,我可能会处理数百个链接,并且不会提前知道这些URL。

我意识到使用javascript会很容易/可能,我只对基于CSS的解决方案感兴趣或解释为什么CSS无法实现这一点。

5 个答案:

答案 0 :(得分:2)

我不认为你可以用纯CSS获得这种行为,而且你需要Javascript。并且总会有这样的情况:

http://google.com/
http://google.com
google.com
google.com/
www.google.com

你明白了。


在jQuery中这非常简单,所以我建议你使用它。

答案 1 :(得分:2)

好的,我对你的问题有所了解。只是使用简单的CSS,这是不可能的(至少不是跨平台的......)

如果你可以使用javascript,你有几种可能性。

我的偏好是使用数据属性来保存值,在本例中我选择了data-counter。如果你喜欢这样,那么CSS变得微不足道了:

<强> CSS

a:before
{
   content:attr(data-counter)". ";
}​

如果你有jQuery,那么Javascript会是这样的:

JS with jQuery

var linkcounter = {};
var counter = 0;
$("a").each(function() {
    if (!linkcounter.hasOwnProperty($(this).attr("href"))) {
        counter++;
        linkcounter[$(this).attr("href")] = counter;
    }
    $(this).attr("data-counter", linkcounter[$(this).attr("href")]);
});

或者像这样没有jQuery:

香草JS

var linkcounter = {};
var counter = 0;
var anchors = document.getElementsByTagName('a');
for(var i = 0; i < anchors.length; i++) {
    if (!linkcounter.hasOwnProperty(anchors[i].getAttribute("href"))) {
        counter++;
        linkcounter[anchors[i].getAttribute("href")] = counter;
    }
    anchors[i].setAttribute("data-counter", linkcounter[anchors[i].getAttribute("href")]);
}

您可以在此处查看没有jQUery的版本:http://jsfiddle.net/ramsesoriginal/CVW7Y/5

这里有jQuery的版本:http://jsfiddle.net/ramsesoriginal/CVW7Y/4

可悲的是,目前还没有CSS方法可以做到这一点。我希望这有帮助。

答案 2 :(得分:0)

你可以使用:contains但我不确定它是如何支持的,所以你可能会更好地使用JavaScript。

a:contains("A") {
    /* Styles here */
}

a:contains("B") {
    /* Styles here */
}

修改

显然:根本不支持包含。我会把它留在这里,所以没有其他人讨厌它。

你可以使用:在jQuery中包含并相应地添加一个类。

$('a:contains(A)').addClass('CLASS_NAME');

答案 3 :(得分:0)

如果使用jQuery没问题,可以通过操纵:before伪元素的内容来完成:

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

<强> JS

var labels = [
    "1",
    "2",
    "1",
    "3"
    // and so on...    
];

// OR maybe put in some algo for this sequence

$('a').each(function(i) {
    $(this).attr('data-label', labels[i] + '. ');
});

<强> CSS

a:before {
    content: attr(data-label);
    color: red;
    text-align: left;
    padding-right: 10px;
    font-size: 11px;
    display: inline;
}

答案 4 :(得分:-1)

试试这段代码:

var counter = 0, cache = {};
$('a').each(function (i, a) {
    a = $(a);
    var href = a.attr('href');
    var c = cache[href];
    if (!c) {
        counter++;
        c = counter;
        cache[href] = c;
    }
    a.text(c + '. ' + a.text());
});
​

我正在使用jQuery,这就是它的工作原理:http://jsfiddle.net/pDLbQ/