如何最好地使用slick.js实现滚动,以便当您用鼠标滚动时,它会切换到下一张幻灯片?或者有某些设置我错过了吗?
以下是我参考的内容,以防万一。 http://kenwheeler.github.io/slick/
如何最好地使用slick.js实现滚动,以便当您用鼠标滚动时,它会切换到下一张幻灯片?或者有某些设置我错过了吗?
以下是我参考的内容,以防万一。 http://kenwheeler.github.io/slick/
您可以使用wheel
事件来实现滚动,该事件在指向设备(通常是鼠标)的滚轮按钮旋转时触发。
const slider = $(".slider-item");
slider
.slick({
dots: true
});
slider.on('wheel', (function(e) {
e.preventDefault();
if (e.originalEvent.deltaY < 0) {
$(this).slick('slickNext');
} else {
$(this).slick('slickPrev');
}
}));
.container {
margin: 0 auto;
padding: 40px;
width: 80%;
color: #333;
background: #419be0;
}
.slick-slide {
text-align: center;
color: #419be0;
background: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.0/slick/slick.css" />
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.0/slick/slick-theme.css" />
<script type="text/javascript" src="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.0/slick/slick.min.js"></script>
<div class='container'>
<div class='slider-item'>
<div>
<h3>1</h3>
</div>
<div>
<h3>2</h3>
</div>
<div>
<h3>3</h3>
</div>
<div>
<h3>4</h3>
</div>
<div>
<h3>5</h3>
</div>
<div>
<h3>6</h3>
</div>
</div>
</div>
我稍微修改了之前的关于Mac的答案,因为滚动会触发多次。
var slider = $(".slider-item");
var scrollCount = null;
var scroll= null;
slider
.slick({
dots: true
});
slider.on('wheel', (function(e) {
e.preventDefault();
clearTimeout(scroll);
scroll = setTimeout(function(){scrollCount=0;}, 200);
if(scrollCount) return 0;
scrollCount=1;
if (e.originalEvent.deltaY < 0) {
$(this).slick('slickNext');
} else {
$(this).slick('slickPrev');
}
}));
我想到了一种完美的实现方式,参考了 @Maxym Kopych 的回答:
let blocked = false;
let blockTimeout = null;
let prevDeltaY = 0;
$("#slick").on('mousewheel DOMMouseScroll wheel', (function(e) {
let deltaY = e.originalEvent.deltaY;
e.preventDefault();
e.stopPropagation();
clearTimeout(blockTimeout);
blockTimeout = setTimeout(function(){
blocked = false;
}, 50);
if (deltaY > 0 && deltaY > prevDeltaY || deltaY < 0 && deltaY < prevDeltaY || !blocked) {
blocked = true;
prevDeltaY = deltaY;
if (deltaY > 0) {
$(this).slick('slickNext');
} else {
$(this).slick('slickPrev');
}
}
}));
这将防止 macOS 触发多个滚动事件,但允许用户手动重新滚动而无需等待事件完全停止。
能否更改当前的行为,使得无论用户以多快或多慢的速度进行鼠标滚动操作,他只能进入下一张幻灯片(而不是跳转到其他幻灯片)?
对我来说,使用单个和正常的滚动操作从幻灯片1跳转到第6张幻灯片是意外的行为。
最初的回答:
let blocked = false;
let blockTimeout = null;
let prevDeltaY = 0;
$("#slick").on('mousewheel DOMMouseScroll wheel', (function(e) {
let deltaX = e.originalEvent.deltaX;
let deltaY = e.originalEvent.deltaY;
if(typeof deltaY != 'undefined') {
clearTimeout(blockTimeout);
blockTimeout = setTimeout(function(){
blocked = false;
}, 50);
if ((deltaY < 1 && deltaY > -1) && ((deltaX > 10 && deltaX > prevDeltaX) || (deltaX < -10 && deltaX < prevDeltaX) || !blocked)) {
e.preventDefault();
e.stopPropagation();
blocked = true;
prevDeltaX = deltaX;
if (deltaX > 0) {
$(this).slick('slickNext');
} else {
$(this).slick('slickPrev');
}
}
}
}));
slider.on('wheel', (function(e) {
if ( e.originalEvent.deltaX !== 0 ) {
e.preventDefault();
if (e.originalEvent.deltaX >= 10) {
$(this).slick('slickPrev');
}
if (e.originalEvent.deltaX <= -10) {
$(this).slick('slickNext');
}
}
}));