垂直滚动快照(Scroll Snap)是一种网页交互技术,当用户滚动页面时,内容会自动"吸附"到预定义的停止点(通常是整个视口的顶部或中心)。这种技术常见于全屏滚动网站、幻灯片展示或分节内容展示。
.container {
scroll-snap-type: y mandatory;
overflow-y: scroll;
height: 100vh;
}
.section {
scroll-snap-align: start;
height: 100vh;
}
$(function() {
var $window = $(window);
var $sections = $('.section');
var currentIndex = 0;
var isScrolling = false;
$window.on('scroll', function() {
if (isScrolling) return;
var scrollTop = $window.scrollTop();
var windowHeight = $window.height();
// 确定当前最接近的section
$sections.each(function(index) {
var $section = $(this);
var sectionTop = $section.offset().top;
var sectionBottom = sectionTop + $section.outerHeight();
if (scrollTop >= sectionTop - windowHeight/2 && scrollTop < sectionBottom - windowHeight/2) {
currentIndex = index;
return false; // 退出循环
}
});
});
$window.on('wheel', function(e) {
if (isScrolling) return false;
var delta = e.originalEvent.deltaY;
if (delta > 0 && currentIndex < $sections.length - 1) {
// 向下滚动
scrollToSection(currentIndex + 1);
} else if (delta < 0 && currentIndex > 0) {
// 向上滚动
scrollToSection(currentIndex - 1);
}
return false;
});
function scrollToSection(index) {
isScrolling = true;
currentIndex = index;
$('html, body').animate({
scrollTop: $sections.eq(index).offset().top
}, 500, function() {
isScrolling = false;
});
}
});
原因:可能由于复杂的DOM结构或过多的重绘/回流 解决方案:
will-change: transform
优化性能原因:触摸事件与滚动事件的冲突 解决方案:
touch-action: pan-y
CSS属性原因:可能是由于动态加载内容导致的高度计算错误 解决方案:
ResizeObserver
监听尺寸变化现代浏览器已原生支持CSS Scroll Snap,建议优先使用CSS方案,jQuery方案可作为兼容性回退。
没有搜到相关的文章