CSS 定位在父元素之外

CSS positioning outside of the parent element

嗨,Whosebug 社区,

我需要你的帮助来解决 CSS 问题。对于我的一个项目,我需要设计一个纯 CSS 时间间隔查看器。由于图片总是比长文字更好,您可以在下面看到我的工作结果:

但是我不想将 start/end 时间放入时间间隔,而是将开始时间放在 top/left 上方,将结束时间放在 bottom/right 下方。我想要这样的结果

这是HTML:

<ul class="day-timeline">
  <li class="time-interval" style="left:4%; width:46%">
    <label class="time start-time">01:00</label>
    <label class="time end-time">12:00</label>
  </li>
  <li class="time-interval" style="left:58%; width:17%">
    <label class="time start-time">14:00</label>
    <label class="time end-time">18:00</label>
  </li>
</ul>

<ul class="day-timeline day-timeline-closed">
  <li class="time-interval closed">
    <label class="time">Closed</label>
  </li>
</ul>

这是CSS:

* {
  box-sizing: border-box;
}
ul.day-timeline {
  padding: 0;
  border-left: 1px solid black;
  border-right: 1px solid black;
  height: 20px;
  overflow: hidden;
  position: relative;

  &:after {
    content: '';
    width: 100%;
    height: 1px;
    background: black;
    display: block;
    position: relative;
    top: 10px;
  }

  li {
    display: block;
    position: absolute;
    background-color: #bed4a7;
    border: 1px solid green;
    z-index: 1;
    padding-left: 5px;
    border-radius: 3px;
    height: 100%;
    font-weight: bold;
    width: 100%;

    &.closed {
      background-color: lightgray;
      border: 1px solid black;

      label {
        color :black;
      }
    }

    label {
      font-size: 0.75rem;
      color: green;

      &.start-time {
        position: absolute;
        top:-10px;
        left:0;
      }
    }

    label + label {
      &:before {
        content: '-';
        padding: 0 0.25rem;
      }
    }
  }
}

ul.day-timeline-closed {
  border: none;
}

你可以在这里看到它:https://codepen.io/zannkukai/pen/XWbYXjG

尽管尝试了很多次,但我从未得到正确的结果:'( CSS-guru 能够帮助我解决我的问题。我认为问题出在 label 定位。但是我是否使用了 position:absolute; top:-10px 标签范围在父级之外并且不显示 :'(

label {
  font-size: 0.75rem;
  color: green;

  &.start-time {
    position: absolute;
    top:-10px;
    left:0;
  }
} 

非常感谢

您已成功移动开始时间,但您在 ul 上设置了 overflow: hidden,因此按要求将其隐藏。设置 ul.day-timeline { overflow: visible; } 并从那里开始

ul.day-timeline中移除overflow: hidden,然后就可以把时间写在父元素之外了。

听到 ul.day-时间线归因于:

ul.day-timeline {
  padding: 0;
  border-left: 1px solid black;
  border-right: 1px solid black;
  height: 20px;
  //overflow: hidden;
  position: relative;

并听到整个 css:

* {
  box-sizing: border-box;
}
ul.day-timeline {
  padding: 0;
  border-left: 1px solid black;
  border-right: 1px solid black;
  height: 20px;
  //overflow: hidden;
  position: relative;

  &:after {
    content: '';
    width: 100%;
    height: 1px;
    background: black;
    display: block;
    position: relative;
    top: 10px;
  }

  li {
    display: block;
    position: absolute;
    background-color: #bed4a7;
    border: 1px solid green;
    z-index: 1;
    padding-left: 5px;
    border-radius: 3px;
    height: 100%;
    font-weight: bold;
    width: 100%;

    &.closed {
      background-color: lightgray;
      border: 1px solid black;

      label {
        color :black;
      }
    }

    label {
      font-size: 0.75rem;
      color: green;

      &.start-time-first {
        position: absolute;
        top: -15px;
        left: 0px;
      }

      &.end-time-first {
        position: absolute;
        top: 20px;
        right: 5px;
      }
      &.start-time-second {
        position: absolute;
        top: -15px;
        left: 0px;
      }

      &.end-time-second {
        position: absolute;
        top: 20px;
        right: 5px;
      }
    }
  }
}

ul.day-timeline-closed {
  border: none;
}

和class你必须重命名定位时间:

HTML 代码段

  <li class="time-interval" style="left:4%; width:46%">
    <label class="time start-time-first">01:00</label>
    <label class="time end-time-first">12:00</label>
  </li>
  <li class="time-interval" style="left:58%; width:17%">
    <label class="time start-time-second">14:00</label>
    <label class="time end-time-second">18:00</label>
  </li>

看起来像这样 -> solution

这是一个带有 CSS 的工作片段,我还包括一个 codepen,基本上你只需要使用左右 CSS 属性就可以工作在使用 position:absolute 之后,我在结束时间添加 right:0 以强制其位置向右,并在开始时间添加 left:0 以强制其向左移动,顶部和底部也是如此 CSS x 轴位置的属性。

* {
  box-sizing: border-box;
}

ul.day-timeline {
  padding: 0;
  border-left: 1px solid black;
  border-right: 1px solid black;
  height: 20px;
  position: relative;
}
ul.day-timeline:after {
  content: '';
  width: 100%;
  height: 1px;
  background: black;
  display: block;
  position: relative;
  top: 10px;
}
ul.day-timeline li {
  display: block;
  position: absolute;
  background-color: #bed4a7;
  border: 1px solid green;
  z-index: 1;
  padding-left: 5px;
  border-radius: 3px;
  height: 100%;
  font-weight: bold;
  width: 100%;
}
ul.day-timeline li.closed {
  background-color: lightgray;
  border: 1px solid black;
}
ul.day-timeline li.closed label {
  color: black;
}
ul.day-timeline li label {
  font-size: 0.75rem;
  color: green;
}
ul.day-timeline li label.start-time-first {
  position: absolute;
  top: -15px;
  left: 0px;
}
ul.day-timeline li label.end-time-first {
  position: absolute;
  top: 20px;
  right: 0;
}
ul.day-timeline li label.start-time-second {
  position: absolute;
  top: -15px;
  left: 0px;
}
ul.day-timeline li label.end-time-second {
  position: absolute;
  top: 20px;
  right: 0;
}

ul.day-timeline-closed {
  border: none;
}
<ul class="day-timeline">
  <li class="time-interval" style="left:4%; width:46%">
    <label class="time start-time-first">01:00</label>
    <label class="time end-time-first">12:00</label>
  </li>
  <li class="time-interval" style="left:58%; width:17%">
    <label class="time start-time-second">14:00</label>
    <label class="time end-time-second">18:00</label>
  </li>
</ul>




<ul class="day-timeline day-timeline-closed">
  <li class="time-interval closed">
    <label class="time">Closed</label>
  </li>
</ul>