VUE2版本的仿微信通讯录侧滑列表

<template><!-- Vue模板部分 --><div><div v-for="(group, index) in groupedArray" :key="index" ref="indexcatch"><h2>{{ letter[index] }}</h2><ul><li v-for="item in group" :key="item.id">{{ item.name }}</li></ul></div><div ref="scrollDiv"style="position: fixed;right: 0;top: calc(50vh - 325px);width: 50px; height: 650px;background-color: #CCCCCC;"@click="handleClick" @mousedown="startLongPress" @mouseup="stopLongPress"><div v-for="(item,index) in letter" :key="index":style="{textAlign: 'center',height: '25px',color:IndexItem==index?'red':'black',fontWeight:IndexItem==index?'700':''}">{{letter[index]}}</div></div></div>
</template><script>// yarn add js-pinyin --save 或者 npm install js-pinyin --save 安装// 作用是把汉字转化为拼音,以便于排序使用import Pinyin from 'js-pinyin'; export default {data() {return {letter: ['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'], // 右侧字母列表arr: [], // 被处理过的左侧数据列表数据(已经分类好)EleHeight: 25, // 右侧每个字母的高(使用这个高度用于计算点击的或者滚动到的是哪个索引的字母,以便于让左侧列表跟着进行滚动到指定位置)FatherDivHeight: -1, // 右侧字母列表的容器距离浏览器顶部的距离IndexItem: -1, // 用于将字母高亮显示};},computed: {groupedArray() {let result = {};// 生成随机名字的函数(这个是找GPT要的方法,你也用不上,毕竟你的项目是有数据的,这里是模拟的数据,就不写注释了)function getRandomName() {const surnames = ['张', '王', '李', '赵', '刘', '陈', '杨', '黄', '吴', '郑', '孙', '周', '徐', '朱', '高', '林', '何','马', '罗', '梁', '宋', '郭', '胡', '郭', '潘', '李', '谢', '邓', '曹', '程', '曾', '彭', '蔡', '梁', '田', '许','韩', '冯', '曹', '庄', '魏', '张', '石', '章', '叶', '董', '汪', '方', '于', '邹', '苏', '潘', '葛', '奚', '范','彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '贾', '严', '武', '庄', '邱', '卫', '蒋', '童', '颜', '郭','梅', '盛', '林', '翟', '石', '王'];const names = ['三', '四', '五', '六', '七', '八', '九', '十', '一', '二', '华', '明', '强', '超', '辉', '军', '涛','勇', '毅', '伟', '刚', '强', '军', '平', '杰', '峰', '雷', '磊', '新', '洋', '宇', '昊', '翔', '晓', '亮', '云','飞', '鹏', '浩', '波', '文', '轩', '东', '俊', '涵', '阳', '晨', '帆', '宇', '航', '建', '琪', '轩', '海', '立','智', '志', '弘', '博', '晨', '瑞', '凯', '子', '卓', '坤', '雄', '霖', '政', '晗', '煜', '�'];let getRandomItem = (arr) => arr[Math.floor(Math.random() * arr.length)];let randomNames = [];for (let i = 0; i < 299; i++) {let surname = getRandomItem(surnames);let name = getRandomItem(names);randomNames.push({"name": surname + name});}return randomNames;}this.arr = getRandomName();this.arr.forEach(item => {let firstLetter = this.getFirstLetter(item.name);if (!result[firstLetter]) {result[firstLetter] = [];}result[firstLetter].push(item);});let allLetters = 'abcdefghijklmnopqrstuvwxyz'.split('');let groupedArray = allLetters.map(letter => result[letter] || []);return groupedArray;}},methods: {getFirstLetter(str) {// 将中文姓名转换为拼音并取首字母return Pinyin.getCamelChars(str).charAt(0).toLowerCase();},startLongPress(e) {// 鼠标按下(开始监听全局的鼠标滚动)this.FatherDivHeight = e.currentTarget.offsetTop // 获取当前字母容器距离顶部的距离// 添加全局事件监听器document.addEventListener('mousemove', this.handleScroll);},stopLongPress() {// 移除全局事件监听器(鼠标抬起移除全局的鼠标移动事件)document.removeEventListener('mousemove', this.handleScroll);},handleClick(event) {// 点击滚动实现// 获取当前滚动的y坐标// console.log(event.y);// 获取当前字母列表每个字母的高度// console.log(this.EleHeight);// 计算当前字母索引let index = Math.ceil((event.detail.y - this.FatherDivHeight) / this.EleHeight) - 1;console.log(index);// 将当前索引赋值this.IndexItem = index// 将右侧列表滚动到相应位置scrollTo({left: 0, // 距离左侧距离top: this.$refs.indexcatch[index].offsetTop, //点击侧边栏的哪个索引就让右侧哪个索引对应的块滚动behavior: "smooth", // 点击滚动这里我用了平滑滚动,带动画的})},handleScroll(event) {// 获取当前滚动的y坐标// console.log(event.y);// 获取当前字母列表每个字母的高度// console.log(this.EleHeight);// 计算当前字母索引let index = Math.ceil((event.y - this.FatherDivHeight) / this.EleHeight) - 1;console.log(index);// 将当前字母索引赋值this.IndexItem = index// 将右侧列表滚动到相应位置scrollTo({left: 0,top: this.$refs.indexcatch[index].offsetTop, //点击侧边栏的哪个索引就让右侧哪个索引对应的块滚动behavior: "auto", // auto 瞬间滚动 无动画 smooth 平滑滚动带有动画效果})}}};
</script>

效果图
在这里插入图片描述
支持滑动和点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Notepad++使用SFTP连接虚拟机编辑文档

一.前言 当我们在虚拟机中使用vim编辑有时候不太方便&#xff0c;可以使用远程工具连接进行编辑。 常用的远程连接编辑方式有 vscode下载remote-ssh插件notepad下载nppftp插件finallshell中可以直接打开文件编辑xftp软件 根据个人习惯去选择使用即可。 这里分享一下notepa…

模型训练时报错Failed to allocate 12192768 bytes in function ‘cv::OutOfMemoryError‘

目录 报错信息&#xff1a; 查找网上解决方法&#xff1a; 改进思路&#xff1a; 改进方法&#xff1a; 报错信息&#xff1a; D:\Programs\miniconda3\envs\python311\python.exe D:\python\project\VisDrone2019-DET-MOT\train.py Ultralytics YOLOv8.1.9 &#x1f680…

【Linux】gdb的简单使用

文章目录 一、gdb是什么&#xff1f;二、使用说明1. 安装2. 注意事项3. 常用调试指令3.1 gdb3.2 l3.3 r3.4 n3.5 s3.6 b3.7 info b3.8 finish3.9 p3.10 set var3.11 c3.12 d breakpoints3.13 d n3.14 disable/enable breakpoints3.15 disable/enable n3.16 info b3.17 display …

复习python函数

复习python函数 1.对函数的理解函数的传递方式返回值 return可通过help()函数查看函数说明作用域 2.不定长参数3.递归4.高阶函数将函数作为参数传递将函数作为返回值返回 5.匿名函数6.装饰器 1.对函数的理解 函数可以用来保存一些可执行的代码&#xff0c;并且可以在需要时&am…

如何给word中的拼音加声调?分享3个方法

一&#xff0c;前言 在Word文档中标注拼音声调&#xff0c;是许多人在处理中文文档时经常需要面对的问题。对于不熟悉拼音的人来说&#xff0c;这可能会是一个挑战。但是&#xff0c;通过掌握一些简单的步骤和技巧&#xff0c;我们可以轻松地在Word文档中标注拼音声调。 二&a…

wsl2 中docker安装完毕后无法正常启动

wsl2 中docker安装完毕后无法正常启动 1、背景2、目标3、环境4、原因4、操作5.1、查看配置5.2、 切换配置5.3、启动docker5.4、验证docker 1、背景 在win10中安装wsl2体验linux操作系统&#xff0c;按照docker官网步骤安装&#xff0c;安装完毕后面提示 $ docker ps Cannot co…

云计算中的过度授权:安全隐患与应对策略

云计算凭借其弹性、可扩展等优势&#xff0c;已经成为诸多企业组织拓展业务的重要基础设施之一。然而&#xff0c;与传统IT架构相比&#xff0c;云计算环境的安全管理也面临着新的挑战。过度授权 (Overprivileging) 便是云安全领域亟待解决的主要问题之一&#xff0c;本文将带领…

为什么我的 Mac 运行缓慢以及如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

jasypt组件死锁bug案例分享

事故描述 1、上午9.55发布了一个Apollo动态配置参数&#xff1b; 2、片刻后&#xff0c;服务器接口开始出现大量的超时告警&#xff0c;似乎是某资源被耗尽不足分配&#xff1b; 3、正值业务请求高峰的上午十点&#xff08;平台上午10点会有一些活动会拉一波用户流量&#x…

HTML表单(详解网页表单如何实现)

目录 一、表单介绍 1.概念 二、表单用法 1.HTML表单 2.HTML 表单 - 输入元素 2.1.文本域&#xff08;Text Fields&#xff09; 2.2.密码字段 2.3.单选按钮&#xff08;Radio Buttons&#xff09; 2.4.复选框&#xff08;Checkboxes&#xff09; 2.5.提交按钮(Submit)…

人人都是开发者的时代,学编程还有用吗?

欢迎大家在 GitHub 上 Star 我们&#xff1a; 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

检查*.bib参考文献是否重复

安装bibtexparser pip install bibtexparser 代码 import bibtexparser from difflib import SequenceMatcherdef parse_bib_file(filename):with open(filename, r, encodingutf-8) as bibfile:bib_database bibtexparser.load(bibfile)return bib_database.entriesdef fi…

【电控笔记5.10】Luenberger估测器

Luenberger估测计 单积分器:pi控制器的补偿 双积分器:使用pid控制器的补偿 除了受控厂跟传感器,其他都在mcu 去掉Rs就是一个PLL锁相环 带宽比PLL更大

齐护K210系列教程(九)_## 播放音频文件wav

播放音频文件wav 播放音频只支持带喇叭的型号&#xff1a;AIstart_掌机、AIstart_Mini AIstart可以播放SD卡中的wav音频文件&#xff0c;在编写程序前请将文件准备好存放到SD卡内。 注&#xff1a;播放wav格式音频&#xff1a;wav格式的音频频率不能超过16KHZ。 1&#xff0…

ui生成代码详细教程

被askmanyai的图生代码技术秀到了&#xff01;前端开发效率&#xff0c;提升到秒级 完全吊打了阿里的图生代码技术&#xff01; 上传一张网站图片或者UI稿&#xff0c;然后用askmanyai生成实现这个网站的代码的教程来啦&#xff01; 在askmanyai的中文网站上一分钟就能实现&…

simulink使用俩种方式封装(mask)画板/子系统的步骤

文章目录 创建子系统创建封装编制封装以参数控件方式封装以代码方式封装 添加约束效果 对封装概念不熟的可以看simulink封装概述&#xff0c;这是我简化的。我还是推荐看官方帮助文档 创建子系统 搭建一个简易的加法模型 &#xff0c;创建子系统 创建封装 右键-》封装-》创建封…

spring @value @configurationProperties比较

今天项目中需要使用数组的方式 来加载一批 配置 yml: xxxx: - xxxxx - xsssss javaBean Value("${xxxxx.xxxxx}") private List<String> xxxs; 启动时候报错&#xff0c;无法加载&#xff0c;TM试验了1个小时&#xff0c;我一开始想到是格式的问题&#x…

VirtualFlow亮相核反应堆技术全国重点实验室2024学术年会

为加强先进核能技术领域科技创新与应用&#xff0c;核反应堆技术全国重点实验室及先进核能技术全国重点实验室2024年学术年会在四川成都启幕&#xff0c;9名院士和近百家科研院所、高校和企业等近700名专家学者齐聚一堂&#xff0c;聚焦和探讨核反应堆及先进核能重大基础理论和…

震惊!小红书矩阵账号管理-批量发布笔记

“小红书引流软件矩阵工具-笔记批量发” 昨天&#xff0c;有个粉丝急匆匆地来找我&#xff0c;一脸焦急地说&#xff1a;“大佬&#xff0c;我现在运营着好几个小红书账号&#xff0c;每天都要发布内容&#xff0c;可把我忙坏了&#xff0c;有没有什么高效的管理方法啊&#xf…

【学习笔记二十五】EWM PPF自动WT后台配置和前台展示

一、概述 SAP EWM(Extended Warehouse Management)模块中的PPF(Post Processing Framework)是一个用于执行通用功能和流程的工具。PPF为SAP EWM提供了一个统一的接口,用于触发各种动作,例如打印托盘标签、交货单、拣选票或发送消息和传真。这些动作在特定条件满足时生成,…