【问题标题】:css: How to skip hidden child in nth-child(odd) and nth-child(even) [duplicate]css:如何在nth-child(奇数)和nth-child(偶数)中跳过隐藏的孩子[重复]
【发布时间】:2016-03-29 17:29:00
【问题描述】:

我尝试在使用 nth-child(odd) 和 nth-child(even) 时跳过隐藏的子项,但它不会跳过那些隐藏的记录。

我有以下 HTML 和 CSS 代码。

<style>
  ul {
    list-style-type: none;
  }
  li {
    height: 2em;
    border: 1px solid black;
  }
  /* li:not(.hidden):nth-child(odd) { */
  li:nth-child(odd) {
    background: khaki;
  }
  li:nth-child(even) {
    background: indianred;
  }
  .hidden {
    display: none;
  }
</style>


<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li class="hidden">4</li>
  <li class="hidden">5</li>
  <li class="hidden">6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
</ul>

我想在浏览器上显示的列表应该有替代颜色,而不管隐藏子项的数量。

【问题讨论】:

  • 你会接受 javascript 解决方案吗?
  • 不,我不想使用 java 脚本,我知道 js 中的解决方案,但我只能使用 js,我必须使用 css。
  • 这在 CSS 中是不可能的,你可能需要修改你的 HTML 或者去 jquery 解决方案
  • 你能插入额外的 LI 虚拟元素吗?
  • @Musarrat Hussain 由于这个问题已经结束,我还有另外两个选择要提出,你最好再问一次,避免提及“nth-child”:说你只是想给偶数行/奇数行有不同的颜色,而其中一些是不可见的。

标签: html css


【解决方案1】:

如果您可以更改文档的结构,那么您可以为隐藏项设置不同的标签,以便您可以利用 :nth-of-type 伪类:

CSS:

  div.list p {
    height: 2em;
    border: 1px solid black;
    margin: 0;
  }
  div.list p:nth-of-type(odd) {
    background: khaki;
  }
  div.list p:nth-of-type(even) {
    background: indianred;
  }
  .hidden {
    display: none;
  }

HTML:

<div class="list">
  <p>1</p>
  <p>2</p>
  <p>3</p>
  <span class="hidden">4</span>
  <span class="hidden">5</span>
  <span class="hidden">6</span>
  <p>7</p>
  <p>8</p>
  <p>9</p>
  <p>10</p>
  <p>11</p>
</div>

【讨论】:

  • 如果我们改变了你所做的元素的类型然后它的工作,但我不能改变元素的类型。由于基于某些事件隐藏类可能会改变,那么我也必须改变元素的类型。
【解决方案2】:

作为this answer explains,目前无法仅使用 CSS 来做到这一点。您可以通过更改隐藏li 元素的代码来解决此问题,以便它在隐藏项之后插入另一个隐藏的虚拟元素以使事物均匀并使其看起来正确,然后在您取消隐藏时删除该虚拟项它。

var hide = function (el) {
    el.classList.add('hidden');
    el.insertAdjacentHTML('afterend', '<li class="hidden dummy"></li>');
  },
  show = function (el) {
    if (el.classList.contains('hidden')) {
      el.classList.remove('hidden');
      el.parentNode.removeChild(el.nextElementSibling);
    }
  };

Working fiddle here

【讨论】:

    【解决方案3】:

    您需要从 DOM 中移除隐藏的元素,而不仅仅是隐藏它们。

    【讨论】:

    • 由于所有孩子都是动态创建的,并且会在不同的事件中切换到隐藏/显示,所以我无法在每个事件中删除和添加所有这些孩子。
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2011-07-08
    • 2017-11-05
    • 2017-11-28
    • 2018-07-30
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多