【问题标题】:Firefox Scrolling Bug When Changing :after Contents更改时Firefox滚动错误:内容之后
【发布时间】:2014-12-31 08:34:38
【问题描述】:

我想根据容器的滚动位置更改容器上的伪元素。我做了一个 jsfiddle 来演示我偶然发现的错误:http://jsfiddle.net/krzncu1k/1/

:after-元素显示当前滚动状态(“上半部分”或“下半部分”)。通过根据滚动位置切换 .upper-half.lower-half 类来更改其内容:

.upper-half:after {content:'upper half'; top:0;}
.lower-half:after {content:'lower half'; bottom:0;}

对应的JS:

$wrap.toggleClass('upper-half', isUpper).toggleClass('lower-half', !isUpper);

当使用 Firefox 并通过拖动滚动条(而不是通过鼠标滚轮!)滚动时会发生该错误。如果你拖动它并穿过中间(类从.upper-half 变为.lower-half),你突然不能再拖动了。

关于为什么会发生这种行为以及如何解决它的任何想法?

【问题讨论】:

  • 本身不是一个答案 - 看起来 toggleClass 正在从 FF 的滚动条中移除焦点/鼠标,需要重新选择它
  • 想法一样。所以这是一个错误?
  • 这可能只是 FF 如何合理化对可滚动内容的更改的不同 - 注意 :after 与元素的实际内容相关(它位于内容之后,在标签内),所以改变(位置)可能会被认为影响可滚动 - 失去焦点......或者它可能是一个错误:(

标签: javascript css firefox


【解决方案1】:

不知道为什么在 Firefox 中会发生这种情况,但我确实有一个解决方法。使用:before 创建上半部分,使用:after 创建下半部分,并在类更改时以不透明度隐藏和显示。不妨也抛出一个平滑的transition。由于位置没有变化,因此防止了该错误。

(您也可以使用display: none 代替不透明度,但不能过渡)

工作示例

$(function() {
  var $wrap = $('.wrap'),
    $ul = $('ul'),
    ulHeight = $ul.height();

  $ul.scroll(function(e) {
    var isUpper = (this.scrollTop + ulHeight / 2) / this.scrollHeight <= 0.5;
    $wrap.toggleClass('upper-half', isUpper).toggleClass('lower-half', !isUpper);
  });
});
ul {
  overflow: auto;
  max-height: 200px;
  background-color: #ddd;
}
li {
  font-size: 200%;
}
.wrap {
  position: relative;
  width: 200px;
}
.wrap:before,
.wrap:after {
  position: absolute;
  left: 0;
  width: 100px;
  height: 40px;
  background-color: rgba(128, 128, 128, 0.3);
  text-align: center;
  color: white;
  line-height: 40px;
  transition: opacity 0.5s;
}
.wrap:before {
  content: 'upper half';
  top: 0;
}
.wrap:after {
  content: 'lower half';
  bottom: 0;
}
.upper-half:after {
  opacity: 0;
}
.lower-half:before {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="wrap upper-half">
  <ul>
    <li>Some</li>
    <li>Random</li>
    <li>Bullet</li>
    <li>Points</li>
    <li>Just</li>
    <li>To</li>
    <li>Make</li>
    <li>This</li>
    <li>Awesome</li>
    <li>List</li>
    <li>A</li>
    <li>Little</li>
    <li>Longer</li>
    <li>And</li>
    <li>Longer</li>
    <li>And</li>
    <li>Longer</li>
  </ul>
</div>

【讨论】:

  • 工作,谢谢。我仍然想知道这是否是一个错误,但至少我现在有办法解决它。
猜你喜欢
  • 2020-04-04
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2018-11-06
  • 2012-11-25
  • 2017-08-14
相关资源
最近更新 更多