CSS scroll-snap滚动事件结束检测实例页面

回到相关文章 »

展示(水平滑动)

请在移动端模式下体验本页面。

请在移动端模式下体验本页面。

代码

CSS代码:
.list-ul {
    width: 375px; height: 667px;
    margin: auto;
    font-size: 0;
    scroll-snap-type: x mandatory;
    white-space: nowrap;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
}
.list-li {
    display: inline-block;
    width: 100%; height: 100%;
    scroll-snap-align: center;
    position: relative;
    transition: filter .3s;
}
.list-li:not(.active) {
    filter: grayscale(1);    
}
.list-img {
    display: block;
    width: 80%; height: 100%;
    margin: auto;
    object-fit: contain;
    object-position: center;
}
HTML代码:
<div id="listX" class="list-ul">
    <div class="list-li active">
        <img class="list-img" src="./student.svg">
    </div>
    <div class="list-li">
        <img class="list-img" src="./student.svg" style="filter: hue-rotate(45deg);">
    </div>
    <div class="list-li">
        <img class="list-img" src="./student.svg" style="filter: hue-rotate(135deg);">
    </div>
    <div class="list-li">
        <img class="list-img" src="./student.svg" style="filter: hue-rotate(225deg);">
    </div>
</div>
JS代码:
// 滚动容器
var eleListX = document.querySelector('#listX');
// 定时器,用来检测滚动是否结束
var timerScrollEndDetect = null;
// 滚动事件开始
eleListX.addEventListener('scroll', function () {
    clearTimeout(timerScrollEndDetect);
    timerScrollEndDetect = setTimeout(function () {
        // 100毫秒内滚动事件没触发,认为停止滚动了
        // 对列表元素进行位置检测
        [].slice.call(eleListX.children).forEach(function (eleList, index) {
            if (Math.abs(eleList.getBoundingClientRect().left - eleListX.getBoundingClientRect().left) < 10) {
                // 添加标志类名
                eleList.classList.add('active');
                // 提示
                result.innerHTML = '滚动结束,当前显示的是第'+ (index + 1) +'个列表。';
            } else {
                eleList.classList.remove('active');
            }
        });
    }, 100);    
    
    // 提示
    result.innerHTML = '滚动中...';
});