gpt4 book ai didi

javascript - 特别是在移动设备上,从任何地方滚动 div(不使用 jQuery 插件)?

转载 作者:行者123 更新时间:2023-12-03 02:13:31 25 4
gpt4 key购买 nike

来自 original question ,我们已经成功使用 D3js 来检测滚动事件,我们使用该事件从任何地方滚动 div #scroll-content ;但是,该解决方案适用于桌面设备,但在移动设备上的工作效果不同。问题示例:

  • gh-pages - 示例适用于桌面设备,但不适用于移动设备。
  • jsfiddle - 示例适用于桌面设备,但不适用于移动设备。
  • (或查看附加的代码片段)

在移动设备上,我们如何从页面上的任意位置滚动 div #scroll-content?一个成功的解决方案意味着我们可以将手指放在移动页面上的任意位置并垂直滑动来滚动 div #scroll-content

注意以下几点:

  1. 答案应该允许使用 CSS 网格。
  2. 答案可以包含 d3.v4
  3. answer 不应使用 jQuery(如answer0 中所建议)
  4. 答案不应使用插件(如 answer1answer2 中的建议)。
  5. 答案应在使用 Safari 和 Chrome 的 iPhone SE 上运行。

var body = d3.select("body");
var scroll = d3.select("#scroll-content");

body.on("wheel", function() {
scroll.property("scrollTop", +scroll.property("scrollTop") + d3.event.deltaY)
});
body, html {
height: 100%;
box-sizing: border-box;
overflow:hidden; /* stops scroll from the entire page */
background-color: #ad6364;
}
#wrapper {
display: grid;
height:100%;
grid-template-columns: 25% repeat(10,7%) 5%;
grid-template-rows: 5% repeat(4,15%) 30% 5%;
grid-template-areas:
"nav nav nav nav nav nav nav nav nav nav nav nav"
"side1 side1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 side2"
"side1 side1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 side2"
"side1 side1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 side2"
"side1 side1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 viz1 side2"
"int int int int int int int int int int int int"
"ftr ftr ftr ftr ftr ftr ftr ftr ftr ftr ftr ftr";
grid-gap:1px;
}

#scroll-content {
display:block;
grid-column: 1/3;
grid-row: 2 / 6;
/*background-color:#ad6364;*/
/*opacity: 0.75;*/
overflow: auto;
background-color:#2B3033;
}
.step{
margin-bottom: 1000px;
overflow: auto;
max-height: 100vh;
position: relative;
fill:#bdbdc1;
}

#viz-container{
background-color:#2B3033;
grid-area: viz1;
}
#nav-bar{
grid-area:nav;
background-color:#767678;
}
#side-bar1{
grid-area:side1;
background-color:#767678;
}
#side-bar2{
grid-area:side2;
background-color:#767678;
}
#footer{
grid-area:ftr;
background-color:#767678;
}
#interaction{
grid-area:int;
background-color:#767678;
}
.general-text{
text-align: center;
vertical-align: middle;
color:#bdbdc1;
font-size:12px;
}
<html>
<head>
<meta charset="utf-8">

<!-- D3 -->
<script src="https://d3js.org/d3.v5.min.js"></script>

<!-- linked CSS -->
<link href="style.css" type="text/css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<div id="nav-bar" class="general-text">nav</div>
<div id="scroll-content" class="general-text">
<section class="step">Question: ON MOBILE, how do we make this div #scroll-content scrollable from anywhere on the page? <br><br>Notice ON DESKTOP that if we place the mouse anywhere, this div currently scrolls, which is the correct behavior desired for MOBILE; however, ON MOBILE this div can not be scrolled. <br><br>...scroll down.
</section>
<section class="step">Note: none of the div positions are fixed b/c we're using CSS Grid.<br><br>...scroll down.
</section>
<section class="step">...the end.
</section>
</div>
<div id="viz-container" class="general-text">viz</div>
<div id="interaction" class="general-text">interaction</div>
<div id="side-bar1"></div>
<div id="side-bar2"></div>
<div id="footer" class="general-text">footer</div>
</div>
<!-- create listener -->
<script src="scroll.js" type="text/javascript"></script>
</body>
</html>

最佳答案

wheel滚动鼠标滚轮时会触发该事件。手机没有鼠标,而是有触摸屏。

一个更通用的事件,scroll当检测到滚动时,事件将触发,浏览器可以决定何时触发,这意味着它适用于桌面鼠标滚轮滚动和触摸设备滚动。

但是,如果页面高度小于视口(viewport)高度的 100%,则滚动事件似乎不会触发。我不确定车轮事件是否属实。如果是,那么除了触摸事件之外,下面的解决方案还需要包含鼠标事件(mousedownmousemove 等)。

<小时/>

考虑到您想要更多自定义行为,无论用户在屏幕上的哪个位置滚动,您都可以滚动元素,并且页面不需要物理滚动,您只想捕获该事件并使用它,它可能需要创建自定义滚动功能;使用 document.body 上的 touchstarttouchmovetouchend 事件来触发您的自定义滚动代码#scroll-content。您还可以使用滚轮事件来触发滚动代码,因此它也适用于桌面。

这看起来像这样:

  1. 触摸开始时,存储触摸的 y 坐标。 startY = e.touches[0].pageY;
  2. 在触摸移动时,找到起始 y 和移动 y 之间的增量。 deltaY = startY-moveY;
  3. 使用此增量触发自定义滚动事件。 customScroll(deltaY)

自定义滚动事件将采用增量并将其应用到 #scroll-content 使用类似 element.scrollBy(0, deltaY)

您可能还需要标准化 deltaY,因为车轮 deltaY 的大小可能不同,例如*100 或倒数等。

<小时/>

这只是对如何实现所需结果的简单描述。如果您不想使用诸如hammer.js之类的插件/库,那么您将需要自己编写自定义代码。祝你好运。

关于javascript - 特别是在移动设备上,从任何地方滚动 div(不使用 jQuery 插件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com