【发布时间】:2018-03-23 17:57:15
【问题描述】:
从original question开始,我们已经成功地使用D3js检测了一个滚动事件,我们用它来从任何地方滚动div #scroll-content;但是,此解决方案适用于桌面,但不适用于移动设备。问题示例:
在移动设备上,我们如何从页面的任意位置滚动 div #scroll-content?一个成功的解决方案意味着我们可以将手指放在移动页面的任意位置,垂直滑动来滚动div#scroll-content。
注意以下几点:
- 答案应该允许使用 CSS 网格。
- 答案可以包括 d3.v4
- answer 不应使用 jQuery(如 answer0 中所建议)
- answer 不应使用插件(如 answer1 和 answer2 中所建议的那样)。
- 答案应该可以在 iPhone SE 上同时使用 Safari 和 Chrome。
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>
【问题讨论】:
-
尝试使用“scroll”事件而不是“wheel”。这就是问题所在。
-
为此使用 d3 是完全没有必要和矫枉过正的。你可以从
scrollTop-lastScrollTop或类似的地方找到delta y
标签: javascript html d3.js mobile scroll