【问题标题】:Override Only Some Items via list-style通过列表样式仅覆盖某些项目
【发布时间】:2017-01-18 17:37:55
【问题描述】:

我试图覆盖 HTML 中有序和无序列表的分层排列中的项目符号,嵌套任意深度,但仅限于某些项目。这个问题的嵌套部分很重要,因为浏览器会根据列表的深度为列表分配不同的项目符号,因此对未选中/未选中/等的项目使用静态覆盖不是一种选择。

我已将a JSFiddle outlining this issue 放在一起,代码如下,以防 JSFiddle 不可用。在小提琴中,名为“noncheck”的项目应该具有默认的项目符号样式。

HTML:

<ul>
    <li>
        <div><div class="checkbox"></div>unchecked</div>
    </li>
    <li>
        <div><div class="checked"></div>noncheck</div>
    </li>
    <li>
        <div><div class="checked"></div>noncheck</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="check"></div></div>checked</div>
    </li>
    <li>
        <div><div class="checkbox"></div>unchecked</div>
    </li>
    <li>
        <div><div class="checkbox"></div>unchecked</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="check"></div></div>checked</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x"></div></div>x</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x"></div></div>x</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x"></div></div>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x2"></div></div>x</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x2"></div></div>x</div>
    </li>
    <li>
        <div><div class="checkbox"><div class="x2"></div></div>x</div>
    </li>
    <li>
        <ul>
            <li>
                <div><div class="checkbox"></div>unchecked</div>
            </li>
            <li>
                <div><div class="checked"></div>noncheck</div>
            </li>
            <li>
                <div><div class="checked"></div>noncheck</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="check"></div></div>checked</div>
            </li>
            <li>
                <div><div class="checkbox"></div>unchecked</div>
            </li>
            <li>
                <div><div class="checkbox"></div>unchecked</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="check"></div></div>checked</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x"></div></div>x</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x"></div></div>x</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x"></div></div>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x2"></div></div>x</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x2"></div></div>x</div>
            </li>
            <li>
                <div><div class="checkbox"><div class="x2"></div></div>x</div>
            </li>
            <li>
                <div><div class="checked"></div>noncheck</div>
            </li>
        </ul>
    </li>
    <li>
        <div><div class="checked"></div>noncheck</div>
    </li>
</ul>

CSS:

ul {
    list-style: none;
    margin-left: 0;
    padding-left: 19px;
}
li {
    text-indent: -19px;
    position: relative;
    left: 38px;
    margin-right: 38px;
}
.checkbox {
    border: 1px solid black;
    width: 11px;
    height: 11px;
    display: inline-block;
    margin-right: 5px;
    margin-top: 2px;
    margin-bottom: -1px;
    position: relative;
    top: 1px;
}
.checkbox > .check {
    border: 0px;
    margin: -11px 0px 0px 18px;
    padding: 0px;
    display: block;
    font-size: 20px;
}
.checkbox > .check:before {
    content: '✔';
    color: #000000;
}
.checkbox > .x {
    border: 0px;
    margin: -3px 0px 0px 19px;
    padding: 0px 0px 0px 0px;
    display: block;
    font-size: 13px;
    position: relative;
    top: -1px;
}
.checkbox > .x:before {
    content: '✖';
    color: #000000;
}
.checkbox > .x2 {
    border: 0px;
    margin: -6px 0px 0px 18px;
    padding: 0px 0px 0px 0px;
    display: block;
    font-size: 16px;
}
.checkbox > .x2:before {
    content: '✕';
    color: #000000;
}

【问题讨论】:

  • 如果我理解正确,您希望那些包含 div.checkbox 的列表项没有项目符号,而没有项目符号的列表项正常运行? CSS 不允许这样做,抱歉。您将不得不重新考虑您的策略,例如以将类分配给列表项本身的形式。
  • 对不起,我应该补充一下这是程序生成的,&lt;div class="checkbox"&gt; 组件完全是任意的。我想要做的是对某些项目子集使用内置的浏览器项目符号样式(以某种方式标记它们以被生成HTML 的代码识别很好,但是跟踪它们在哪个级别以及哪个级别浏览器不会。)如果您查看this fiddle,您应该会注意到不同深度的项目符号略有不同 - 这就是我试图为任意选择的项目保留的项目。
  • 你走错路了。不要把子弹藏在每一个里,然后试着把它们恢复到它们只为一些里的样子。 保留每个li上的子弹,然后在应该隐藏的时候隐藏。就像我说的那样,将类分配给应该隐藏其项目符号的列表项,并使用 css 仅隐藏这些列表项上的项目符号。无需跟踪它们所在的嵌套级别!
  • 如何在不使用父 &lt;ul&gt; 中的 list-style: none; 选项的情况下根据 &lt;li&gt; 隐藏它们?当我尝试在它们上绘制复选框时,我最终会出现重叠的项目符号,并且肯定不希望为框设置背景颜色,因为这是我在生成 HTML 和 CSS 时不知道的值。
  • 不要将list-style分配给ul;仅将其分配给适当的 li 元素。 ul 本身的 list-style 属性不做任何事情,但它被列表项继承以生成项目符号。请参阅official definition

标签: html css html-lists


【解决方案1】:

如果您希望那些包含带有“复选框”类的 div 的列表项没有项目符号,而没有项目符号的列表项正常运行,最直接的解决方案应该是用于“li”的 CSS 选择器,其中包含div.复选框”。不幸的是,CSS 不允许这样做。

一种可能的解决方案是以编程方式将分配类分配给应该隐藏其项目符号的列表项。

由于 HTML 是在服务器端创建的,因此设置这些类应该不会太难。
在下面的示例中,我使用 Javascript 进行了相同的模拟(因为 StackSnippets 没有服务器端)。请注意,这会使原始 HTML 保持不变;但这仅用于演示目的。
我还稍微更改了 CSS,因为您不想取消所有 li 元素上的项目符号,只显示复选框。

var items = document.getElementsByTagName('li');
for (var i = 0; i < items.length; ++i)
  if (items[i].children.length && items[i].children[0].className == 'checkbox')
    items[i].setAttribute('class', 'checkitem');
ul.checklist {
}
ul.checklist > li {
    margin-left: 0px;
    padding-left: 0px;
}
ul.checklist > li.checkitem {
    margin-left: -40px;
    padding-left: 2px;
    text-indent: -18px;
    position: relative;
    left: 38px;
    margin-right: 37px;
    list-style: none;
}
ul.checklist > li.checkitem > div.checkbox {
    border: 1px solid black;
    width: 11px;
    height: 11px;
    display: inline-block;
    margin-right: 5px;
    margin-top: 2px;
    margin-bottom: -1px;
    position: relative;
    top: 1px;
}
ul.checklist > li.checkitem > div.checkbox > div.check {
    border: 0px;
    margin: -11px 0px 0px 17px;
    padding: 0px;
    display: block;
    font-size: 20px;
}
ul.checklist > li.checkitem > div.checkbox > div.check:before {
    content: '✔';
    color: #000000;
}
ul.checklist > li.checkitem > div.checkbox > div.x {
    border: 0px;
    margin: -3px 0px 0px 18px;
    padding: 0px 0px 0px 0px;
    display: block;
    font-size: 13px;
    position: relative;
    top: -1px;
}
ul.checklist > li.checkitem > div.checkbox > div.x:before {
    content: '✖';
    color: #000000;
}
ul.checklist > li.checkitem > div.checkbox > div.x2 {
    border: 0px;
    margin: -6px 0px 0px 17px;
    padding: 0px 0px 0px 0px;
    display: block;
    font-size: 16px;
}
ul.checklist > li.checkitem > div.checkbox > div.x2:before {
    content: '✕';
    color: #000000;
}
<ul>
  <li>
    root node example
  </li>
</ul>

<ul class="checklist">
  <li>
    <div class="checkbox"></div>unchecked
  </li>
  <li>
    <div class="checked"></div>noncheck
  </li>
  <li>
    <div class="checked"></div>noncheck
  </li>
  <li>
    <div class="checkbox">
      <div class="check"></div>
    </div>checked
  </li>
  <li>
    <div class="checkbox"></div>unchecked
  </li>
  <li>
    <div class="checkbox"></div>unchecked
  </li>
  <li>
    <div class="checkbox">
      <div class="check"></div>
    </div>checked
  </li>
  <li>
    <div class="checkbox">
      <div class="x"></div>
    </div>x
  </li>
  <li>
    <div class="checkbox">
      <div class="x"></div>
    </div>x
  </li>
  <li>
    <div class="checkbox">
      <div class="x"></div>
    </div>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
    dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </li>
  <li>
    <div class="checkbox">
      <div class="x2"></div>
    </div>x2
  </li>
  <li>
    <div class="checkbox">
      <div class="x2"></div>
    </div>x2
  </li>
  <li>
    <div class="checkbox">
      <div class="x2"></div>
    </div>x2
  </li>
  <li>
    <ul>
      <li>
        <div class="checkbox"></div>unchecked
      </li>
      <li>
        <div class="checked"></div>noncheck
      </li>
      <li>
        <div class="checked"></div>noncheck
      </li>
      <li>
        <div class="checkbox">
          <div class="check"></div>
        </div>checked
      </li>
      <li>
        <div class="checkbox"></div>unchecked
      </li>
      <li>
        <div class="checkbox"></div>unchecked
      </li>
      <li>
        <div class="checkbox">
          <div class="check"></div>
        </div>checked
      </li>
      <li>
        <div class="checkbox">
          <div class="x"></div>
        </div>x
      </li>
      <li>
        <div class="checkbox">
          <div class="x"></div>
        </div>x
      </li>
      <li>
        <div class="checkbox">
          <div class="x"></div>
        </div>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
        dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </li>
      <li>
        <div class="checkbox">
          <div class="x2"></div>
        </div>x2
      </li>
      <li>
        <div class="checkbox">
          <div class="x2"></div>
        </div>x2
      </li>
      <li>
        <div class="checkbox">
          <div class="x2"></div>
        </div>x2
      </li>
      <li>
        <div class="checked"></div>noncheck
      </li>
    </ul>
  </li>
  <li>
    <div class="checked"></div>noncheck
  </li>
</ul>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2014-10-30
    • 2020-02-21
    相关资源
    最近更新 更多