IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> elementui中内容滚动并伴随着el-steps状态自动切换,点击el-steps内容也会自动定位到相应位置 -> 正文阅读

[JavaScript知识库]elementui中内容滚动并伴随着el-steps状态自动切换,点击el-steps内容也会自动定位到相应位置

可以分成两步来实现:

  1. 首先实现el-steps的点击事件,这个组件是不能点击的,但是我们可以获取dom元素,自己来设置点击事件,并获取到相应的索引;对于有滚动条的盒子,我们把里面的每个盒子距离顶部的高度全部放到一个数组里,然后通过点击el-steps获得的索引在数组中找出对应的盒子距离顶部的高度,把这个值设置给scrollTop,就可以达到点击哪个el-step,滚动内容就定位到那里了
  2. 给有滚动条的盒子设置一个滚动事件,通过拿到的scrollTop的值来判断当前位于哪个盒子中,以此来获取索引赋值给el-step,那么就可以实现对应的el-step高亮了;

先把el-steps作为一个组件拆分出来:

<template>
  <div class="step">
    <el-steps direction="vertical">
      <el-step
        :title="item"
        v-for="(item, index) in titleList"
        :key="item"
        :status="active == index ? 'finish' : 'wait'"
      ></el-step>
    </el-steps>
  </div>
</template>

<script>
export default {
  props: {
    titleList: {
      type: Array,
      default: []
    },
    index: {
      type: Number,
      default: 0
    }
  },
  watch: {
    index(val) {
      this.active = val
    }
  },
  data() {
    return {
      active: 0
    }
  },
  mounted() {
    let that = this
    // 注册点击事件,获取索引
    const stepItem = document.getElementsByClassName('el-step__icon')
    for (let i = 0; i < stepItem.length; i++) {
      stepItem[i].addEventListener('click', function (e) {
        that.active = i
        that.$emit('onBack', i)
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.step {
  height: 80%;
  // width: 10px;
  position: fixed;
  top: 50%;
  right: 10px;
  transform: translate(0, -50%);
  ::v-deep .el-step__icon {
    cursor: pointer;
  }
}
</style>

然后在引入到父组件中使用:

<template>
  <div class="container">
    <div class="main">
      <el-scrollbar ref="scrollbar">
        <div
          class="item"
          v-for="(item, index) in itemList"
          :key="index"
          :style="`background:${item.color};`"
        >
          {{ item.title }}
        </div>
      </el-scrollbar>
    </div>
    <Step :titleList="titleList" @onBack="onBack" :index="index"></Step>
  </div>
</template>

<script>
import Step from '@/components/step.vue'
export default {
  components: {
    Step
  },
  data() {
    return {
      titleList: ["标题1", "标题2", "标题3", "标题4", "标题5", "标题6"],
      itemList: [
        { color: 'red', title: '标题1' },
        { color: 'blue', title: '标题2' },
        { color: 'green', title: '标题3' },
        { color: 'purple', title: '标题4' },
        { color: 'khaki', title: '标题5' },
        { color: 'skyblue', title: '标题6' }
      ],
      scrollBox: {},
      offsetTop: [],
      index: 0
    }
  },
  mounted() {
    // 获取有滚动条盒子的对象
    this.scrollBox = this.$refs.scrollbar.$refs.wrap
    // 获取滚动内的每个盒子距离顶部的距离
    const dom = document.getElementsByClassName('item')
    for (let i = 0; i < dom.length; i++) {
      this.offsetTop.push(dom[i].offsetTop)
    }

    // 侦听滚动
    this.scrollBox.addEventListener('scroll', () => {
      this.offsetTop.forEach((item, index, arr) => {
        if (this.scrollBox.scrollTop >= item - 1 && this.scrollBox.scrollTop < arr[index + 1]) {
          this.index = index
        }
      })
    })
  },
  methods: {
    onBack(index) {
      this.scrollBox.scrollTop = this.offsetTop[index]
    }
  }
}
</script>

<style lang="scss" scoped>
.main {
  width: 80%;
  height: 700px; // 建议设置父级元素的高度,这样div.el-scrollbar就可以通过%来设置高度
  padding: 0;
  overflow: hidden;
  border: 1px solid #ccc;
  .el-scrollbar {
    width: 100%; // 宽度可以设置也可以不设置 因为宽度默认就是填充满父级元素的内容区
    height: 100%; // 必须设置el-scrollbar的高度
    ::v-deep .el-scrollbar__wrap {
      // 实际上我们的内容是放在这个div下面的
      // height: 100%; // 渲染出来的div.el-scrollbar__wrap默认会添加height:100%的属性。我们可以设置为105%来隐藏元素水平滚动条
      height: 100%;
      overflow: scroll;
      overflow-x: auto;
    }
  }
}
.item {
  height: 400px;
  color: #000;
  font-size: 20px;
  font-weight: bold;
}
</style>

注:上面的if判断里面的item-1是因为有可能是计算存在一些误差,需要微微调整(因为点击el-step的同时也会执行if判断,得确保执行的是对应的if判断,不然两边会冲突)
效果如下:
在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:27:19  更:2022-07-21 21:30:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 12:37:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码