【问题标题】:Using a ::before pseudo element on UL to create a time line representation在 UL 上使用 ::before 伪元素来创建时间线表示
【发布时间】:2017-02-07 20:57:26
【问题描述】:

我想在ul 中使用li 元素来实现故事情节的视觉布局,如下所示:

li-element1
 .
 .
li-element2
 .
 .
li-element3

我正在使用::before 伪元素在整个 ul 元素中添加一条线,但它在 li 元素的顶部可见,我不希望发生这种情况。我怎样才能让线隐藏在lis 后面并且只在边距间隙之间可见?我已经没有成功地尝试过 Z-index 属性。这是我当前代码的link to a pen

.container ul{
  position: relative;
}
.container ul::before{
  content: "";
  position: absolute;
  top: 0px;
  bottom: 0px;
  border: 1px dashed blue;
}
.container ul li{
  margin: 15px;
}
<div class="container">
  <ul>
    <li>First</li>
    <li>Second</li>
    <li>Third</li>
    <li>Fourth</li>
  </ul>
</div>

更新

在最初的问题中,我没有注意到 li 元素中的项目符号实际上并不是 li 元素本身的一部分,因此实际上不受设置为它们的任何背景颜色的影响。现在考虑到这一点并实施建议的答案,结合使用 z-index、背景颜色、边距和填充,另外设置 ul list-style-type: none 我已将代码更新为:

.container ul{
  padding: 0px;
  margin: 0px;
  position: relative;
  list-style-type: none;
}
.container ul::before{
  content: "";
  position: absolute;
  top: 0px;
  bottom: 0px;
  left: 16px;
  border: 1px dotted red;
}
.container ul li{
  margin: 15px;
  padding: 0px 0px;
  position: relative;
  z-index: 1;
  background-color: white;
}
<div class="container">
  <ul>
    <li>• First</li>
    <li>• Second</li>
    <li>• Third</li>
    <li>• Fourth</li>
  </ul>
</div>

【问题讨论】:

  • 我尝试将位置设置为 li 元素上的相对位置,因此我实际上可以在它们上使用 z-index,然后在它们和 ul::before 类上设置不同的值,但它没有'似乎没有将元素移动到行的顶部,这是我所期望的

标签: html css pseudo-element


【解决方案1】:

您可以使用白色背景、填充和相对定位来隐藏每个项目的部分时间线:

.container ul{
  position: relative;
}
.container ul::before{
  content: "";
  position: absolute;
  top: 0px;
  bottom: 0px;
  border: 1px dashed red;
}
.container ul li {
  display: block;
  position: relative;
  left: -20px;
  background-color: white;
  padding: 5px;
  padding-left: 20px;
  margin: 40px 0px;
}
<div class="container">
  <ul>
    <li>First</li>
    <li>Second</li>
    <li>Third</li>
    <li>Fourth</li>
  </ul>
</div>

【讨论】:

    【解决方案2】:

    移除列表图标,并用伪元素替换它们:http://codepen.io/anon/pen/qRMZyy

    .container ul{
      position: relative;
      list-style: none;
    }
    .container ul::before{
      content: "";
      position: absolute;
      top: 0px;
      bottom: 0px;
      z-index:100;
      border: 1px dashed blue;
    }
    .container ul li {
      margin: 15px;
      position: relative;
    }
    .container ul li:before {
      content: "";
      height: 10px;
      width: 10px;
      border-radius: 100%;
      background: #000;
      display: inline-block;
      position: absolute;
      top: 5px;
      z-index: 0;
      left: -20px;
    }
    

    【讨论】:

    • 我认为这实际上是一个好主意,但是,运行代码,两个元素仍然重叠
    • 啊,我看错了问题,我刚刚切换了元素的z-index
    【解决方案3】:

    z-index 应该可以正常工作。您有两种选择:在线上的否定z-indez&lt;li&gt;s 上的肯定z-index

    负 z-index:

    .container ul{
      position: relative;
      z-index: 1;
    }
    .container ul::before{
      content: "";
      position: absolute;
      top: 0px;
      bottom: 0px;
      border: 1px dashed blue;
      z-index: -1;
    }
    .container ul li{
      margin: 15px;
    }
    
    body {background: #888;}
    .container ul::before {border-color: #000;}
    .container ul li {color: #FFF;}
    <div class="container">
      <ul>
        <li>First</li>
        <li>Second</li>
        <li>Third</li>
        <li>Fourth</li>
      </ul>
    </div>

    正 z-index:

    .container ul{
      position: relative;
    }
    .container ul::before{
      content: "";
      position: absolute;
      top: 0px;
      bottom: 0px;
      border: 1px dashed blue;
    }
    .container ul li{
      margin: 15px;
      position: relative;
      z-index: 1;
    }
    
    body {background: #888;}
    .container ul::before {border-color: #000;}
    .container ul li {color: #FFF;}
    <div class="container">
      <ul>
        <li>First</li>
        <li>Second</li>
        <li>Third</li>
        <li>Fourth</li>
      </ul>
    </div>

    【讨论】:

    • 通过运行代码 sn-p,垂直线似乎仍然与 li 元素位于相同的 Z 位置。通过将lis 上的边距设置为 0px,您仍然可以看到与字母重叠的线
    • @randomguy04 我认为我们看到的不是同一件事。我放大了浏览器并将边距设置为-2px。很明显在文字后面:i.stack.imgur.com/xbEQ8.png。您使用的是什么浏览器、浏览器版本和操作系统?
    • @JosephMarikle Windows 7 中的 Firefox 显示如下:i.stack.imgur.com/BQXH3.jpg
    • @TylerH 对我来说是正确的。我已经更新了我的答案以获得更高的对比度,但是 abl 在他的回答中可能是正确的,因为他认为 OP 想要用背景颜色覆盖路径,而不仅仅是在其上放置文本。我们将看看 OP 是怎么说的。你的似乎也遵循这个想法。 OP 需要更好地展示他/她在这里追求什么。
    • 你是对的约瑟夫,我的问题表述错误,我会正确更新它,问题是我没有考虑到 li 子弹实际上并不属于 li 元素本身,因此我期待不同的行为,很抱歉造成误解。
    【解决方案4】:

    一种方法是将边框放在&lt;li&gt; 元素的伪元素子元素上,而不是&lt;ul&gt; 元素上。不过,这可能不是最好的方法。

    .container ul{
      position: relative;
    }
    .container ul li{
      margin: 2px;
    }
    .container ul li::after, .container ul li::before {
      content:" ";
      border-left: 1px dashed blue;
      display: block;
      position: relative;
      left: -12px;
      top: 0;
      height: 12px;
    }
    .container ul li:last-child::after, .container ul li:first-child::before {
      content:"";
      display: none;
    }
    <div class="container">
      <ul>
        <li>First</li>
        <li>Second</li>
        <li>Third</li>
        <li>Fourth</li>
      </ul>
    </div>

    【讨论】:

    • 在 Chrome 中,第一个项目之后的每个项目的点向左和向上移动,距离大约为两个长度。
    • @Dragomok Classic webkit...感谢您告诉我
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2020-02-15
    • 2017-01-22
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多