Element Plus组件库中el-anchor使用过程遇到的问题

700 阅读1分钟

Element Plus组件库中el-anchor使用过程遇到的问题

情景再现

首先el-anchor需要通过container属性指定滚动的容器,但当需要指向el-scrollbar时,发现无法直接定位到该容器

<template>
    <el-scrollbar class="scollbar">
        <div class="left" ref="asd">
          <div class="box" v-for="i in 5" :id="`a${i}`">{{i}}</div>
        </div>
        <div class="right">
          <el-anchor container=".scollbar"
                     @change="handleChange"
                     @click="handleClickAnchor" style="width: 20rem">
            <el-anchor-link href="#a1">1</el-anchor-link>
            <el-anchor-link href="#a2">2</el-anchor-link>
            <el-anchor-link href="#a3">3</el-anchor-link>
            <el-anchor-link href="#a4">4</el-anchor-link>
          </el-anchor>
        </div>
    </el-scrollbar>
</template>

探究

检查页面元素

image.png

我们发现scorllbar套了三层div,再分别检查其样式,只有中间那层el-scroll__wrap设置了overflow:auto

也就意味着直接给el-scollbar添加类名以此来定位是行不通的, 查看官方文档可以发现el-scorllbar提供了wrap-class属性,用于控制二层类名,通过这个选项,我们便可以定位scollbar容器,实现锚点传送功能

完整代码:

<template>
    <el-scrollbar wrap-class="scrollbar" view-style="display: flex;">
        <div class="left" >
          <div class="box" v-for="i in 5" :id="`a${i}`">{{i}}</div>
        </div>
        <div class="right">
          <el-anchor container=".scrollbar"
                     @change="handleChange"
                     @click="handleClickAnchor" style="width: 20rem">
            <el-anchor-link href="#a1">1</el-anchor-link>
            <el-anchor-link href="#a2">2</el-anchor-link>
            <el-anchor-link href="#a3">3</el-anchor-link>
            <el-anchor-link href="#a4">4</el-anchor-link>
          </el-anchor>
        </div>

    </el-scrollbar>
</template>

<script setup>
function handleClickAnchor(e, link) {
  // 阻止点击的默认事件修改路由
  e.preventDefault();
  if (link.href) {
    const element = document.querySelector(link.href);
    element && element.scrollIntoView({ block: 'start', behavior: 'smooth', alignToTop: 'false' });
  }
}
const handleChange = (href) => {
  console.log(`anchor change: ${href}`)
}
</script>

<style scoped>

.left{
  width: 50%;
  height: 100vh;
}
.right{
  margin-top:20rem;
  height: 40%;
}
.box{
  height: 20rem;
}
</style>