html - 通过列表样式仅覆盖某些元素

标签 html css html-lists

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

我整理了a JSFiddle outlining this issue如果 JSFiddle 不可用,代码如下。在 fiddle 中,名为“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;
}

最佳答案

如果您希望那些包含类为“checkbox”的 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>

关于html - 通过列表样式仅覆盖某些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430719/

相关文章:

html - 名片图片放大过大

python - 使用 Mechanize/ Selenium 抓取网站时缺少 html 中的内容

css - 哪个 CSS 选择器可用于选择处于包装状态的 flex box 元素?

java - 如何在断言 Selenium getCssValue ("background"返回的背景色 rgb(255,255,255) 时将#ffffff 转换为#fff 或将#fff 转换为#ffffff

php - 带有图像的列表中的动态下拉选项

html - 图片显示不正确

html - 在公共(public)网站上使用 schemeless 协议(protocol) URI 是 "safe"吗?例如//www.example.com/dir/file

html - 使用 flexbox 防止下一行占据上一行中最高元素的高度?

javascript - 分散的无序列表

javascript - 将数据添加到 html 表格单元格时如何更改 col-span