【问题标题】::nth-child(2) doesn't work. :nth-child(1) and :nth-child(3) do:nth-child(2) 不起作用。 :nth-child(1) 和 :nth-child(3) 做
【发布时间】:2019-01-16 07:14:39
【问题描述】:

:nth-child(2) 似乎选择了子 1 内部的东西。

孩子 1 和孩子 3 正常工作。

它似乎不涉及标签的类型,就像几个类似但不同的问题一样。我没有看到问题。

https://jsfiddle.net/rhedin/em56jk9v/

var one = document.querySelector('div.rules :nth-child(1)');
var two = document.querySelector('div.rules :nth-child(2)');
var three = document.querySelector('div.rules :nth-child(3)');
one.classList.add('arule');
two.classList.add('brule');
three.classList.add('crule');
.arule {
  background-color: yellow;
}

.brule {
  background-color: red;
}

.crule {
  background-color: blue;
}
<div class="rules">
  <div>
    <label for="rule1">Rule1</label>
    <input id="rule1">
  </div>
  <div>
    <label for="rule2">Rule2</label>
    <input id="rule2">
  </div>
  <div>
    <label for="rule3">Rule3</label>
    <input id="rule3">
  </div>
</div>

【问题讨论】:

  • 请不要编辑您的问题以包含您的答案或根据您获得的答案您如何理解这一点。如果您没有得到所有内容(使用 cmets),请要求澄清,或者如果您想提供您的答案版本,请回答您自己的问题

标签: javascript css css-selectors


【解决方案1】:

这里是对出错原因的解释。这是您的选择器的结果。其播放方式的奇怪之处在于您的 html 结构和使用 querySelector。

div.rules :nth-child()

这将首先针对&lt;div class="rules"&gt; 元素。然后,由于两个选择器之间有 空间,它将查找该div 内的第n 个子元素的<strong>all</strong> 元素。之后,使用querySelector 将选择匹配集的第一个元素。

这就是你最终得到第一个&lt;div&gt;:nth-child(1) 的原因,因为它实际上匹配了每一个nth-child(1),但巧合的是,得到第一个结果是你所期望的元素。

但是,:nth-child(2) 匹配每个第二个子元素的网络太宽了,最终在第一个 div 中获得了第二个子元素,因为这是第一个结果,所以红色背景出现在了那里。

:nth-child(3) 的最终好奇心似乎实际上击中了正确的元素,只是因为在所有 html 中只有三分之一的子元素,这是您所期望的,尽管出于假设以外的原因进行了解释.

【讨论】:

    【解决方案2】:

    试试这样:

    var one   = document.querySelector('div.rules div:nth-child(1)');
    var two   = document.querySelector('div.rules div:nth-child(2)');
    var three = document.querySelector('div.rules div:nth-child(3)');
    one.classList.add('arule');
    two.classList.add('brule');
    three.classList.add('crule');
    .arule {
      background-color: yellow;
    }
    .brule {
      background-color: red;
    }
    .crule {
      background-color: blue;
    }
      <div class="rules">
        <div>
          <label for="rule1">Rule1</label>
          <input id="rule1">
        </div>
        <div>
          <label for="rule2">Rule2</label>
          <input id="rule2">
        </div>
        <div>
          <label for="rule3">Rule3</label>
          <input id="rule3">
        </div>
      </div>

    我发了div.rules div:nth-child(2)

    【讨论】:

      【解决方案3】:

      document.querySelector 将返回 one 元素,您可以看到您的输入是红色的,因为规则 div.rules :nth-child(2) 适用于它,因为它是其父元素中的第二个子元素,因此您将选择它(因为它首先出现在 DOM 树中)而不是 div。

      如果您只想定位 div,则应使用 &gt; 选择器,或者使用 div:nth-child() 或考虑使用 document.querySelectorAll 获取与选择器匹配的所有元素:

      var one = document.querySelector('div.rules > :nth-child(1)');
      var two = document.querySelector('div.rules > :nth-child(2)');
      var three = document.querySelector('div.rules > :nth-child(3)');
      one.classList.add('arule');
      two.classList.add('brule');
      three.classList.add('crule');
      
      /*this will add border to all inputs and second div*/
      var all = document.querySelectorAll('div.rules  :nth-child(2)');
      for(var i=0;i<all.length;i++) {
        all[i].style.border="3px solid green";
      }
      .arule {
        background-color: yellow;
      }
      
      .brule {
        background-color: red;
      }
      
      .crule {
        background-color: blue;
      }
      <div class="rules">
        <div>
          <label for="rule1">Rule1</label>
          <input id="rule1">
        </div>
        <div>
          <label for="rule2">Rule2</label>
          <input id="rule2">
        </div>
        <div>
          <label for="rule3">Rule3</label>
          <input id="rule3">
        </div>
      </div>

      【讨论】:

        【解决方案4】:

        您只想定位div.rules 的直接子代。由于您使用的是querySelector,它只返回第一个结果,对于:nth-child(2),这是第一个 div 中的输入(您会注意到它在您的示例中具有红色背景)

        var one = document.querySelector('div.rules > :nth-child(1)');
        var two = document.querySelector('div.rules > :nth-child(2)');
        var three = document.querySelector('div.rules > :nth-child(3)');
        one.classList.add('arule');
        two.classList.add('brule');
        three.classList.add('crule');
        .arule {
          background-color: yellow;
        }
        
        .brule {
          background-color: red;
        }
        
        .crule {
          background-color: blue;
        }
        <div class="rules">
          <div>
            <label for="rule1">Rule1</label>
            <input id="rule1">
          </div>
          <div>
            <label for="rule2">Rule2</label>
            <input id="rule2">
          </div>
          <div>
            <label for="rule3">Rule3</label>
            <input id="rule3">
          </div>
        </div>

        【讨论】:

          【解决方案5】:

          一个简单的解决方案是在选择器中添加一个普通的 div (jsfiddle)

          var one   = document.querySelector('div.rules div:nth-child(1)');
          var two   = document.querySelector('div.rules div:nth-child(2)');
          var three = document.querySelector('div.rules div:nth-child(3)');
          one.classList.add('arule');
          two.classList.add('brule');
          three.classList.add('crule');
          

          有一个关于这种选择器的很棒的网站。你一定要试一试:CSS Diner.

          【讨论】:

            【解决方案6】:

            至少指定你的意思是直接的孩子,因为可能有多个嵌套的,程序无法找出你的意思:

            var one   = document.querySelector('div.rules > :nth-child(1)');
            var two   = document.querySelector('div.rules > :nth-child(2)');
            var three = document.querySelector('div.rules > :nth-child(3)');
            one.classList.add('arule');
            two.classList.add('brule');
            three.classList.add('crule');
            

            【讨论】:

            • 嗯。它开始渗透。我仍在凝视,并试图理解。
            猜你喜欢
            • 2021-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            • 2017-01-22
            • 2018-07-30
            • 2012-03-07
            • 1970-01-01
            相关资源
            最近更新 更多