我有div
position: absolute
和overflow: auto
。在div
内,我有一个div
应该是粘性的,当我滚动时应该修复(top: 0, bottom: 0, overflow: auto
)。
我可以修复此div
,但我无法将其恢复到原始位置,因为在修复此div
时我无法附加滚动事件。
$('.right').scroll(function() {
if ($('.scroll').offset().top <= 0) {
$('.scroll').css({
'position': 'fixed',
'top': 0,
'left': '20px',
'right': '0',
'overflow': 'auto'
})
}
})
请查看我的JSFiddle以获取更多信息 - JSFIDDLE
谢谢。
答案 0 :(得分:9)
这是我怎么做的。这并没有固定,但外观相同。一旦scrollTop等于或大于固定内容的顶部&#34;应该是&#34;然后我们将topT绝对设置为scrollTop的顶部,如果你在scrollTop到达固定内容的位置时向上滚动,它将再次丢弃它。
$(document).ready(function() {
oldOffset = $('.scroll').offset().top;
$('.right').scroll(function() {
if ($('.right').scrollTop() > oldOffset) {
$('.scroll').css({
'position': 'absolute',
'top': $('.right').scrollTop(),
'left': '20px',
'right': '0',
'overflow': 'auto'
});
}
});
});
(Demo)
答案 1 :(得分:1)
将外部div设置为
position: relative;
将内部div设置为
position: absolute;
top: 15px;
right: 15px;
这会将内部div的右上角放在父容器中的指定位置。设置绝对位置时,我相信图像是相对于第一个父容器设置的,其位置定义为默认值以外的任何值。如果没有为元素分配位置,则绝对元素将相对于视口定位。
答案 2 :(得分:1)
你想要完成的任务非常奇怪:)
但无论如何都有问题:
当您将内部div
设置为position: fixed
时,您将此div
定位在div.right
之上,这样可以阻止滚动事件。
所以您需要将pointer-events: none
设置为div.scroll
以允许您的div.right
听取滚动事件而不会出现任何问题。
但是当你这样做时,你将面临另一个问题 - 当你将div.scroll
设置为position: fixed
时,它会在div.right
和div.right
跳转到滚动顶部自动。为了防止您需要创建div.scroll
的克隆并将其height
初始设置为0
,并在内部元素修复时设置为auto
。
注意 pointer-events: none
- 禁用所有鼠标事件,包括文本选择。
有代码:
<强> JS 强>
$(document).ready(function() {
var cnt = $('.right');
var scrollEl = $('.scroll');
var scrollClone = scrollEl.clone().addClass('clone');
scrollEl.before(scrollClone);
cnt.scroll(function() {
var expression = scrollClone.offset().top <= 0;
scrollEl.toggleClass('stick', expression);
scrollClone.toggleClass('stick-clone', expression);
})
})
<强> CSS 强>
.scroll {
background: yellow;
pointer-events: none;
overflow: hidden; /* Remove top offset from h1*/
}
.scroll.stick {
position: fixed;
left: 20px;
right: 0;
top: 0;
}
.scroll.clone {
height: 0;
overflow: hidden;
}
.scroll.clone.stick-clone {
height: auto;
}
答案 3 :(得分:0)
您可以尝试以下示例:
首先,不要将css添加为内联样式,而是创建一个可以在.scroll
元素中添加和删除的css类。
CSS
.fixed-top {
position:fixed;
top:0;
left:20px;
right:20px;
}
将.scroll元素换成另一个div,该div将在javascript中用于跟踪.scroll
div的原始高度。
HTML
<div class="scroll-wrapper">
<div class="scroll"></div>
</div>
最后,在第一次应用固定位置时,将scrollTop值存储在变量中。然后,您可以使用该值来确定何时从.scroll
div中删除固定样式。同时将.scroll-wrapper
元素的高度设置为等于.scroll
元素的高度,以确保内容可滚动。
的Javascript
var startScrollTop = 0;
$('.right').scroll(function () {
var $scroll = $('.scroll');
if ($scroll.offset().top <= 0 && $('.right').scrollTop() > startScrollTop) {
if (startScrollTop === 0) {
startScrollTop = $('.right').scrollTop();
}
$('.scroll-wrapper').css("height", $('.scroll').height() + 300);
$scroll.addClass("fixed-top");
} else {
$scroll.removeClass("fixed-top");
}
})
看看这个小提琴。 http://jsfiddle.net/a924dcge/25/
希望有所帮助!