【问题标题】:CSS selector when :target empty:target 为空时的 CSS 选择器
【发布时间】:2011-10-15 13:49:52
【问题描述】:

当 :target 等于元素的 id(简单)或 :target 为空(不可能?)时,我需要一个 css3 选择器来定位元素。很难解释,我举个简单的例子。

div {
  background: blue;
}
div:target, div:no-target {
  background: red;
}

当然,:no-target 伪类不存在 ;)。不使用 Javascript 有没有办法解决这个问题?提前致谢!

【问题讨论】:

    标签: css css-selectors


    【解决方案1】:

    叹息。我觉得我正在复活一个死去的话题,但它需要一个真正的答案。

    仅使用 CSS 就可以做到这一点,只需使用 :last-childgeneral sibling combinator,形式为 :target ~ :last-child

    .pages > .page:target ~ .page:last-child,
    .pages > .page {
        display: none;
    }
    
    /* :last-child works, but .page:last-child will not */
    .pages > :last-child,
    .pages > .page:target {
        display: block;
    }
    

    这些规则适用于以下步骤:

    1. 隐藏所有页面
    2. 同时显示目标页面和最后一页
    3. 如果某个页面被定位,则隐藏最后一页 (.page:target ~ .page:last-child)

    (live example)

    编辑:显然这与an older, previously mentioned, related post 中接受的答案非常相似。

    【讨论】:

    • 花了一段时间才意识到您的回答中发生了什么,但现在我明白了,这似乎是一个非常优雅的解决方案
    • 说单独使用 CSS 是可能的,这是一种误导。特别是,当您要显示的“默认”元素 不是 其父元素的最后一个子元素时,这将是平淡无奇的。那么你会如何建议单独使用 CSS 来解决这个问题呢?
    • @BoltClock - 好吧,只有 CSS 和 HTML。我认为关键是它不需要 JavaScript,这很好。
    • @BoltClock :has() 是可能的,但我所知道的浏览器没有实现这一点。 caniuse.com/#feat=css-has 看起来像:.pages > .page { display: none; } .pages:not(:has(.page:target)) > .page.default, .pages .page:target { display: block; }
    • @rummik:没有浏览器在 CSS 中实现 :has() 的原因是因为 :has() 已被规范排除在 CSS 之外。 :has() 不在 CSS 中的原因是没有人愿意尝试在 CSS 中实现它。如果它实现了,你可能仍然需要 JavaScript——但至少那时它会涉及更少的样板 JS。人们可以希望...
    【解决方案2】:

    default-target-with-css 有一个很好的答案

    它围绕this trick 展开,这似乎在 iOS 中存在问题。它已在 Safari 中修复,所以可能会在 iOS 5 中?

    【讨论】:

      【解决方案3】:

      我能想到的只是你有一些 javascript 来检查哈希是否为空。如果是这样,它会在 body 标记中添加一个名为“noHash”的类。然后,您可以使用在您的 CSS 规则中可用的 noHash 类这一事实。

      if (window.location.hash.length <= 1) {
           document.body.className += " noHash";
      }
      

      那么,你的 CSS 可能是这样的:

      div {
        background: blue;
      }
      div:target, body.noHash div {
        background: red;
      }
      

      如果在任何情况下用户可能会在事后添加哈希值,那么您可能必须注意这一点,以确保正确删除 noHash 类。

      注意:您不必将类名添加到 body 标记中。您可以将它添加到任何包含您希望影响的所有对象的父对象。

      【讨论】:

      • 是的,你不能单独使用 CSS。
      • 我正在寻找没有 javascript 的解决方案
      • @Rick de Vos - 那么祝你好运。根据我对规范 (w3.org/TR/css3-selectors/#target-pseudo) 的阅读,您的问题是,当 URL 中没有散列时,所有元素都不会匹配您不想要的目标。我不认为 CSS3 能满足你的要求。只有当 URL 中存在与该元素不匹配的哈希时,似乎没有任何方法可以匹配该类。当 URL 中没有散列时,您尝试的任何 CSS 都将匹配。
      【解决方案4】:

      为什么不使用div:not(:target)div:target:empty

      【讨论】:

      • :empty 实际上与主题无关。另外,我尝试了:not(:target),但没有成功
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2019-07-19
      • 2020-02-16
      • 2016-12-29
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多