如何使用 scrollIntoView() 从可见区域的顶部或底部显示一个项目?
how to show one more item from top or bottom of visible area with scrollIntoView()?
我想在使用带有导航按钮(向上和向下)的 scrollIntoView()
时显示两个项目,让用户知道有要导航的项目,但第一个和最后一个项目应该有默认行为,所以用户知道这是列表的末尾。
希望这张图片对您有所帮助:
这是我的代码:
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: sans-serif;
}
.myList{
width: 100px;
height: 100px;
margin: 5px;
overflow: scroll;
display: flex;
flex-direction: column;
background-color: gray;
list-style: none;
}
button{
width: 40px;
margin: 0 5px;
}
.myList>*{
display: block;
padding: 5px;
}
.focused{
background-color: yellow;
color: black;
}
<html>
<body>
<ul class="myList">
<li data-nav="0">Item 1</li>
<li data-nav="1">Item 2</li>
<li data-nav="2">Item 3</li>
<li data-nav="3">Item 4</li>
<li data-nav="4">Item 5</li>
<li data-nav="5">Item 6</li>
<li data-nav="6">Item 7</li>
</ul>
<button onclick="move(true)">UP</button>
<button onclick="move(false)">down</button>
<script>
let nav = document.querySelectorAll("[data-nav]");
nav.forEach(el=>{
el.classList.remove("focused");
})
nav[0].classList.add("focused");
let focusedIndex = 0;
function move(dir){
if(dir && focusedIndex > 0) focusedIndex--;
else if(!dir && focusedIndex < 6) focusedIndex++;
nav.forEach(elem =>{
elem.classList.remove("focused");
})
nav[focusedIndex].classList.add("focused");
nav[focusedIndex].scrollIntoView(true);
}
</script>
</body>
</html>
首先你需要出现前一个元素
- 如果我们点击向上按钮并且当前索引不是第一个元素,在这个雕像 我们需要 滚动到上一个 元素并 添加焦点 class 到当前元素
let nav = document.querySelectorAll("[data-nav]");
nav.forEach((el) => {
el.classList.remove("focused");
});
nav[0].classList.add("focused");
let focusedIndex = 0;
function move(dir) {
if (dir && focusedIndex > 0) focusedIndex--;
else if (!dir && focusedIndex < 6) focusedIndex++;
nav.forEach((elem) => {
elem.classList.remove("focused");
});
/*
check if we click in up button and will not arrive to last one
[1] add foucs to current index
[2] scroll to prev current index
*/
if(dir && nav[focusedIndex].dataset.nav != 0) {
nav[focusedIndex].classList.add("focused");
nav[focusedIndex-1].scrollIntoView(true);
}
/*
if we click in down button dont do any thing differnt because we already can see
another items or the first condition return flase because this already the
first element
*/
else {
nav[focusedIndex].classList.add("focused");
nav[focusedIndex].scrollIntoView(true);
}
}
我想在使用带有导航按钮(向上和向下)的 scrollIntoView()
时显示两个项目,让用户知道有要导航的项目,但第一个和最后一个项目应该有默认行为,所以用户知道这是列表的末尾。
希望这张图片对您有所帮助:
这是我的代码:
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: sans-serif;
}
.myList{
width: 100px;
height: 100px;
margin: 5px;
overflow: scroll;
display: flex;
flex-direction: column;
background-color: gray;
list-style: none;
}
button{
width: 40px;
margin: 0 5px;
}
.myList>*{
display: block;
padding: 5px;
}
.focused{
background-color: yellow;
color: black;
}
<html>
<body>
<ul class="myList">
<li data-nav="0">Item 1</li>
<li data-nav="1">Item 2</li>
<li data-nav="2">Item 3</li>
<li data-nav="3">Item 4</li>
<li data-nav="4">Item 5</li>
<li data-nav="5">Item 6</li>
<li data-nav="6">Item 7</li>
</ul>
<button onclick="move(true)">UP</button>
<button onclick="move(false)">down</button>
<script>
let nav = document.querySelectorAll("[data-nav]");
nav.forEach(el=>{
el.classList.remove("focused");
})
nav[0].classList.add("focused");
let focusedIndex = 0;
function move(dir){
if(dir && focusedIndex > 0) focusedIndex--;
else if(!dir && focusedIndex < 6) focusedIndex++;
nav.forEach(elem =>{
elem.classList.remove("focused");
})
nav[focusedIndex].classList.add("focused");
nav[focusedIndex].scrollIntoView(true);
}
</script>
</body>
</html>
首先你需要出现前一个元素
- 如果我们点击向上按钮并且当前索引不是第一个元素,在这个雕像 我们需要 滚动到上一个 元素并 添加焦点 class 到当前元素
let nav = document.querySelectorAll("[data-nav]");
nav.forEach((el) => {
el.classList.remove("focused");
});
nav[0].classList.add("focused");
let focusedIndex = 0;
function move(dir) {
if (dir && focusedIndex > 0) focusedIndex--;
else if (!dir && focusedIndex < 6) focusedIndex++;
nav.forEach((elem) => {
elem.classList.remove("focused");
});
/*
check if we click in up button and will not arrive to last one
[1] add foucs to current index
[2] scroll to prev current index
*/
if(dir && nav[focusedIndex].dataset.nav != 0) {
nav[focusedIndex].classList.add("focused");
nav[focusedIndex-1].scrollIntoView(true);
}
/*
if we click in down button dont do any thing differnt because we already can see
another items or the first condition return flase because this already the
first element
*/
else {
nav[focusedIndex].classList.add("focused");
nav[focusedIndex].scrollIntoView(true);
}
}