|
@@ -9,158 +9,157 @@
|
|
|
<div class="anchor-link" :style="{ height: getAnchorLinkHeight }">
|
|
|
<AnchorLink
|
|
|
:data="data"
|
|
|
+ :current-anchor="currentAnchor"
|
|
|
@goAnchor="goAnchor"
|
|
|
- :currentAnchor="currentAnchor"
|
|
|
- ></AnchorLink>
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div ref="anchor-body" class="anchor-body" @scroll="scrollEvent($event)">
|
|
|
- <slot></slot>
|
|
|
+ <slot />
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
-import AnchorLink from "./anchorItem.vue"
|
|
|
+import AnchorLink from './anchorItem.vue'
|
|
|
export default {
|
|
|
+ components: {
|
|
|
+ AnchorLink
|
|
|
+ },
|
|
|
props: {
|
|
|
float: Boolean,
|
|
|
placement: {
|
|
|
type: String,
|
|
|
- default: "leftTop",
|
|
|
+ default: 'leftTop'
|
|
|
},
|
|
|
itemHeight: {
|
|
|
type: Number,
|
|
|
- default: 180,
|
|
|
+ default: 180
|
|
|
},
|
|
|
data: {
|
|
|
type: Array,
|
|
|
- default: () => [],
|
|
|
+ default: () => []
|
|
|
},
|
|
|
height: {
|
|
|
type: String,
|
|
|
- default: "600px",
|
|
|
- },
|
|
|
+ default: '600px'
|
|
|
+ }
|
|
|
},
|
|
|
- components: {
|
|
|
- AnchorLink,
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ currentAnchor: '',
|
|
|
+ oldHeight: 0,
|
|
|
+ scorllTimer: null,
|
|
|
+ allAnchor: [],
|
|
|
+ offset: 0
|
|
|
+ }
|
|
|
},
|
|
|
computed: {
|
|
|
- //获取所有锚点组合的锚点高度
|
|
|
+ // 获取所有锚点组合的锚点高度
|
|
|
getAnchorLinkHeight() {
|
|
|
- let childrenHeight = 0;
|
|
|
+ let childrenHeight = 0
|
|
|
this.data.forEach((ele) => {
|
|
|
if (ele.children && ele.children.length > 0) {
|
|
|
- childrenHeight += ele.children.length * 30;
|
|
|
+ childrenHeight += ele.children.length * 30
|
|
|
}
|
|
|
- });
|
|
|
- console.log(childrenHeight + 30 * this.data.length - 20 + "px")
|
|
|
- return (childrenHeight + 30) * (this.data.length - 20) + "px";
|
|
|
+ })
|
|
|
+ console.log(childrenHeight + 30 * this.data.length - 20 + 'px')
|
|
|
+ return (childrenHeight + 30) * (this.data.length - 20) + 'px'
|
|
|
},
|
|
|
- //获取所有锚点组合的位置
|
|
|
+ // 获取所有锚点组合的位置
|
|
|
getHeaderPosition() {
|
|
|
switch (this.placement) {
|
|
|
- case "leftTop":
|
|
|
- return "placement-left-top";
|
|
|
- case "leftCenter":
|
|
|
- return "placement-left-center";
|
|
|
- case "leftBottom":
|
|
|
- return "placement-left-bottom";
|
|
|
- case "rightTop":
|
|
|
- return "placement-right-top";
|
|
|
- case "rightCenter":
|
|
|
- return "placement-right-center";
|
|
|
- case "rightBottom":
|
|
|
- return "placement-right-bottom";
|
|
|
+ case 'leftTop':
|
|
|
+ return 'placement-left-top'
|
|
|
+ case 'leftCenter':
|
|
|
+ return 'placement-left-center'
|
|
|
+ case 'leftBottom':
|
|
|
+ return 'placement-left-bottom'
|
|
|
+ case 'rightTop':
|
|
|
+ return 'placement-right-top'
|
|
|
+ case 'rightCenter':
|
|
|
+ return 'placement-right-center'
|
|
|
+ case 'rightBottom':
|
|
|
+ return 'placement-right-bottom'
|
|
|
default:
|
|
|
- return "";
|
|
|
+ return ''
|
|
|
}
|
|
|
- },
|
|
|
+ }
|
|
|
},
|
|
|
watch: {
|
|
|
- //监听数据变化,获取所有锚点(方便后面计算),获取第一个锚点的偏差
|
|
|
- //(因为offset计算的是当前容器被卷去的高度,可能你的高度存在偏差,所以需要减去)
|
|
|
+ // 监听数据变化,获取所有锚点(方便后面计算),获取第一个锚点的偏差
|
|
|
+ // (因为offset计算的是当前容器被卷去的高度,可能你的高度存在偏差,所以需要减去)
|
|
|
data: {
|
|
|
handler(val) {
|
|
|
if (val && val.length > 0) {
|
|
|
- this.allAnchor = this.getAllAnchor(val);
|
|
|
- //偏差
|
|
|
+ this.allAnchor = this.getAllAnchor(val)
|
|
|
+ // 偏差
|
|
|
this.$nextTick(() => {
|
|
|
- var anchor = document.querySelector(val[0].tar);
|
|
|
- this.offset = anchor.offsetTop;
|
|
|
- });
|
|
|
+ var anchor = document.querySelector(val[0].tar)
|
|
|
+ this.offset = anchor.offsetTop
|
|
|
+ })
|
|
|
}
|
|
|
},
|
|
|
deep: true,
|
|
|
- immediate: true,
|
|
|
- },
|
|
|
- },
|
|
|
- data() {
|
|
|
- return {
|
|
|
- currentAnchor: "",
|
|
|
- oldHeight: 0,
|
|
|
- scorllTimer: null,
|
|
|
- allAnchor: [],
|
|
|
- offset: 0,
|
|
|
- };
|
|
|
+ immediate: true
|
|
|
+ }
|
|
|
},
|
|
|
methods: {
|
|
|
- //递归获取所有锚点的值
|
|
|
+ // 递归获取所有锚点的值
|
|
|
getAllAnchor(anchor) {
|
|
|
- let anchorTree = [];
|
|
|
+ const anchorTree = []
|
|
|
anchor.forEach((ele) => {
|
|
|
- anchorTree.push({ tar: ele.tar, title: ele.title });
|
|
|
+ anchorTree.push({ tar: ele.tar, title: ele.title })
|
|
|
if (ele.children && ele.children.length > 0) {
|
|
|
- anchorTree.push(...this.getAllAnchor(ele.children));
|
|
|
+ anchorTree.push(...this.getAllAnchor(ele.children))
|
|
|
}
|
|
|
- });
|
|
|
- return anchorTree;
|
|
|
+ })
|
|
|
+ return anchorTree
|
|
|
},
|
|
|
- //点击锚点滚动
|
|
|
+ // 点击锚点滚动
|
|
|
goAnchor(selector) {
|
|
|
- //将原来的scrollTimer变为现在的scorllClick 防止滚动条滚动多次触发
|
|
|
- this.scorllClick = true;
|
|
|
- this.currentAnchor = selector;
|
|
|
- var anchor = document.querySelector(selector);
|
|
|
- this.$refs["anchor-body"].scrollTop = anchor.offsetTop-50;
|
|
|
+ // 将原来的scrollTimer变为现在的scorllClick 防止滚动条滚动多次触发
|
|
|
+ this.scorllClick = true
|
|
|
+ this.currentAnchor = selector
|
|
|
+ var anchor = document.querySelector(selector)
|
|
|
+ this.$refs['anchor-body'].scrollTop = anchor.offsetTop - 50
|
|
|
this.allAnchor.forEach((ele, i) => {
|
|
|
if (ele.tar === selector) {
|
|
|
// this.$refs["anchor-icon"].style.display = "block";
|
|
|
// this.$refs["anchor-icon"].style.top = i * 30 + 2 + "px";
|
|
|
}
|
|
|
- });
|
|
|
- this.scorllClick = false;
|
|
|
-
|
|
|
+ })
|
|
|
+ this.scorllClick = false
|
|
|
},
|
|
|
- //页面滚动, 判断当前的scrollTop在哪个锚点之间,修改锚点的样式
|
|
|
+ // 页面滚动, 判断当前的scrollTop在哪个锚点之间,修改锚点的样式
|
|
|
scrollEvent() {
|
|
|
if (this.scorllClick) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ return
|
|
|
+ }
|
|
|
if (this.scorllTimer != null) {
|
|
|
- return;
|
|
|
+ return
|
|
|
}
|
|
|
- //当前滚动位置
|
|
|
- let scrollTop = this.$refs["anchor-body"].scrollTop;
|
|
|
+ // 当前滚动位置
|
|
|
+ const scrollTop = this.$refs['anchor-body'].scrollTop
|
|
|
// console.log(scrollTop)
|
|
|
-
|
|
|
+
|
|
|
this.allAnchor.forEach((ele, i) => {
|
|
|
- let dom = document.querySelector(ele.tar);
|
|
|
+ const dom = document.querySelector(ele.tar)
|
|
|
if (dom) {
|
|
|
if (
|
|
|
- scrollTop > dom.offsetTop-80
|
|
|
-
|
|
|
+ scrollTop > dom.offsetTop - 80
|
|
|
+
|
|
|
) {
|
|
|
- this.currentAnchor = ele.tar;
|
|
|
+ this.currentAnchor = ele.tar
|
|
|
// this.currentAnchor = this.allAnchor[i+1].tar;
|
|
|
// this.$refs["anchor-icon"].style.display = "block";
|
|
|
// this.$refs["anchor-icon"].style.top = i * 30 + 2 + "px";
|
|
|
- return;
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
- },
|
|
|
- },
|
|
|
-};
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
.cec-anchor {
|