【问题标题】:CSS last-child on list with <a> tags surrounding each <li>CSS last-child 在列表中,每个 <li> 周围都有 <a> 标签
【发布时间】:2019-03-10 20:42:49
【问题描述】:

我有一个简单的&lt;ul&gt; 菜单,其中包含一些列表项。我使用 :last-child 伪类将右边框应用于最后一个列表项。每个先前的列表项只有一个左边框。它看起来很好,直到我修改了我的 HTML 代码以用&lt;a&gt; 标记包围列表项。我这样做是因为我希望整个列表项成为可点击的链接。不幸的是,这破坏了我的设计,因为现在每个列表项都是最后一个子项,因为它嵌套在 &lt;a&gt; 标记中。所以现在每个列表项都有一个左右边框。如何仅在最后一个列表项上设置右边框,并且仍然保留完整的可点击列表项?

这是我用来测试的 HTML:

<div class="tabs">
    <div class="tabs__tab-list">
        <ul>
            <a href=""><li class="tabs__tab-list-item tabs__tab-list-item--active">Look Ups</li></a><!--
            --><a href=""><li class="tabs__tab-list-item">Look Up Types</li></a><!--
            --><a href=""><li class="tabs__tab-list-item">Look Up Relationships</li></a><!--
       --></ul>
    </div>
</div>

还有 CSS:

.tabs {
width: 70%;
margin: 20px;
min-height: 20px;
min-width: 700px;
display: block;
}

.tabs__tab-list {
    display: block;
    padding-left: 30px;
}

.tabs__tab-list-item {
    display: inline-block;
    border-left: 1px solid black;
    border-top: 1px solid black;
    background-color: lightgray;
    padding: 5px 10px 5px 5px;
    color: black;
}

.tabs__tab-list-item:hover {
    background-color: #E8E8E8;
}

.tabs__tab-list-item:active {
    background-color: white;
}

 .tabs__tab-list-item:last-child {
    border-right: 1px solid black;
}

.tabs__tab-list-item--current {
    background-color: white;
}

【问题讨论】:

  • 你不应该用&lt;a&gt; 元素包裹你的&lt;li&gt;s。这是无效的 HTML 标记!

标签: html css


【解决方案1】:

我认为您只需将&lt;a/&gt; 标签移动到&lt;li/&gt; 标签内,并将.tabs__tab-list-item 设置为display: inline;。见下面的sn-p

html, body{
  width: 100%;
}
.tabs {
  width: 70%;
  margin: 20px;
  display: block;
}

.tabs__tab-list {
  display: block;
  padding-left: 30px;
}
.tabs__tab-list > ul{
  list-style: none;
  display: flex;
  justify-content: space-between;
 }

.tabs__tab-list-item{
  flex: 1 1 auto;
  border-left: 1px solid black;
  border-top: 1px solid black;
  background-color: lightgray;
  color: black;
}
.tabs__tab-list-item a{
  padding: 5px 10px 5px 5px;
  display: block;
  white-space: nowrap;
}

.tabs__tab-list-item:hover {
  background-color: #E8E8E8;
}

.tabs__tab-list-item:active,
.tabs__tab-list-item--active{
  background-color: white;
}

.tabs__tab-list-item:last-child {
  border-right: 1px solid black;
}

.tabs__tab-list-item--current {
  background-color: white;
}
<div class="tabs">
  <div class="tabs__tab-list">
    <ul>
      <li class="tabs__tab-list-item tabs__tab-list-item--active">
        <a href="">Look Ups</a>
      </li>
      <li class="tabs__tab-list-item">
        <a href="">Look Up Types</a>
      </li>
      <li class="tabs__tab-list-item">
        <a href="">Look Up Relationships</a>
      </li>
    </ul>
  </div>
</div>

【讨论】:

  • 感谢您的示例。我想让整个“选项卡”都可以点击,所以我认为我需要放弃整个无序列表,只使用
  • @Sabien 我更新了答案以使锚点成为选项卡的完整大小。
  • 谢谢。在阅读了 CSS 更改并查找了我不知道的属性之后,看起来使“可点击”区域扩展的原因是 flex: 1 1 auto 属性,对吗?感谢您的更新,这是两全其美的做法,保留 HTML 标记的意义​​,同时做我想做的事并成为正确的 HTML。
【解决方案2】:

现在是正确的选择器

a:last-child .tabs__tab-list-item

.tabs {
width: 70%;
margin: 20px;
min-height: 20px;
min-width: 700px;
display: block;
}

.tabs__tab-list {
    display: block;
    padding-left: 30px;
}

.tabs__tab-list-item {
    display: inline-block;
    border-left: 1px solid black;
    border-top: 1px solid black;
    background-color: lightgray;
    padding: 5px 10px 5px 5px;
    color: black;
}

.tabs__tab-list-item:hover {
    background-color: #E8E8E8;
}

.tabs__tab-list-item:active {
    background-color: white;
}

 a:last-child .tabs__tab-list-item {
     background-color: lightblue;
    border-right: 1px solid black;
}

.tabs__tab-list-item--current {
    background-color: white;
}
<div class="tabs">
    <div class="tabs__tab-list">
        <ul>
            <a href=""><li class="tabs__tab-list-item tabs__tab-list-item--active">Look Ups</li></a><!--
            --><a href=""><li class="tabs__tab-list-item">Look Up Types</li></a><!--
            --><a href=""><li class="tabs__tab-list-item">Look Up Relationships</li></a><!--
       --></ul>
    </div>
</div>

【讨论】:

  • 这完全符合我的要求,但其他答案说这是错误的,因为它不是正确的 HTML。如果不是正确的 HTML,为什么浏览器会正确呈现它?
  • 是的,它确实不是正确的 HTML。 li 应该是 ul 的直系后代。但是浏览器并不真正关心这一点。此外,由于您没有使用列表显示,您可以将 ul 和 li 更改为其他类型。例如,您可以使用 navbar 代替 ul,使用 span 代替 li,每个人都会很高兴
【解决方案3】:

现在您需要定位列表中的最后一个&lt;a&gt;,而不是

.tabs__tab-list-item:last-child

使用

.tabs__tab-list a:last-child

【讨论】:

    【解决方案4】:

    使用标签包围的列表项是无效的 HTML。只需将列表项的内容放入 div 中,并用标签包围这些 div 并设置它们的样式。

    <div class="tabs">
      <div class="tabs__tab-list">
        <ul>
          <li class="tabs__tab-list-item tabs__tab-list-item--active">
            <a href=""><div>Look Ups</div></a>
          </li>
          <li class="tabs__tab-list-item">
            <a href=""><div>Look Up Types</div></a>
          </li>
          <li class="tabs__tab-list-item">
            <a href=""><div>Look Up Relationships</div></a>
          </li>
        </ul>
      </div>
    </div>
    

    【讨论】:

    • 谢谢。知道这不是 HTML 的正确语法,这促使我在不使用无序列表的情况下朝着不同的方向前进。我希望整个框都可以点击,而不仅仅是文本。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签