【问题标题】:Can I accomplish this with CSS?我可以用 CSS 完成这个吗?
【发布时间】:2012-07-26 01:28:27
【问题描述】:

如果我有这样的元素:

<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 不可能做到这一点。

【问题讨论】:

  • 它对我有用。你用什么浏览器试的? (你可以在这里看到我的例子:jsfiddle.net/ramsesoriginal/CVW7Y
  • @ramsesoriginal:这就是问题所说的,但这不是预期的结果。再次阅读问题。
  • 您如何识别这些链接?您是通过他们的文字还是他们的href 来识别他们?
  • 理想情况下是通过 URL,但无论哪种方式都无关紧要。

标签: css css-selectors


【解决方案1】:

好的,我明白你的问题的意思。仅使用纯 CSS 是不可能的(至少不是跨平台的..)

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

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

CSS

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

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

带有 jQ​​uery 的 JS

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 唯一的方法来做到这一点。我希望这有帮助。 ​

【讨论】:

  • 谢谢!顺便说一句,有没有办法使用 CSS 隐藏重复链接?如果我的结果是 1.A、2.B、3.C 那总比没有好(不能使用 JS。)
  • @Emory:除非链接都包含在同一个父级中并且您事先知道 URL,否则您将无法做到。
  • 好的,好吧,我想除了将其标记为已解决并继续前进之外别无他法。谢谢@BoltClock!
  • @BoltClock 做到了:如果它们在同一个父级中,并且您事先知道链接,则可以使用 :first-child 和类似的。你也可以使用HTML Components (msdn.microsoft.com/en-us/library/ms531018.aspx) 你在一个只有 Internet-Explorer 的环境中.. 但我强烈建议远离这些丑陋的解决方案。
【解决方案2】:

我认为纯 CSS 无法实现这种行为,并且需要 Javascript。而且总是有这样的情况:

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

你明白了。


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

【讨论】:

  • 底部 3 将被解释为相对链接,因为它们没有 http:// 前缀
  • 我目前不关心这些情况,不过谢谢!
  • @starbeamrainbowlabs:但这仍然是个问题,因为它们看起来像链接:)
  • 尝试设置 subreddit 的样式,因此 javascript 不是一个选项 - 大多数事情对 jQuery 来说都很简单...... XD
  • 对不起,什么是 subreddit?
【解决方案3】:

如果使用 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;
}

【讨论】:

  • @Eliran M. - 你为什么编辑这个答案?据我所知,您所做的只是删除所有代码行并将它们放回原处!
【解决方案4】:

您可以使用 :contains,但我不确定它的支持程度,因此使用 JavaScript 可能会更好。

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

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

编辑:

显然 :contains 根本不支持。不过我会把它留在这里,所以没有人会费心把它放在这里。

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

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

【讨论】:

  • :contains() 根本不受支持(除了一些我认为不再使用的 KHTML 版本)。
  • 感谢您的帮助,我知道 jQuery 是很好的技术,但我在这里询问 CSS =/
  • 没问题。我不确定这是否可能,所以如果需要,请提供替代方案。
  • 酷,我只是想让人们提出完全有效的基于 javascript 的解决方案,以了解为什么我还不接受答案! XD
  • @Eliran M.:是的,您仍然可以找到定义 here - 在同一节号 oddly enough
【解决方案5】:

试试这个代码:

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/

【讨论】:

  • 我很欣赏这个尝试,但那不是 CSS。我也喜欢 jQuery。
  • 我几乎可以肯定,仅仅使用 CSS 是不可能解决问题的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2012-02-17
  • 2011-09-13
相关资源
最近更新 更多