通过纯css实现选项卡功能(overflow:hidden滚动依旧存在,从而可以完成锚点定位,达到切换目的),采用focus锚点,避免了url锚点触动的由内到外的窗体定位;
但是纯css还是存在缺点:当选项卡在页面外时,因为采用focus锚点,所以依然会通过tab键切换选项卡;
所以,可以配合js使用,在js加载缓慢时,依旧可以操作选项卡;当js加载完毕,通过移除label的for属性,去除css的切换功能,采用控制scrollTop来完成选项卡的切换;
css与js默契配合,优化用户体验;
附源码:
boxOne与boxThree是为了使用url锚点时检验窗体的重定位而增加的,现在使用focus锚点定位解决了窗体定位的问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>利用锚点实现选项卡_Pro(解决某些情况下触发页面窗体的重定向)</title>
<style>
a {
text-decoration: none;
}
.content {
width: 600px;
margin: auto;
/* outline: 1px solid pink; */
}
.content .box {
height: 198px;
overflow: hidden;
}
.content .box .list {
width: 300px;
height: 200px;
text-align: center;
line-height: 200px;
font-size: 30px;
font-weight: 500;
margin: auto;
position: relative;
}
.content .list input {
position: absolute;
top: 0;
clip: rect(0, 0, 0, 0);
height: 100%;/*保证页面全部出现*/
width: 1px;
border: 0;
padding: 0;
margin: 0;
}
#one {
background: red;
outline: 1px solid red;
}
#two {
background: orange;
outline: 1px solid orange;
}
#three {
background: yellow;
outline: 1px solid yellow;
}
#four {
background: green;
outline: 1px solid green;
}
.content .link {
text-align: center;
margin-top: 20px;
}
.content .link label {
display: inline-block;
width: 20px;
height: 20px;
text-align: center;
line-height: 20px;
border: 1px solid #000;
}
.boxOne,
.boxThree {
height: 1000px;
outline: 1px solid green;
}
</style>
</head>
<body>
<!-- 解决窗体重定位的方式是采用focus定位,只要元素在页面内就不会触发窗体的重定位 -->
<div class="boxOne"></div>
<div class="content">
<!-- 选项卡 -->
<div class="box">
<div class="list" id="one">
<input id='o'>1</div>
<div class="list" id="two">
<input id='tw'>2</div>
<div class="list" id="three">
<input id='th'>3</div>
<div class="list" id="four">
<input id='f'>4</div>
</div>
<!-- 链接 -->
<div class="link">
<label for="o">1</label>
<label for="tw">2</label>
<label for="th">3</label>
<label for="f">4</label>
</div>
</div>
<div class="boxThree"></div>
<script>
let label = document.querySelectorAll('label');
let box = document.querySelector('.box');
//移除for属性,启用js完全控制选项卡的滚动
for (let i = 0; i < label.length; i++) {
label[i].removeAttribute('for');
label[i].addEventListener('click', () => {
box.scrollTop = 200 * i;
})
}
</script>
</body>
</html>
效果图: