【问题标题】:Style only the first level of a nested list仅设置嵌套列表的第一级
【发布时间】:2019-11-27 01:01:46
【问题描述】:

我想在列表的顶级li 元素中实现放大字体大小和添加颜色边框和背景的简单效果,而不影响较低的嵌套级别(子列表)。这四个问题和答案是相关的,但下面不要回答我的问题。

Target first level <li>s and not the nested <li>s
Style first level of menu only
Style only first level of unordered list
styling a nested list in CSS


这是最简单的例子:

ol.toplevel > li {
	font-size: 160%;
	margin-bottom: 0.5em;
	margin-top: 1.5em;
	padding-bottom: 0.2em;
	padding-top: 0.1em;
}

ol.toplevel div.topleveltitle {
	background-color: yellow;
	border-bottom: 1px solid red;
	border-top: 1px solid red;
	color: red;
}

ol.toplevel li li {
	/*For lower nested levels, we don't want to inherit any top-level settings*/
	all: revert; /*does not seem to work at all, "unset" neither*/
	font-size: 70%; /*undo 160%, but we don't want to propagate 70% to lower levels!*/
}
<ol class="toplevel">
    <li><div class="topleveltitle">First title</div></li>
    <li><div class="topleveltitle">Second title</div>
        <ol>
            <li>Subitem</li>	
            <li>Subitem</li>	
            <li>Subitem</li>	
            <li>Subitem</li>	
        </ol>
    </li>
    <li>Third title
        <ul>
            <li>Subitem
            <ol>
                 <li>Subsub</li>
                 <li>Subsub</li>
            </ol>            
            </li>	
        </ul>
    </li>
</ol>

经过这么多年的 css 开发,我希望这个简单的目标能够以一种简单、简洁和优雅的方式实现——没有技巧、黑客和冗余。所以这里是关于这个例子的具体问题:

  1. 是否可以避免与topleveltitle一起引入helper &lt;div&gt;&lt;span&gt;,并使用css只为顶级&lt;ol&gt;定义样式以影响每个顶级&lt;li&gt;文本而不影响嵌套子列表的内容?如果&lt;/li&gt; 结束标签紧跟在标题之后,它会起作用,但它会是无效的 html,因为根据 html 规范,结束标签必须放在嵌套子列表 after 中,如示例。
  2. 是否可以以一种可能简单的方式将颜色背景和边框扩展到列表项编号?
  3. 是否有可能避免阻止样式从顶层继承到底层嵌套的所有这些复杂性? “revert”不能正常工作,我不想显式枚举和设置所有在顶层修改的属性,特别是考虑到它们的值可能是未知的,因为它们本身可能被继承或依赖于用户/浏览器设置。我宁愿只影响顶层,而不是影响所有级别,然后枚举异常或重新定义较低级别的值。

【问题讨论】:

  • 请注意,revert 目前仅适用于 Fiferox
  • @TemaniAfif 我只在 Firefox 上测试过。
  • 您是否考虑过让他们成为另一个包含孩子的li 的兄弟姐妹?或者,很难说,因为我不知道内容,但根据语义&lt;dd&gt; 可能很合适
  • @soulshined &lt;dd&gt;&lt;dl&gt; 不适合这个用例......当前使用嵌套列表的方法非常适合(而且我有一个巨大的复杂列表,这只是一个最小的例子),我只是对描述的非常简单的样式有问题。关于“使他们成为另一个包含孩子的li 的兄弟姐妹”,我不明白应该将什么设为兄弟姐妹,但这对我来说听起来像是创建人工/冗余结构/项目以帮助处理 css。跨度>
  • “不正确破坏正确的结构”...语义正确是正确的结构;我不认为我们在同一页上。我推荐的解决方案通常用于类似于“纯”CSS 下拉菜单的内容。如果您认为它不符合您的需求,那也没关系,每个人都有自己的需求。我只是在详细说明,以便未来的读者理解,有一些替代方案可以以一种语义友好的方式解决这个问题,而不需要付出任何努力,而不是 javascript。干杯

标签: html css


【解决方案1】:

实现你想做的事吗?

ol {
  counter-reset: my-awesome-counter;
}
ol li {
  font-size: 1rem;
  color: black;
  list-style: none;
  counter-increment: my-awesome-counter;
}
ol li::before {
  content: counter(my-awesome-counter) ". ";
  width: 2rem;
}
ol.toplevel > li::before {
  background-color: yellow;
  border-bottom: 1px solid red;
  border-top: 1px solid red;
  color: red;
}
ul > li::before {
  content: ''
}
ol.toplevel > li {
  font-size: 1.8rem;
  margin-bottom: 0.5em;
  margin-top: 1.5em;
  padding-bottom: 0.2em;
  padding-top: 0.1em;
}
ol.toplevel > li span {
  display: inline-block;
  width: calc(100% - 2rem);
  background-color: yellow;
  border-bottom: 1px solid red;
  border-top: 1px solid red;
  color: red;
}
<ol class="toplevel">
    <li><span>First title</span></li>
    <li><span>Second title</span>
        <ol>
            <li>Subitem</li>	
            <li>Subitem</li>	
            <li>Subitem</li>	
            <li>Subitem</li>	
        </ol>
    </li>
    <li><span>Third title</span>
        <ul>
            <li>Subitem
            <ol>
                 <li>Subsub</li>
                 <li>Subsub</li>
            </ol>            
            </li>	
        </ul>
    </li>
</ol>

它通过添加一个计数器并隐藏默认数字来使用自定义列表数字。

【讨论】:

  • 这看起来几乎不错,不幸的是列表编号周围的顶部和底部边框与标题周围的边框不匹配(存在一个或多个像素的差异,取决于缩放)。我希望这个简单的目标可以以更简单和优雅的方式实现(您的解决方案使用calc() 并复制颜色和边框的定义)。即使这样,我的三个问题也会被回答为:1)无法避免在&lt;li&gt; 中引入另一个元素,例如&lt;div&gt;&lt;span&gt;,2)没有简单的方法,而是自定义计数器,3)没有办法避免css中的复杂性和一些丑陋☹️
【解决方案2】:

试试这个,使用 topleveltitle 类作为第三个标题。正如你已经定义的那样。

  <ol class="toplevel">
    <li><div class="topleveltitle">First title</div></li>
    <li><div class="topleveltitle">Second title</div>
        <ol>
            <li>Subitem</li>    
            <li>Subitem</li>    
            <li>Subitem</li>    
            <li>Subitem</li>    
        </ol>
    </li>
    <li><div class="topleveltitle">Third title</div>
        <ul>
            <li>Subitem
            <ol>
                 <li>Subsub</li>
                 <li>Subsub</li>
            </ol>            
            </li>   
        </ul>
    </li>
</ol>

【讨论】:

  • 我在 Firefox 和 Edge 上测试了您的解决方案。它使“第一”项变大,而其他所有内容(包括“第二”和“第三”顶级项)保持正常大小。
  • 您的意思是更新后的解决方案#2 的唯一区别是为第三个标题添加 class="topleveltitle"?我故意把它漏掉了。请再次阅读我的三个问题,因为您当前的解决方案无法解决其中任何一个问题......(仍然感谢您的尝试!)
猜你喜欢
  • 2011-09-27
  • 2023-03-29
  • 1970-01-01
  • 2015-05-05
  • 2022-01-02
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多