<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body {
margin: 0;
padding: 0;
height: 100%;
}
.container {
width: 100%;
display: flex;
padding: 20px 50px;
box-sizing: border-box;
}
.directory {
width: 200px;
}
.content {
flex: 1;
display: flex;
flex-direction: column;
}
.content h2 {
margin: 0;
}
.districtName {
width: 100%;
}
.container .directory ul,
.container .directory li {
list-style: none;
}
#category {
position: sticky;
top: 16px;
right: 0;
}
#category a {
padding: 0 16px;
color: #2d2e2f;
outline: none;
text-decoration: none;
line-height: 30px;
}
#category a:hover {
background: #efefef;
}
#category a.active {
background: #efefef;
color: #1890ff;
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<div data-tab="districtName1" class="districtName">
<h2 class="data-tab">页面一</h2>
<section class="markdown">
<p>按钮用于开始一个即时操作。</p>
</h2>
<p>标记了一个(或封装一组)操作命令,响应用户点击行为,触发相应的业务逻辑。</p>
<ul>
<li>
<p>主按钮:用于主行动点,一个操作区域只能有一个主按钮。</p>
</li>
<li>
<p>默认按钮:用于没有主次之分的一组行动点。</p>
</li>
<li>
<p>虚线按钮:常用于添加操作。</p>
</li>
<li>
<p>文本按钮:用于最次级的行动点。</p>
</li>
<li>
<p>链接按钮:一般用于链接,即导航至某位置。</p>
</li>
</ul>
<p>以及四种状态属性与上面配合使用。</p>
<ul>
<li>
<p>危险:删除/移动/修改权限等危险操作,一般需要二次确认。</p>
</li>
<li>
<p>幽灵:用于背景色比较复杂的地方,常用在首页/产品页等展示场景。</p>
</li>
<li>
<p>禁用:行动点不可用的时候,一般需要文案解释。</p>
</li>
<li>
<p>加载中:用于异步操作等待反馈的时候,也可以避免多次提交。</p>
</li>
</ul>
</section>
</div>
<div data-tab="districtName2" class="districtName">
<h2 class="data-tab">页面二</h2>
<section class="markdown api-container">
<ul>
<li>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
<p>页面二</p>
</li>
</ul>
</section>
</div>
<div data-tab="districtName3" class=" districtName">
<h2 class="data-tab">页面三</h2>
<div>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
<p>页面三</p>
</div>
</div>
<div data-tab="districtName4" class="districtName">
<h2 class="data-tab">页面四</h2>
<div>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
<p>页面四</p>
</div>
</div>
<div data-tab="districtName5" class="districtName">
<h2 class="data-tab">页面五</h2>
<div>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
<p>页面五</p>
</div>
</div>
</div>
<div class="directory">
<div id="category">
<ul>
</ul>
</div>
</div>
</div>
<div style="height: 500px; background: #eee;">
</div>
</body>
<script>
class dataScroll {
// 声明获取名字的节点
districtName = document.querySelectorAll('.container .districtName')
constructor() {
this.init()
}
init() {
this.initDom() //初始化dom
this.initScroll() //初始化监听滚动
}
initDom() {
var districtName = this.districtName
var directoryDom = document.querySelector('.directory #category ul')
let Listdom = "";
districtName.forEach(item => {
let linkClass = item.querySelector(".data-tab")
Listdom += `<li><a data-tab=${item.getAttribute('data-tab')}>${linkClass.innerHTML}</a></li>`
})
directoryDom.innerHTML = Listdom
var Alist = directoryDom.querySelectorAll("li a")
Alist.forEach(el => {
el.addEventListener('click', function(e) {
let aClick = e.target.getAttribute("data-tab")
districtName.forEach(targetNode => {
if (targetNode.getAttribute('data-tab') === e.target.getAttribute(
"data-tab")) {
//页面直接滚动不过度 A标签高亮
// document.documentElement.scrollTop = targetNode.offsetTop
// 页面动画滚动过度 A标签高亮
targetNode.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "start",
});
}
})
})
})
}
initScroll() {
window.addEventListener("scroll", (e) => {
var scroll = document.documentElement.scrollTop || document.body.scrollTop;
var sections = this.districtName
for (var i = sections.length - 1; i >= 0; i--) {
if (parseInt(scroll) >= Math.ceil(sections[i].offsetTop) - 20) {
this.activeLoadScroll(sections[i].getAttribute('data-tab'))
return
}
}
})
}
activeLoadScroll(sections) {
var categoryDomA = document.querySelectorAll('.directory #category ul li a')
categoryDomA.forEach(item => {
if (item.getAttribute('data-tab') == sections) {
item.className = "active"
} else {
item.className = ""
}
})
}
}
new dataScroll() //初始化节点和监听滚动
</script>
</html>
用JS原生实现锚点定位功能/动态目录高亮
于 2022-05-30 16:03:48 首次发布