【问题标题】:A Multi-Level Up Css Selector一个多级向上 Css 选择器
【发布时间】:2018-05-16 00:28:18
【问题描述】:

我正在尝试找到一种方法来使用 css 选择器来格式化特定的父 div。比如下面的示例代码...

<div id="one">
   <div id="two"
      <div id="three">
         <a href="foo.html">something</a>

...等

我想格式化 div#one,但前提是 #one 内的链接是特定页面,例如“foo.html”。

我已经尝试了几件事,但这里是我尝试使用的一个示例......

a[href *="foo"] #one:parent {
    background-color: #FF0000;
}

有没有办法使用 css 选择器、js 或 jQuery 来做到这一点?我在下面包含了一个代码 sn-p 用于测试...

a[href *="foo"] #one:parent {
        background-color: #FF0000;
    }
    <div id="one">
       <div id="two"
          <div id="three">
             <a href="foo.html">something</a>
          </div>
       </div>
    </div>
    

我搜索答案的所有地方都只提供了如何使用父元素执行此操作的线索,这些父元素只是上面的一个父元素,而不是本示例中的多个 div。

【问题讨论】:

  • 看看jQuery的.parents()方法:api.jquery.com/parents
  • CSS 没有办法倒退,也没有 jQuery 那样的 contains()。

标签: javascript jquery html css css-selectors


【解决方案1】:

使用 CSS 你不能,但使用 JS 你可以简单地考虑parentNode

document.querySelector('a[href *="foo"]').parentNode.parentNode.parentNode.style.backgroundColor = "red";
#one {
 padding:50px;
}
<div id="one">
  <div id="two">
    <div id="three">
      <a href="foo.html">something</a>
    </div>
  </div>
</div>

如果你有 n 个父级并且你不知道数字,你可以创建一个循环来查找你的元素:

var a = document.querySelector('a[href *="foo"]');
while (a.parentNode.getAttribute('id') != "one") {
  a = a.parentNode;
}
a.parentNode.style.background = "red";
#one {
  padding: 50px;
}
<div id="one">
  <div id="two">
    <div id="three">
      <div>
        <a href="foo.html">something</a>
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 第一个选项很有效。第二个好像不行。第一个选项会找到“foo”,但它不仅会更改该父节点,还会更改所有具有相同 ID“one”的节点。
  • @user2284703 两个选项都是 idea 而不是通用代码 :) 您需要根据实际情况调整它们。诀窍是,使用 JS,你有 parentNode 允许你获取元素的父级;)
  • 不用担心。它有效......我只是有一个我一直忽略的错字(第二行是“s.parentNode”而不是“a.parentNode”)。谢谢。
猜你喜欢
  • 2018-10-01
  • 2017-07-31
  • 2020-10-09
  • 2020-05-16
  • 2015-03-07
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多