Axi*_*ion 11 html javascript css jquery
我有一个可以正常(垂直)滚动的页面,并且我希望有一个div可以通过鼠标滚轮向下滚动,然后在完成水平滚动后恢复垂直滚动。这就是我要完成的工作。
我尝试了一些解决方案,但遇到以下问题
到目前为止,这就是我所拥有的...
var scroller = {};
scroller.e = document.getElementById("scroll");
if (scroller.e.addEventListener) {
scroller.e.addEventListener("mousewheel", MouseWheelHandler, false);
scroller.e.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
} else scroller.e.attachEvent("onmousewheel", MouseWheelHandler);
function MouseWheelHandler(e) {
// cross-browser wheel delta
var e = window.event || e;
var delta = - 30 * (Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))));
var pst = $('#scroll').scrollLeft() + delta;
if (pst < 0) {
pst = 0;
} else if (pst > $('.box-wrap').width()) {
pst = $('.box-wrap').width();
}
$('#scroll').scrollLeft(pst);
return false;
}
var toolbox = $('#scroll'),
height = toolbox.height(),
scrollHeight = toolbox.get(0).scrollHeight;
toolbox.off("mousewheel").on("mousewheel", function (event) {
var blockScrolling = this.scrollTop === scrollHeight - height && event.deltaY < 0 || this.scrollTop === 0 && event.deltaY > 0;
return !blockScrolling;
});
Run Code Online (Sandbox Code Playgroud)
#wrap {
max-width: 600px;
margin: 0 auto;
}
#scroll {
width: 600px;
border: 1px solid #111;
padding: 0px;
margin: 0px;
overflow-x: scroll;
overflow-y: hidden;
}
.box-wrap{
padding: 0px;
margin: 0px;
height: 200px;
width: 2040px;
}
.box {
height: 200px;
width: 200px;
padding: 0px;
background: #123;
display: inline-block;
color: #fff;
font-size: 20px;
text-align: center;
line-height: 200px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="wrap">
<h1>asl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdk</h1>
<div id="scroll">
<div class="box-wrap">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
<div class="box">8</div>
<div class="box">9</div>
<div class="box">10</div>
</div>
</div>
<h1>asl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdkasl fjas fhljksa flkjsahf kjsah fkjlsa fkjshf kljsha fkljhs kjfhas kljfh sakjfhas fsdk</h1>
</div>
Run Code Online (Sandbox Code Playgroud)
此解决方案的问题是,当我到达水平滚动部分时,垂直页面滚动不会停止。
有人对我要完成的事情有什么建议吗?如果我没有解释此权利,请告诉我。
谢谢!
你快到了 这是您的滚动条的阻止程序:
$("#scroll").off("mousewheel").on("mousewheel", function(ev) {
var el = $(ev.currentTarget);
return ev.originalEvent.deltaY > 0
? el[0].scrollWidth - el.scrollLeft() <= el.innerWidth()
: el.scrollLeft() === 0;
});
Run Code Online (Sandbox Code Playgroud)
更新了笔。
要观看它们,请在mousewheel事件中使用此记录器:
console.log(
'ev.originalEvent.deltaY:', ev.originalEvent.deltaY,
'\nel[0].scrollWidth:',el[0].scrollWidth,
'\nel.scrollLeft():', el.scrollLeft(),
'\nel.innerWidth()',el.innerWidth()
);
Run Code Online (Sandbox Code Playgroud)
您需要使用e.preventDefault()
以避免屏幕垂直滚动。但是,仅当水平容器允许根据滚动方向向左或向右滚动时,才需要应用它。
显然,这仅在对水平可滚动元素执行滚动时才有效。
实现示例(向下滚动进行测试):
let scrollSpeed = 30;
let scroller = document.getElementById("scroll");
scroller.addEventListener("mousewheel", e=>{
// block if e.deltaY==0
if( !e.deltaY ) return;
// Set scrollDirection (-1 = up // 1 = down)
let scrollDirection = (e.deltaY > 0) ? 1 : -1;
// convert vertical scroll into horizontal
scroller.scrollLeft += scrollSpeed * scrollDirection;
let scrollLeft = Math.round(scroller.scrollLeft);
// calculate box total vertical scroll
let maxScrollLeft = Math.round( scroller.scrollWidth - scroller.clientWidth );
// if element scroll has not finished scrolling
// prevent window to scroll
if(
(scrollDirection === -1 && scrollLeft > 0) ||
(scrollDirection === 1 && scrollLeft < maxScrollLeft )
) e.preventDefault()
// done!
return true;
}, false);
Run Code Online (Sandbox Code Playgroud)
#wrap {
max-width: 600px;
margin : auto;
}
.dummy-content{
height: 400px;
background: red
}
#scroll {
overflow-x: scroll;
overflow-y: hidden;
margin :20px 0;
}
#scroll>div:first-child{
height: 200px;
width: 2040px;
background-image: linear-gradient(to right ,red, yellow);
}
Run Code Online (Sandbox Code Playgroud)
<div id="wrap">
<div class='dummy-content'></div>
<div id="scroll">
<div>
<!-- Your horizontal content -->
</div>
</div>
<div class='dummy-content'></div>
</div>
Run Code Online (Sandbox Code Playgroud)
https://codepen.io/anon/pen/oOgrEY
正如Andrei Gheorghiu 的 回答所解释的那样。它只是缺乏:
e.preventDefault(); // << add this
e.stopPropagation(); // << add this
Run Code Online (Sandbox Code Playgroud)
前 return false;
e.preventDefault(); // << add this
e.stopPropagation(); // << add this
Run Code Online (Sandbox Code Playgroud)
var scroller = {};
scroller.e = document.getElementById("scroll");
if (scroller.e.addEventListener) {
scroller.e.addEventListener("mousewheel", MouseWheelHandler, false);
scroller.e.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
} else scroller.e.attachEvent("onmousewheel", MouseWheelHandler);
function MouseWheelHandler(e) {
// cross-browser wheel delta
var e = window.event || e;
var delta = -30 * Math.max(-1, Math.min(1, e.wheelDelta || -e.detail));
var pst = $("#scroll").scrollLeft() + delta;
if (pst < 0) {
pst = 0;
} else if (pst > $(".box-wrap").width()) {
pst = $(".box-wrap").width();
}
$("#scroll").scrollLeft(pst);
e.preventDefault(); // << add this
e.stopPropagation(); // << add this
return false;
}
$("#scroll").off("mousewheel").on("mousewheel", function(ev) {
var el = $(ev.currentTarget);
return ev.originalEvent.deltaY > 0
? el[0].scrollWidth - el.scrollLeft() <= el.innerWidth()
: el.scrollLeft() === 0;
});
Run Code Online (Sandbox Code Playgroud)
#wrap {
max-width: 600px;
margin: 0 auto;
}
#scroll {
width: 600px;
border: 1px solid #111;
padding: 0px;
margin: 0px;
overflow-x: scroll;
overflow-y: hidden;
}
.box-wrap{
padding: 0px;
margin: 0px;
height: 200px;
width: 2040px;
}
.box {
height: 200px;
width: 200px;
padding: 0px;
background: #123;
display: inline-block;
color: #fff;
font-size: 20px;
text-align: center;
line-height: 200px;
}
Run Code Online (Sandbox Code Playgroud)
测试:版本 73.0.3683.86(官方版本)(64 位)、Firefox 66.0.2(64 位)、Microsoft Edge 42.17134.1.0(Microsoft EdgeHTML 17.17134)、Internet Explorer 11.648.17134.0
归档时间: |
|
查看次数: |
1314 次 |
最近记录: |