如何使元素仅在存在滚动条时出现?

时间:2018-08-23 19:00:11

标签: css scrollbar

嗨,

我需要某些伪元素才能仅在滚动条出现时出现。这是代码:

.pseudo::before, .pseudo::after {
    position: absolute;
    z-index: 1;
    content: "";
    width: 18px;
    height: calc(100% - 2px);
    right: 0;
    display: block;
    pointer-events: none;
    border: 5px solid black;
    box-sizing: border-box;
}

.pseudo::before {background: rgba(177, 171, 44, 0.4);border-radius: 25px;}

但这行代码仅在滚动条出现时才是必需的。当它不存在时,不需要它。

仅使用CSS的解决方案会不错,但我愿意接受替代方案。

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要观察元素的大小,看是否出现滚动条,如果有则添加一个类。仅当类在其父级上存在时,才会显示伪元素。该演示使用新的ResizeObserver。目前仅受Chrome支持。但是,有一个pollyfill

向下拖动文本区域手柄以将其放大直到出现滚动条。

注意:在您的伪元素出现之后,它们会导致永久性溢出,因此您无法通过缩小文本区域来隐藏滚动条。

const ro = new ResizeObserver(entries => {
  const { target } = entries[0];
	const hasScrollbar = target.scrollHeight > target.clientHeight;
  
  if(hasScrollbar) target.classList.add('has-scrollbar');
  else target.classList.remove('has-scrollbar');
});

ro.observe(document.querySelector('.pseudo'));
.pseudo {
  position: relative;
  overflow: auto;
  height: 150px;
}

.pseudo.has-scrollbar::before, .pseudo.has-scrollbar::after {
  display: block;
}

.pseudo::before,
.pseudo::after {
  position: absolute;
  z-index: 1;
  content: "";
  width: 18px;
  height: calc(100% - 2px);
  right: 0;
  display: none;
  pointer-events: none;
  border: 5px solid black;
  box-sizing: border-box;
}

.pseudo::before {
  background: rgba(177, 171, 44, 0.4);
  border-radius: 25px;
}
<div class="pseudo">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam dapibus ante ac iaculis dapibus. Vestibulum quis purus at urna tincidunt commodo ac id ante.
  <br />
  <textarea></textarea>
</div>