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.mfbz.cn/a/573373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础--文件操作

目标 文件操作的作用文件的基本操作 打开读写关闭 文件备份文件和文件夹的操作 一. 文件操作的作用 思考&#xff1a;什么是文件&#xff1f; 思考&#xff1a;文件操作包含什么&#xff1f; 答&#xff1a;打开、关闭、读、写、复制… 思考&#xff1a;文件操作的的作用…

聚类分析字符串数组

聚类分析字符串数组 对多个字符串进行聚类分析旨在根据它们之间的相似度将这些字符串划分成若干个类别&#xff0c;使得同一类别内的字符串彼此相似度高&#xff0c;而不同类别间的字符串相似度低 小结 数据要清洗。清洗的足够准确&#xff0c;可能不需要用聚类分析了数据要…

45. 【Android教程】内容提供者 - Content Provider

本节学习最后一个 Android 组件——内容提供者。顾名思义&#xff0c;它可以用来给其他的 App 提供各种内容&#xff0c;比如 Android 自带的短信、联系人、日历等等都是一个普通的 App&#xff0c;当你需要这些内容的时候&#xff0c;就可以向它们的 Content Provider 发起请求…

C/C++ 入门(7)vector类(STL)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 请多多指教&#xff01; 目录 一、标准库中的vector 1、了解 2、vector常用接口 二、vector的实现 1、框架 2、构造、析构函数 3、操作函数 三 、问题 1、由于赋值而引起的浅拷贝 2、因为类没…

【linux】多路径|Multipath I/O 技术

目录 简略 详细 什么是多路径? Multipath安装与使用 安装 使用 Linux下multipath软件介绍 附录 配置文件说明 其他解 简略 略 详细 什么是多路径? 普通的电脑主机都是一个硬盘挂接到一个总线上&#xff0c;这里是一对一的关系。 而到了分布式环境&#xff0c;主机和存储网络连…

普冉PY32F071单片机简单介绍,QFN64 48封装,支持 8 * 36 / 4 * 40 LCD

PY32F071单片机是一款基于32 位 ARM Cortex - M0内核的微控制器&#xff0c;由普冉半导体推出。PY32F071可广泛应用于各种嵌入式系统中&#xff0c;包括消费类电子产品、工业自动化、医疗设备等领域。PY32F071系列单片机具有低功耗、高性能和丰富的外设接口等特点&#xff0c;适…

生物制药企业在选择文件摆渡平台时,最应该关注哪些功能?

生物制药是以数据为核心生产力的企业&#xff0c;数据的重要性体现在药物研发、生产优化、销售和市场营销、决策支持以及合规要求等多个方面。有效地管理和利用数据&#xff0c;对于提升企业的竞争力、降低风险、提高产品质量和满足市场需求具有重要意义。 为保护数据安全&…

KEITHLEY(吉时利)2440源测量单位(SMU)数字源表

KEITHLEY(吉时利&#xff09;2440源测量单位&#xff08;SMU)数字源表 主要特性 50W 时性能高达 5A / 40V0.012&#xff05; 基本测量精度&#xff0c;具有 6 位分辨率10pA / 100nV 测量分辨率与 KickStart 软件结合使用美国2440吉时利keithley数字源表特点 2400系列提供宽动…

亚信安慧AntDB:高效与稳定

亚信安慧AntDB正致力于验证数据库软硬件全自主可控的可行性&#xff0c;并将其应用于运营商核心的交易场景&#xff0c;以替代国外商业解决方案。为了实现这一目标&#xff0c;亚信安慧AntDB的研发团队不断进行技术创新和实践探索。 该数据库以自主研发的技术为基础&#xff0…

C语言 流程图与伪代码 缩减

本文 我们来说说流程图 伪代码和代码缩进 这些可以让我们在后面书写复杂逻辑时 不会感到 繁琐或逻辑混乱 流程图(Flowchart) 是用以算法、工作流或流程的一种框图表示&#xff0c;它以不同类型的框代表不同种类的步骤&#xff0c;每两个步骤之间则以箭头连接。 流程图是程序…

《飞吧龙骑士》新版本“龙神祭”盛大开启,引领骑士团战

热游圈消息&#xff1a;五一假期临近&#xff0c;备受瞩目的手游《飞吧龙骑士》迎来重大更新——“龙神祭”新版本正式开启。在此次更新中&#xff0c;首个蓄力炮UR龙——绮舞的巫女千代烬惊艳登场&#xff0c;为玩家们带来前所未有的燃情体验。同时&#xff0c;全新骑士团战玩…

当你看到一份更心仪的工作时,先冷静冷静,看看这篇文章

01 无法构建自己的城堡&#xff1f;那就挖一条护城河 人活一辈子&#xff0c;在职业生涯领域&#xff0c;你总得要搭建一座属于自己的城堡&#xff0c;否则拼死拼活&#xff0c;到最后你拿到一点蝇头小利&#xff0c;为别人做嫁衣。而当别人的梦想进行曲不需要你合奏或者伴奏时…

从现在开始:让AI写代码,你只负责敲tab键

如果你是一名程序员&#xff0c;你一定有过这样的经历&#xff1a;在编写代码的时候&#xff0c;突然遇到了一个棘手的问题&#xff0c;需要花费大量的时间去查找资料、尝试不同的解决方案&#xff0c;甚至有时候还需要去问同事或者在网上寻求帮助。这样的情况不仅会浪费你的时…

【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )

文章目录 4.最大子数组和4.1题目4.2解法一&#xff1a;暴力4.2.1暴力思路4.2.2代码实现 4.3解法二&#xff1a;贪心4.3.1贪心思路4.3.2代码实现 5.买卖股票的最佳时机||5.1题目5.2解法&#xff1a;贪心5.2.1贪心思路5.2.2代码实现 4.最大子数组和 4.1题目 给你一个整数数组 n…

Linux中DHCP原理与配置

目录 一.DHCP的原理 1.DHCP的简要概述 2.DHCP的优点 3.DHCP的分配方式 4.DHCP的租约过程 5.DHCP服务 6.可分配的地址信息主要包括 二.DHCP同一网段分配地址实验 windows命令 一.DHCP的原理 1.DHCP的简要概述 DHCP&#xff08;Dynamic Host Configuration Protocol&a…

讯鹏智慧公厕系统解决方案新升级,大不同!

在城市建设和公共服务不断发展的今天&#xff0c;公厕作为重要的基础设施&#xff0c;其质量和管理水平直接影响着人们的生活体验。然而&#xff0c;当前公厕普遍存在着一些问题&#xff0c;如卫生状况不佳、设施老化、管理不便等。为了解决这些问题&#xff0c;讯鹏智慧公厕系…

牛客NC209 最短无序连续子数组【中等 数组,双指针 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d17f4abd1d114617b51e951027be312e 思路 解题思路 1、方法1&#xff0c;排序对比&#xff1a;将数组按升序排序&#xff0c;然后与原数组对照&#xff0c;从哪里开始变化到哪里结束变化的数组就是答案。 2、 方…

图像处理技术与应用(二)

图像处理技术与应用入门 椒盐噪声 椒盐噪声&#xff0c;也称为脉冲噪声&#xff0c;是一种常见的数字图像噪声。它通常表现为图像中随机出现的白色&#xff08;椒&#xff09;或黑色&#xff08;盐&#xff09;像素点&#xff0c;这些像素点在图像上呈现为黑白杂点。椒盐噪声…

云计算革新:以太网 Scale-UP 网络为 GPU 加速赋能

谈谈基于以太网的GPU Scale-UP网络 Intel Gaudi-3 采用 RoCE 互联技术&#xff0c;促进了 Scale-UP 解决方案。业界专家 Jim Keller 倡导以太网替代 NVLink。Tenstorrent 成功应用以太网实现片上网络互联。RoCE 和以太网已成为互联解决方案的新兴趋势&#xff0c;为高性能计算提…

前端H5动态背景登录页面(下)

最近正好有点儿时间&#xff0c;把之前没整理完的前端动态背景登录页面给整理一下&#xff01;这是之前的连接前端H5动态背景登录页面&#xff08;上&#xff09;&#xff0c;这主要是两个登陆页面&#xff0c;一个彩色气泡&#xff0c;一个动态云朵&#xff0c;感兴趣的可以点…
最新文章