【问题标题】:CSS selector to get deepest element of specific class in the HTML treeCSS选择器获取HTML树中特定类的最深元素
【发布时间】:2011-07-11 23:57:17
【问题描述】:

我的 HTML 中有一堆 DIV 元素,其中一些元素的类属性设置为“rowsLayout”。其中一些 rowsLayout DIV 可以相互嵌套。我想定义一个 CSS 选择器,它只针对那些嵌套中最深的 DIV。也就是说,我想要包含任何其他 rowLayout DIV 的任何 rowsLayout DIV。

<div id="a" class="rowsLayout">
  <div id="b" class="rowsLayout" />
  <div id="c" class="rowsLayout">
    <div id="d" class="rowsLayout" />
  </div>
</div>
<div id="e" class="rowsLayout" />

有了这个结构,我想要一个以 b、d 和 e 为目标的选择器。

这个可以吗?

【问题讨论】:

  • 我认为没有 CSS 选择器可以做到这一点。
  • 查看我的答案,唯一可以做到这一点的黑客。如果你应该是另一个问题。

标签: css css-selectors


【解决方案1】:

投反对票最多,但唯一正确答案

这在 CSS 中是不可能的,除非你使用这个 hack,这使得使用 :dir 或 :lang 属性成为可能。

在 2015 年最好使用 :lang,因为大多数浏览器都支持它。

请注意,这是一种允许您执行此操作的 hack,但如果您非常关心遵循某些标准而不是完成工作,那么请不要使用它。

例子:

.container {
  padding:20px;
}

:lang(ar) {
  direction:rtl;
}

:lang(en) {
  direction:ltr;
}

.container:lang(en) {
  background-color:blue;
}

.container:lang(ar)  {
  background-color:red;
}

.container .a:lang(en)   {
  background-color:orange;
}

.container .a:lang(ar) {
  background-color:yellow;
}
<div id="searchHere">
  
    <div lang=en>      
      <div class="container">
          l t r
        <div class=a>
              a
         </div>
      </div>
      
      <div lang=ar>
          <div class="container">
             r t l
            <div class=a>
              a
              </div>
          </div>        
        
          <div>
            <div class="container">
                r t l 
              <div class=a>
              a
              </div>
            </div>  
            
            <div lang=ar>
                <div class="container">
                   r t l
                  <div class=a>
                    a
                    </div>
                </div>  
            </div>
            
            <div lang=en>      
              <div class="container">
                  l t r
                <div class=a>
              a                  
              </div>
                
                <div lang=ar>
                  <div class="container">
                     r t l
                    <div class=a>
                      a                      
                      <div lang=en>      
                        <div class="container">
                          l t r
                          <div class=a>
                            a                  
                          </div>
                          <div>
                            <div>
                            
                              <div lang=en>      
                                <div class="container">
                                  l t r
                                  <div class=a>
                                    a                  
                                  </div>
                                </div>                      
                              </div>
                              
                              <div lang=ar>      
                                <div class="container">
                                  r t l
                                  <div class=a>
                                    a                  
                                  </div>
                                </div>                      
                              </div>
                              
                            </div>
                            
                          </div>
                        </div>                      
                      </div>
                  </div> 
                </div>
              </div>            
            </div>
            
          </div>
        
      </div>
      
    </div>
  
</div>

虽然示例 ltrrtl 演示这一点,但 :lang 在理论上可以 表现得像最深的匹配,例如使用 :lang(my-special-selector) 虽然这 可能不是 lang 属性应该如何使用。

【讨论】:

  • 这不能回答 OP 的问题。它只引入了一个不相关的概念(语言)
  • 这是回答问题的唯一答案。却是票数最多的人。
  • 你可以把它放在你最喜欢的小提琴中,你可以看到结果。如何仅从 css 中声明一条规则以应用于最深定义的 html。
  • 这个答案没有回答发布的问题。 lang-attribute 只是对象内容的语言声明。你可以使用 CSS-selector :lang() 来选择它;是的。但这与选择 dom 的叶节点无关。
  • 我还声明:请注意,这是一个允许您这样做的 hack,但如果您更关心遵循某些标准而不是完成工作,那么请不要使用它。
【解决方案2】:

看看这个:

div#b:first-of-type {
style here
}

【讨论】:

    【解决方案3】:

    按 ID 选择它们

    #b, #d, #e {
     /* styles here */
    }
    

    顺便说一句,所有重复类名的任何原因?您可以将整个内容包装在#layout 的 div 中,然后执行...

    #layout div {
     /* styles */
    }
    

    而不是将该类名添加到任何 div 中。

    【讨论】:

      【解决方案4】:

      为什么不使用 :empty?

      JQuery Empty

      编辑:它也可以用作 CSS 选择器:

      :empty { background-color: black; }
      

      更多编辑:

      :last-of-type 几乎可以工作,但由于某种原因它得到了“a”。看我的小提琴。

      http://jsfiddle.net/DUdVR/3/

      【讨论】:

      • 请注意,这仅适用于 CSS 3。此外,它不适用于具有子元素但没有所需类的子元素的元素。
      • 是的,但对于提供的内容,它会起作用。如果 OP 希望我们提供完美的回应,他应该提供一个完整的例子:)
      • 也就是说,支持 css 3 的浏览器。(这不会影响它在 jquery 中的工作)。
      • 人们需要将 IE 留在它所属的垃圾箱并转移到 Chrome(或 Firefox、Safari 或 Opera)的另一个原因
      【解决方案5】:

      您可以使用 jQuery 选择器.rowsLayout:not(:has(.rowsLayout))

      但是,出于性能原因,this is not possible in CSS

      您的选择器取决于您定位的元素的子元素(或缺少子元素)。
      CSS 的设计使得元素的选择器总是可以在元素的子元素存在之前被解析;这允许在加载文档时应用 CSS。

      【讨论】:

      • 这不是使用 css。这是使用 jQuery。只是要清楚。问题是关于使用 CSS 的,除了使用我的菜鸟使用 :lang 属性的 hack 删除我唯一的正确答案之外,这是不可能的。
      • 可以用 vanilla JS 和 querySelector 做到这一点吗?
      【解决方案6】:

      根据您拥有的 div 数量,您可以执行以下操作:

      div#b.rowsLayout,div#d.rowsLayout,div#e.rowsLayout {}
      

      也许有更好的方法来解决您的问题,您想对所有这些 div 应用什么?

      【讨论】:

        【解决方案7】:

        没有。

        您的选择是:按 id 选择它们;为这些叶子添加第二个类,并按该类选择;使用基于 javascript 的解决方案来设置适当的样式(可能使用第二类)。

        【讨论】:

          【解决方案8】:

          您能否考虑为父项添加一个额外的类,例如“父项”?它会更容易,并且是“标准”

          【讨论】:

          • P.S.我建议过,但我真的不知道你是如何构建你的 div 的,它是动态的吗?
          猜你喜欢
          • 2011-01-10
          • 2020-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-16
          • 2017-05-21
          • 1970-01-01
          相关资源
          最近更新 更多