【问题标题】:Select elements by attribute in CSS在 CSS 中按属性选择元素
【发布时间】:2021-08-30 17:30:50
【问题描述】:

是否可以通过 HTML5 数据属性在 CSS 中选择元素(例如,data-role)?

【问题讨论】:

    标签: css html css-selectors custom-data-attribute


    【解决方案1】:

    如果你的意思是使用attribute selector,当然,为什么不呢:

    [data-role="page"] {
        /* Styles */
    }
    

    有多种属性选择器可用于我链接到的文档中的各种场景。请注意,尽管自定义数据属性是“新的 HTML5 功能”,

    • 浏览器通常在支持非标准属性时没有任何问题,因此您应该能够使用属性选择器过滤它们;和

    • 您也不必担心 CSS 验证,因为 CSS 不关心非命名空间属性名称,只要它们不破坏选择器语法即可。

    【讨论】:

    • 是否兼容所有导航器?
    • @Christophe Debove:IE7+ 和其他一切。
    • 如果设置了数据属性,或者通过 JS 更改,CSS 似乎不会检测到这一点。
    • 经过进一步调查,$("#element").data("field","value"); 不会更改数据属性值,它只会修改 jQuery 缓存的 DOM 版本。为了改变实际的 DOM 属性,需要使用$("#element").attr("data-field","value");。使我的原始评论无效。
    • 是的,看起来改变数据集也能正常工作@Matthew - jsfiddle.net/BoltClock/k378xgj3 谢谢你的jQuery。
    【解决方案2】:

    在现代浏览器中,也可以选择属性而不考虑其内容

    与:

    [data-my-attribute] {
       /* Styles */
    }
    
    [anything] {
       /* Styles */
    }
    

    例如:http://codepen.io/jasonm23/pen/fADnu

    适用于很大比例的浏览器。

    注意,这也可以在 JQuery 选择器中使用,或者使用 document.querySelector

    【讨论】:

    • 哇,我从来没有见过它可以这样使用! +1! FWIW,既然 br​​owsershots 已经过期,我相信它可以在 IE7+ 中运行,所以它的支持几乎无处不在。有趣的是,甚至 Chris Coyier 都没有提到它here
    • 感谢@CamiloMartin 我已删除 browsershots 链接以避免混淆/烦恼。
    • 添加了一个链接到 Chris Coyier 的线程 css-tricks.com/attribute-selectors/#comment-965838 @CamiloMartin
    • 无论如何,这种语法都不是新的——更多的人对 IE6 不支持它感到惊讶,而不是 IE7+ 支持它。您几乎可以假设所有CSS2.1 selectors 在 IE8 和更高版本中都受支持 - IE7 做得最多,尽管有一些模糊的错误。所有现代浏览器都支持level 3 selectors 有一段时间了,而 Chrome 是个有问题的浏览器。
    • 虽然我们讨论的是属性选择器,但有趣的是,在第 3 级中引入的子字符串属性选择器(^=*=$=)也是IE7 和 IE8 都支持。也许它们是在标准化之前在 IE 中引入的。
    【解决方案3】:

    值得注意的 CSS3 子字符串属性选择器

    [attribute^=value] { /* starts with selector */
    /* Styles */
    }
    
    [attribute$=value] { /* ends with selector */
    /* Styles */
    }
    
    [attribute*=value] { /* contains selector */
    /* Styles */
    }
    

    【讨论】:

      【解决方案4】:

      您可以组合多个选择器,这很酷,因为您可以根据它们的值选择每个属性和属性,例如 href 基于它们的值仅使用 CSS..

      属性选择器允许您使用 idclass 属性来玩一些额外的东西

      Attribute Selectors

      上有一篇精彩的文章

      Fiddle

      a[href="http://aamirshahzad.net"][title="Aamir"] {
        color: green;
        text-decoration: none;
      }
      
      a[id*="google"] {
        color: red;
      }
      
      a[class*="stack"] {
        color: yellow;
      }
      <a href="http://aamirshahzad.net" title="Aamir">Aamir</a>
      <br>
      <a href="http://google.com" id="google-link" title="Google">Google</a>
      <br>
      <a href="http://stackoverflow.com" class="stack-link" title="stack">stack</a>

      浏览器支持:
      IE6+、Chrome、Firefox 和 Safari

      您可以查看详情here

      【讨论】:

      • 不可能以某种“或”逻辑将多个组合在一起(如果您希望应用相同的规则)?我唯一能开始工作的想法是 a[id="google"], a[id="bing"], a[id="baidu"],... { color: pink; 'a' 很好,花花公子,但如果元素很长,它就很'罗嗦'。我想要 [id="google"|"bing"|"baidu"] 或类似的东西。
      【解决方案5】:
          [data-value] {
        /* Attribute exists */
      }
      
      [data-value="foo"] {
        /* Attribute has this exact value */
      }
      
      [data-value*="foo"] {
        /* Attribute value contains this value somewhere in it */
      }
      
      [data-value~="foo"] {
        /* Attribute has this value in a space-separated list somewhere */
      }
      
      [data-value^="foo"] {
        /* Attribute value starts with this */
      }
      
      [data-value|="foo"] {
        /* Attribute value starts with this in a dash-separated list */
      }
      
      [data-value$="foo"] {
        /* Attribute value ends with this */
      }
      

      【讨论】:

        【解决方案6】:

        可能通过 HTML5 数据属性选择 CSS 中的元素吗?只需尝试一下即可轻松回答,答案当然是。但这总是将我们引向下一个问题,“是否应该通过 HTML5 数据属性选择 CSS 中的元素?”对此意见不一。

        在“不”阵营中是(或至少曾经,早在 2014 年)CSS 传奇人物 Harry Roberts。在Naming UI components in OOCSS的文章中,他写道:

        重要的是要注意,尽管我们可以通过其数据来设置 HTML 样式-* 属性,我们可能不应该。 data-* 属性用于 在标记中保存数据,不是用于选择。这来自the HTML Living Standard(强调我的):

        "自定义数据属性旨在存储自定义数据私有 页面或应用程序,没有更合适的 属性或元素。”

        W3C 规范在这一点上含糊不清,令人沮丧,但仅基于它做了没有说什么,我认为 Harry 的结论是完全合理的。 p>

        从那时起,plentyofarticles 建议使用自定义数据属性作为样式挂钩非常合适,包括 MDN 的指南 Using data attributes。甚至还有一种名为 CUBE CSS 的 CSS 方法,它采用数据属性挂钩作为向组件“exceptions”(在BEM 中称​​为修饰符)添加样式的首选方式。

        谢天谢地,WHATWG HTML Living Standard 此后又添加了一些词甚至一些示例(强调我的):

        Custom data attributes 用于存储自定义数据、状态、 注释,以及类似的,专用于页面或应用程序,用于 没有更合适的属性或元素。

        在此示例中,自定义数据属性用于存储结果 PaymentRequest 的功能检测,可以在 CSS 中使用 以不同的方式设置结帐页面的样式

        作者应仔细设计此类扩展,以便当 属性被忽略并且任何关联的 CSS 被丢弃,页面是 仍然可以使用。


        TL;DR:是的,可以在 CSS 选择器中使用 data-* 属性,只要页面在没有它们的情况下仍然可用。

        【讨论】:

        • 否决这个答案的人(在我写下它的几个小时内)没有解释原因,所以我只能猜测他们认为它离题了。在编写代码时,我们是否可以做某事以及我们是否应该应该这些问题是密不可分的。任何努力编写好的代码(即,不仅可以完成工作,而且遵守最佳实践的代码)的开发人员都会提出这个问题,所以我们分享了答案来填补这个空白。
        • 我还没有以一种或另一种方式投票,但我冒昧地猜测,投反对票的人这样做是因为这个答案花了一个句子重复问题的答案,然后是其余的时间花在回答一个完全不同的问题上。我不相信它甚至是“新信息”,因为它是一个“应该完成”的功能这一事实所固有的。如果不应该,它可能不会成为规范中的功能。
        • 谢谢@TylerH。当您说“它可能不会成为规范中的功能”时,如果不应该这样做,那实际上就是我的意思。 Web 浏览器在设计上是非常宽容的——如果他们每次遇到一些无效的 HTML 时都吐出一个错误,那么 Web 就不会是一个有趣的地方。因此,作为开发人员,“我们可以”和“我们应该”的问题并没有相互分离。我们可以通过测试来回答前者,但我们可以通过参考规范来回答两者。这就是之前所有答案所缺少的,也是我提供我的答案的原因。
        • 看,我本可以提出一个全新的问题,“应该我们在 CSS 中通过 HTML5 数据属性选择元素吗?”,但肯定有人会将其标记为这个的副本,所以你知道……有时很难赢。 ?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多