设置滑块分区上的滚动
Setting Scroll on Slider Div
我正在构建一个新闻提要,其中包含显示摘要的幻灯片和一个阅读更多按钮,单击该按钮可显示其余内容。
这是一个jsFiddle:http://jsfiddle.net/pbunz5ue/1/
单击"阅读更多"时,故事会打开并停止滚动,然后用户单击"较少",它会隐藏故事并继续滚动。
当点击"阅读更多"时,我需要对齐div的滚动,以便打开的故事从div的顶部开始。我的滑块在故事的第一轮中完美地做到了这一点,一旦它们从按钮向上第二次显示,就不再起作用了。
有人能解释一下原因吗??
这是我的代码:
JS:
$(document).ready(function() {
//User clicks Read More, add 'open' class to news item
$('.news-read-more').on('click', function() {
blockedSlider = true;
clearInterval(myTimer);
$('.news-list').children('li').each(function() {
$(this).removeClass('open');
});
$(this).parent().toggleClass('open');
var n = $(this).parent();
var pos = n.position();
$('.news-slider-wrapper').scrollTop(pos.top);
});
//User clicks Less, remove 'open' class from news item
$('.news-read-less').on('click', function() {
if (blockedSlider == true) {
blockedSlider = false;
$(this).parent().removeClass('open');
myTimer = setInterval(slideLoop, 2000)
}
});
var myTimer = setInterval(slideLoop, 2000)
var blockedSlider = false;
function slideLoop() {
// Work out width of current slider size
var widthPx = $('.news-list-item').css('height');
var width = widthPx.substring(0, widthPx.length - 2);
// Work out current left
var left = $('.news-list').css('top');
left = left.substring(0, left.length - 2);
if (left <= -(width * 2)) {
var neg = '-' + widthPx;
$('.news-list').css('top', neg);
var slide = $('.news-list li:first');
$('.news-list').children('li:first').remove();
$('.news-list ').append(slide);
//User clicks Read More, add 'open' class to news item
$('.news-read-more').on('click', function() {
blockedSlider = true;
clearInterval(myTimer);
$('.news-list').children('li').each(function() {
$(this).removeClass('open');
});
$(this).parent().toggleClass('open');
var n = $(this).parent();
var pos = n.position();
$('.news-slider-wrapper').scrollTop(pos.top - 360);
});
//User clicks Less, remove 'open' class from news item
$('.news-read-less').on('click', function() {
if (blockedSlider == true) {
blockedSlider = false;
$(this).parent().removeClass('open');
myTimer = setInterval(slideLoop, 2000)
}
});
var move = "-=" + widthPx;
$('.news-list').animate({ top: move }, "slow", "swing");
}
else {
var move = "-=" + widthPx;
$('.news-list').animate({ top: move }, "slow", "swing");
}
}
});
问题是由.news-list的负"顶部"位置引起的,该位置破坏了打开元素的位置。
->我更新你的小提琴:http://jsfiddle.net/pbunz5ue/3/<-
我改变了什么
-
主要错误:
当您计算位置时,您没有考虑新闻容器
.news-list
向上滑动时的负top
偏移:我已经更改了这两行:
var pos = n.position(); $('.news-slider-wrapper').scrollTop(pos.top);
in:
var pos = n.position().top + parseInt($(".news-list").css("top")) || n.position().top; $('.news-slider-wrapper').scrollTop(pos);
如果
$(".news-list")
具有顶部位置,我将其添加到位置的计算中(如果结果是auto
,则存在阻止NaN
结果|| n.position().top
的回退) -
您复制了处理程序
$('.news-read-more').on('click')
和$('.news-read-less').on('click');
,我在函数中删除了它们,因为它们看起来毫无用处。
编辑::.点击问题
试试这两种方法来解决你的问题:
1
如果在列表中添加新项目时遇到问题,请尝试将事件绑定到"项目"容器.news-list
,并在每次触发选择器时对其进行筛选:
$('.news-read-more').on('click', function() { //...
$('.news-read-less').on('click', function() { //...
变为:
$('.news-list').on('click','.news-read-more', function() { //...
$('.news-list').on('click','.news-read-less', function() { //...
容器.news-list
在动画和DOM操作过程中永远不会改变。
2
另一种方法是在代码中更改这些行:
var slide = $('.news-list li:first');
$('.news-list').children('li:first').remove();
$('.news-list ').append(slide);
变为:
var slide = $('.news-list li:first');
$('.news-list ').append(slide);
或:
$('.news-list ').append('.news-list li:first');
如果您.remove
元素,(我认为)您解除了所有事件的绑定,因为您从DOM中移除了元素,但您不需要移除,您需要将其从上向下移动。这样可以防止click
事件的解除绑定。
我希望能理解这个问题:)。
抱歉可能英语不好
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 幻灯片滚动javascript不起作用
- 将视口底部滚动到元素底部
- 设置滑块分区上的滚动
- 停止在后分区中滚动
- 如何在滚动手风琴分区上进行操作
- CSS-定位滚动分区
- 在可滚动分区中显示图像
- 锁定鼠标滚轮滚动到焦点分区
- 当用户向下滚动到该分区时,背景图像淡入淡出
- 水平滚动分区
- 跟踪HTML分区中的滚动位置
- 查找滚动分区的底部高度
- 如何在多次克隆表单时使用javascript或jquery自动滚动到重点输入字段分区
- 当键盘弹出时,使分区可滚动
- 自动滚动到最近的分区
- 当到达计数分区中的滚动点时,将开始计数
- 捕获内部分区中的滚动
- 隐藏可滚动分区的滚动条
- 滚动分区的按钮