vue 字母索引 字母检索 锚点

在这里插入图片描述

vue typescript 实现字母锚点

<template>
  <div class="view-container">    
  	  <div class="group-content">
	     <div class="group-list-container" ref="groupRef">
	       <div
	         class="group-list"
	         v-for="(item, index) in groupList"
	         :key="index"
	       >
	         <div class="list-title" ref="titleRef">
	           {{ item.title }}
	         </div>
	         <el-checkbox-group v-model="checkList">
	           <el-checkbox
	             :label="item1.name"
	             v-for="(item1, index1) in item.children"
	             :key="index1"
	           />
	         </el-checkbox-group>
	       </div>
	     </div>
	     <div class="word-list">
	       <div
	         v-for="item in wordList"
	         :key="item"
	         @click="goIndex(item)"
	       >
	         {{ item }}
	       </div>
	     </div>
      </div>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component({
  name: 'App',
})
export default class extends Vue {
  groupList = [
    {
      title: 'A',
      children: [
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' },
        { name: 'A区域' }
      ]
    },
    {
      title: 'B',
      children: [
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' },
        { name: 'B区域' }
      ]
    },
    {
      title: 'C',
      children: [
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' },
        { name: 'C区域' }
      ]
    },
    {
      title: 'D',
      children: [
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' },
        { name: 'D区域' }
      ]
    }
  ]
  checkList = []
  wordList = [
    'A',
    'B',
    'C',
    'D',
    'E',
    'F',
    'G',
    'H',
    'I',
    'J',
    'K',
    'L',
    'M',
    'N',
    'O',
    'P',
    'Q',
    'R',
    'S',
    'T',
    'U',
    'V',
    'W',
    'X',
    'Y',
    'Z'
  ]

  goIndex(params: any) {
    const groupRef = this.$refs.groupRef as any
    const titleRef = this.$refs.titleRef as any
    titleRef.map((item: any) => {
      if (item.innerText === params) {
        groupRef.scrollTo({
          top: item.offsetTop,
          behavior: 'smooth' // 平滑移动
        })
      }
    })
    // groupRef.scrollTop = offsetTop
  }
}
</script>

<style lang="scss" scoped>
.view-container {
    .group-content {
      height: 500px;
      position: relative;
      .group-list-container {
        height: 100%;
        overflow: auto;
        .group-list {
          margin-bottom: 16px;
          .list-title {
            font-size: 14px;
            font-family: PingFangSC, PingFangSC-Medium;
            font-weight: bold;
            color: #3e4451;
            margin-bottom: 16px;
          }
          /deep/.el-checkbox {
            margin: 0 56px 16px 0;
          }
        }
      }
      .word-list {
        position: absolute;
        right: 19px;
        top: 0;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        height: 500px;
        font-size: 12px;
        font-family: $font;
        font-weight: 400;
        color: #3e4451;
        div {
          text-align: center;
          cursor: pointer;
        }
      }
    }
}
</style>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值