通过列表样式仅覆盖某些项目

时间:2016-09-10 21:27:25

标签: html css html-lists

我试图在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;
}

1 个答案:

答案 0 :(得分:1)

如果你想要那些包含带有类&#34的div的列表项;复选框&#34;如果没有项目符号,并且列表项不能正常运行,那么最直接的解决方案应该是包含div.checkbox&#34;的&#34; li的CSS选择器。不幸的是,CSS并不允许这样做。

一种可能的解决方案是以编程方式将指定类分配给应该抑制其子弹的列表项。

由于HTML是在服务器端创建的,所以设置这些类不应该太难 在下面的示例中,我使用Javascript模拟相同的内容(因为StackSnippets不具备服务器端)。请注意,这会使原始HTML保持不变;但这只是为了演示目的 我也改变了CSS,因为你不想压制所有li元素上的项目符号,只有复选框中出现的项目符号。

&#13;
&#13;
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');
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;