一旦div的位置从窗口视图中滚动出来,我就将其固定在窗口的底部。然后,当它的位置滚动回视图时,我会"取消固定"它。如果滚动得很慢,就会出现可怕的位置闪烁。有办法解决这个问题吗?
演示https://jsfiddle.net/3146nxLx/
var initSet = false;
$(window).scroll(function() {
if (isScrolledIntoView($('#myDivTrigger'))) {
if (!initSet) {
initSet = true;
}
$("#myDiv").removeClass('fixed');
} else if (initSet) {
$("#myDiv").addClass('fixed');
}
});
function isScrolledIntoView(elem) {
var $elem = $(elem);
var $window = $(window);
var docViewTop = $window.scrollTop();
var docViewBottom = docViewTop + $window.height();
var elemTop = $elem.offset().top;
var elemBottom = elemTop + $elem.height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
这是因为您正在设置一个固定元素,然后trigger
会弹出到它的位置,从而变得可见。您需要创建一个包装器,给它一个相对位置,然后将触发器设置为绝对位置。这样,当固定div的位置发生变化时,触发器的位置不会移动。
演示https://jsfiddle.net/3146nxLx/1/
<div id="myDivWrap">
<div id="myDiv">
<p>
This should be fixed once it comes into view and then goes out of view.
</p>
</div>
<span id="myDivTrigger">trigger</span>
</div>
您甚至可以为触发器指定一个bottom
值,以便过渡更加平滑。是,也给它一个左值。
演示https://jsfiddle.net/3146nxLx/3/
这里有一个例子,半基于@Lionel提出的逻辑。你可以克隆div然后添加它。这也意味着你不需要触发器。
演示https://jsfiddle.net/3146nxLx/4/
是的,将position: fixed;
设置为myDiv
浏览器后,问题是bcz将其从DOM的正常流中删除。。。
您可以对包装应用高度,然后注册滚动处理程序。。这是另一种可能的解决方案,无需克隆或使用额外的块。。
这是Fidde