【问题标题】:How to select the first element on a page using a particular class when each subsequent element using the same class is also a first child?当使用同一类的每个后续元素也是第一个子元素时,如何使用特定类选择页面上的第一个元素?
【发布时间】:2019-07-17 02:41:39
【问题描述】:

我正在制作斐波那契螺旋线。代码如下。我需要创建螺旋的第二层(螺旋由一系列嵌套的 div 组成)并使用 for 循环创建多个层。 我需要使用 .item-one 类更改文件中第一个 div 元素的高度,而不是使用 .item-one 类的后续 div。

我如何只选择第一个,记住将有另外 4 个 div 元素与类 .item-one 也是他们父母的第一个孩子,只使用 CSS 和 vanilla JS? (我只需要更改第一个的高度,并且需要将所有其余的 .item-one div 设置为不同的高度。)

我试过 :first-child 和 :first-of-type 但所有 .item-one 元素都是它们各自父母的第一个孩子,所以 :first-child 和 :first-of-type 都选择所有.item-one 元素,而不仅仅是页面上的第一个元素。 这个帖子select first element of the same class 很接近,除了解决方案选择所有第一个子元素,而我只想选择该类文件中的第一个 div。

代码:

HTML

<div class="item-one">
  <div class="item-two">
    <div class="item-three">
      <div class="item-four"></div>
    </div>
  </div>
</div>

JS

window.addEventListener('load', function() {

  var $items = document.getElementsByTagName("div");
  var $item = $items[0];
  var $cloned_item = $item.cloneNode(true);
  var $final_item = $items[$items.length - 1];

  for (var i = 1; i <= 5; i++) {
    $final_item.appendChild($cloned_item);
    $final_item = $items[$items.length - 1];
    $cloned_item = $item.cloneNode(true);
  }

});

最终结果看起来像这样。

<div class="item-one">
  <div class="item-two">
    <div class="item-three">
      <div class="item-four">
        <div class="item-one">
          <div class="item-two">
            <div class="item-three">
              <div class="item-four">
                <div class="item-one">
                  <div class="item-two">
                    <div class="item-three">
                      <div class="item-four">...and so on...</div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

【问题讨论】:

  • 您需要在 CSS 规则中使用第一个 &lt;div class="item-one"&gt; 的父级,否则您将无法在没有脚本的情况下解决该问题
  • 我会为每个 div 添加一个额外的类,它会告诉您它是哪个组的成员——它为您的代码添加了一个缺少的逻辑。 &lt;div class="item-one one"&gt; &lt;div class="item-two one"&gt; &lt;div class="item-three one"&gt; &lt;div class="item-four one"&gt; &lt;div class="item-one two"&gt; &lt;div class="item-two two"&gt; &lt;div class="item-three two"&gt; &lt;div class="item-four two"&gt; &lt;div class="item-one three"&gt; &lt;div class="item-two three"&gt;...and so on...&lt;/div&gt;
  • @LGSon 谢谢!我试图用 :first-child 等将它过度复杂化。

标签: javascript html css css-selectors


【解决方案1】:

您必须使用父元素才能挑选出第一个子元素。我在这种情况下使用了 body,但如果你有不同的父级,那么你会使用它。

body > .item-one {
  border: 1px solid red;
}
<div class="item-one">
  <div class="item-two">
    <div class="item-three">
      <div class="item-four">
        <div class="item-one">
          <div class="item-two">
            <div class="item-three">
              <div class="item-four">
                <div class="item-one">
                  <div class="item-two">
                    <div class="item-three">
                      <div class="item-four">...and so on...</div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

或者更好的办法是给那个外部 div 另一个类,如果可以的话就使用它。

【讨论】:

    【解决方案2】:

    这就是你要找的吗?

    div {border: 1px solid blue;}
    .item-one {border: 1px solid yellow;}
    body > .item-one {border: 2px solid red;}
    <div class="item-one">
      <div class="item-two">
        <div class="item-three">
          <div class="item-four">
            <div class="item-one">
              <div class="item-two">
                <div class="item-three">
                  <div class="item-four">
                    <div class="item-one">
                      <div class="item-two">
                        <div class="item-three">
                          <div class="item-four">...and so on...</div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

    @LGSon 睁开眼睛后编辑。

    【讨论】:

    • 你需要阅读first-of-type,因为它适用于兄弟姐妹,而不是后代
    • 所以这是否有效取决于我的 FF 和其他所有浏览器的行为不同?我现在一定会读的。
    • 嗯,根据 mdn: 注意:按照最初的定义,被选元素必须有父元素。从选择器级别 4 开始,不再需要这样做。 developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type
    • 我从来没有说过它需要父母,我说first-of-type 目标是兄弟姐妹,并且在 OP 的情况下,每个级别只有一个元素,有一个孩子,而不是兄弟姐妹。
    • 在您的示例中,first-of-type 毫无意义,因为它们在每个级别上只有一个元素,并且可能会误导用户认为它是必需的......但它仍然有效。
    【解决方案3】:

    您可以使用 > 选择器将样式应用于具有 .item-one 类的父级的直接第一个子级。如果您没有所有这些元素的父级,那么应该使用主体。

    body>.item-one {
        /* Styling here */
        padding: 5px;
        margin: 5px;
        border: 5px black solid;
    }
    

    【讨论】:

    • @LGSon。您需要阅读first-of-type,因为也可以定位嵌套元素。请注意,当没有编写简单选择器时,将隐含通用选择器 (*)。 developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type。顺便说一句:这确实有效。在发布之前我自己尝试过。
    • 我没说不行,我说first-of-type目标是兄弟姐妹,不是后代。
    • 嵌套元素也可以定位
    • 在您的示例中,first-of-type 毫无意义,并且会误导用户认为它是必要的,因此我投反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2023-03-07
    相关资源
    最近更新 更多