因为我觉得这个话题很有趣,所以我尝试了一下。我认为最简单的方法是不使用插件。这是使页面水平滚动的结果代码:
// set a block variable if we are over another element that scrolls
// if ie would support e.target for scrolling this wouldn't be needed
var blockScroll = false;
$(".scroller").on("mouseenter mouseleave", function (e) {
blockScroll = e.type === "mouseenter";
})
function scrollFunc (e) {
// stop if the target is a .scroller and also
// if there is an indication that a vertical scroll was done
if (blockScroll || ("wheelDeltaX" in e && e.wheelDeltaX != 0) || e.shiftKey) return;
// prevent default scrolling (no jumps)
e.preventDefault();
// get ammount of scrolling
var scroll = "wheelDelta" in e ? -e.wheelDelta : (e.detail * 2);
// use scroll y for scroll x
window.scrollBy( scroll, 0 );
}
// try attaching the method like the borwser needs it
// this event isn't covered by jquery so I had to do it manually
if (document.addEventListener) { // W3C sort of
document.addEventListener( "DOMMouseScroll", scrollFunc, false );
document.addEventListener( "mousewheel", scrollFunc, false );
} else if (document.attachEvent) { // IE way
document.attachEvent("onmousewheel", scrollFunc);
} else {
document.onmousewheel = scrollFunc;
}
注意:每个自己滚动的元素都必须具有scroller
带有此代码的类。如果需要,您可以尝试overflow
使用 jquery 获取值,css
但我不建议这样做。
这是我的结果!但我不得不说我没有移动设备来测试它。此解决方案仅适用于鼠标滚轮。
如果您有另一个应该水平滚动的元素,请将document
我的示例中的 替换为您的元素节点window.scrollBy
和element.scrollLeft += -scroll
.
我还可能不得不补充一点,滚动永远不会像直接完成那样平滑。
编辑:我有另一个想法如何实现。您可以使页面垂直滚动并在其中放置一个 100% 大小和固定位置的 div。然后使用 onscroll 事件将内部 div 的水平滚动与 body 的垂直滚动同步。我不知道这会有多好。