javascript - 拖动时是否可以更改自动滚动偏移量?
问题描述
我有一个用 Vue.js 编写的单页应用程序。UI 包含三个主要元素:
position: fixed
顶部的导航栏和z-index: 2
position: fixed
左侧的侧边栏z-index: 1
和填充以说明导航栏的存在- 一个中心区域,填充以考虑其他固定元素的存在。
侧边栏可使用 滚动overflow-y: auto
。边栏中的一些元素,我在这里用文本指定item X
,是可拖动的。
通常,当向可滚动区域的边缘拖动时,该区域将自动沿该方向滚动。在我的应用程序中,侧边栏不会自动滚动,因为上边缘被导航栏隐藏。
一个明显的解决方案是更改侧边栏的结构,使其上边缘可见,而不是一个顶部填充的 div。但是,这可能会破坏其他事情。
问题: 我想知道当鼠标任意靠近边缘时,是否有办法在拖动时触发自动滚动,例如 $navbarHeight 像素。
我正在寻找一个纯 HTML5 解决方案、vanilla js 或我当前框架(Vue.js v3)的东西。
我已经尝试过: 我已经进行了大量的谷歌搜索,但我可能使用了错误的搜索查询:“拖动时自动滚动”、“滚动敏感区域”、“自动滚动偏移”,以及几种引号组合没有产生相关结果。
JS 小提琴: https ://jsfiddle.net/7f5wh1mj/4/
页面是什么样的(请参阅小提琴以获取工作示例):
解决方案
现在,您可以使用网格来创建这样的布局,这是一个没有位置但网格的示例;)
new Vue({
el: "#app",
data: {
todos: [{
text: "Learn JavaScript",
done: false
},
{
text: "Learn Vue",
done: false
},
{
text: "Play around in JSFiddle",
done: true
},
{
text: "Build something awesome",
done: true
}
],
items: 12
},
methods: {
toggle: function(todo) {
todo.done = !todo.done
}
}
})
* {
box-sizing: border-box;
/* reset , optionnal */
}
body {
background: #20262E;
font-family: Helvetica;
overflow: hidden;
margin: 0;
height: 100vh;
/* needed */
width: 100vw;
}
#app {
background: #fff;
display: grid;
grid-template-columns: 150px 1fr;
grid-template-rows: auto 1fr;
height: 100%;
/* do not remove */
}
.navbar {
grid-row: 1;
grid-column: 1 / 3;
padding: 0.5em;
background-color: lightgreen;
}
.sidebar {
background-color: lightgray;
/* z-index: 1; no need */
overflow-y: auto;
}
.content {
background-color: #fff;
/* z-index: 0; no need */
overflow: auto;
/* make it scroll too instead body */
}
li {
margin: 8px 0;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
del {
color: rgba(0, 0, 0, 0.3);
}
aside p {
text-align: center;
color: white;
background:gray;
position:sticky;
top:0;
margin:0;
padding:0.25em 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div class="navbar">
<h1>Navbar</h1>
</div>
<aside class="sidebar">
<p>Sidebar</p>
<ul>
<li draggable v-for="n in items">item {{ n }}</li>
</ul>
</aside>
<div class="content">
<h2>Todos:</h2>
<ol>
<li v-for="todo in todos">
<label>
<input type="checkbox" v-on:change="toggle(todo)" v-bind:checked="todo.done">
<del v-if="todo.done">
{{ todo.text }}
</del>
<span v-else>
{{ todo.text }}
</span>
</label>
</li>
</ol>
</div>
</div>
编辑:在侧边栏中添加评论和粘性示例。
推荐阅读
- android - 如何创建显示密码的自动填充提示?
- blazor - Blazor,关于编辑表单中模型更改的事件
- php - 在多维数组中查找重复项并回显它们
- python - 转换为 exe 文件 tkinter 后出现 cx_freeze 错误
- mysql - 从数据库 Mysql/MariaDB 中获取正确的数据集
- python - 套接字 OSError:[WinError 10022]
- python - 如何用 Python 中的变量替换部分函数调用?
- r - GAM 错误:model.frame.default 中的错误 - 可变长度不同(为“day_num”找到)
- python - 无法从 macbook 安装 netaddr
- android - 指针数组,指向程序中的位图