gpt4 book ai didi

jquery - 悬停时水平滚动不顺畅

转载 作者:行者123 更新时间:2023-12-01 06:16:37 24 4
gpt4 key购买 nike

我使用以下 JS 代码构建一个在悬停时滚动的水平图像轮播。 mousemove 事件检测鼠标在容器上的位置,并相应地向左或向右滚动。一切都按我的预期工作,但如果我在动画运行时将鼠标移到容器上,它就会变得有点不稳定。

有什么解决办法吗?

谢谢

JS:

$( '.carousel-frame ul' ).mousemove( function(e) {
var container = $(this).parent();
if ((e.pageX - container.offset().left) < container.width() / 2) {
var direction = function() {
container.animate({scrollLeft: '-=600'}, 1000, 'linear', direction);
}
container.stop().animate({scrollLeft: '-=600'}, 1000, 'linear', direction);
} else {
var direction = function() {
container.animate({scrollLeft: '+=600'}, 1000, 'linear', direction);
}
container.stop().animate({scrollLeft: '+=600'}, 1000, 'linear', direction);
}
}).mouseleave( function() {
var container = $(this).parent();
container.stop();
});

CSS:

.carousel-frame {
width: 100%;
margin-bottom: 0.5em;
padding-bottom: 1em;
position: relative;
overflow-x: scroll;
white-space: nowrap;
}
.carousel-frame ul {
margin: 0;
padding: 0;
height: 100%;
list-style: none;
}
.carousel-frame li.carousel-item {
cursor: pointer;
display: inline-block;
margin: 0 5px 0 0;
padding: 0;
}

HTML:

<div class="carousel-frame">
<ul>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
</ul>
</div>

fiddle :

https://jsfiddle.net/dk6f3snf/

最佳答案

要获得平滑的效果,需要进行两个主要更改:

一:当尝试创建流畅的动画时,请始终选择 window.requestAnimationFrame...

二:在您的示例中,您正在检测 ul 上的鼠标事件,这意味着每当光标经过 li 之间的“间隙”时,动画就会中断元素。

更新了 fiddle : https://jsfiddle.net/dk6f3snf/6/

var speed = 0;
var scroll = 0;
var container = $('.carousel-frame');
var container_w = container.width();
var max_scroll = container[0].scrollWidth - container.outerWidth();

container.on('mousemove', function(e) {
var mouse_x = e.pageX - container.offset().left;
var mouseperc = 100 * mouse_x / container_w;
speed = mouseperc - 50;
}).on ( 'mouseleave', function() {
speed = 0;
});

function updatescroll() {
if (speed !== 0) {
scroll += speed / 5;
if (scroll < 0) scroll = 0;
if (scroll > max_scroll) scroll = max_scroll;
$('.carousel-frame').scrollLeft(scroll);
}
$("#speed").html('Speed: ' + speed);
$("#scroll").html('Scroll: ' + scroll);
window.requestAnimationFrame(updatescroll);
}
window.requestAnimationFrame(updatescroll);
.carousel-frame {
width: 100%;
margin-bottom: 0.5em;
padding-bottom: 1em;
position: relative;
overflow-x: scroll;
white-space: nowrap;
}
.carousel-frame ul {
margin: 0;
padding: 0;
height: 100%;
list-style: none;
}
.carousel-frame li.carousel-item {
cursor: pointer;
display: inline-block;
margin: 0 5px 0 0;
padding: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="carousel-frame">
<ul>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
<li class="carousel-item">
<img src="http://placehold.it/200x150" />
</li>
</ul>
</div>
<div id="speed"></div>
<div id="scroll"></div>

请注意,我还使速度取决于光标距中间的距离,而不是仅取决于光标的哪一半,并减慢了速度......主要是为了演示使用 window.requestAnimationFrame 的流畅程度 方法创造事物。

更新

实际上,为了使不同设备上的速度保持一致,并且不管其他东西“窃取”资源,我想您还需要考虑帧之间耗时。我已经更新了 fiddle 来演示这一点: https://jsfiddle.net/dk6f3snf/7/

更新

我认为您关于单个页面上多个轮播的问题与您原来的问题完全不同......但一种方法是将其包装在一个简单的插件中 - 例如:https://jsfiddle.net/dk6f3snf/8/

关于jquery - 悬停时水平滚动不顺畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41345207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com