手把手教你用js实现手机通讯录功能(附源码)

news2024/11/25 12:41:51

js实现手机通讯录

  • 效果图
  • 需求
    • 需求一:锚点
      • 通过#id配合a标签使用
      • css中scroll-behavior属性的使用
    • 需求二+需求三
      • 获取汉字拼音的首字母
        • 方法1:使用插件,这里推荐pinyin-pro
        • 方法2:使用unicode
      • 去重数组中冗余的对象
        • 法一:用Map去重
        • 法二:用双层for循环配合splice使用
    • 代码实现
      • Html,css
        • js需要引入的工具代码

效果图

实现


需求

手机通讯录这样的功能在很多场景下都是可以见到的,多出现再移动端,它通常有以下特点:

  1. 锚点 ,点击右侧的英文字母,会跳转到相应的区块,并且在此过程,页面不刷新;
  2. 智能识别左侧的地名,或者人名。在相应首字母不存在的情况下,不会出现相应的首字母列表,比如下图,没有字母E,F对应的人名或则地名,则不显示E,F空列表

这里是引用

  1. 数据流精准定位可以随意添加数据,自动根据人名或者地名汉语拼音的第一个首字母来准确定位,并将当前人名或地名精准存放在相应的字母列表当中;

需求一:锚点

锚点是css里一个非常神奇的功能,实现这样的功能,我一般注意两点,基本就完美了。

通过#id配合a标签使用

  <nav>
      <a href="#1">1</a>
      <a href="#2">2</a>
      <a href="#3">3</a>
      <a href="#4">4</a>
      <a href="#5">5</a>
  </nav>
  <div>
    <div id="1">1</div>
    <div id="2">2</div>
    <div id="3">3</div>
    <div id="4">4</div>
    <div id="5">5</div>
  </div>

这一看就明白,a标签用于右侧字母导航栏。a标签里href的属性值,用#id表示,分别与左侧列表里的div的id名字一一对应,即可实现点击跳转,这一特点也叫锚点,css里真是太高级了。


css中scroll-behavior属性的使用

使用这个属性,可以让你的锚点跳转看起来更加丝滑

:root{
		font-size: 2rem;
		scroll-behavior: smooth;
	}

MDN官网是这样介绍的:

当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,CSS 属性 scroll-behavior 为一个滚动框指定滚动行为,其他任何的滚动,例如那些由于用户行为而产生的滚动,不受这个属性的影响。在根元素中指定这个属性时,它反而适用于视窗。

/* Keyword values */
scroll-behavior: auto;
scroll-behavior: smooth;

/* Global values */
scroll-behavior: inherit;
scroll-behavior: initial;
scroll-behavior: unset;

换句话说,如果不使用这个属性,那么在锚点跳转过程中,会突然跳转到相应位置,非常生硬,用户体验感比较差。
如果使用这个属性,在锚点跳转过程中,会有过渡效果。使得整个过程看起来更加合理,丝滑。


需求二+需求三

先分析这这两个需求应该如何实现?
智能识别,以及数据流精准定位

1. 先获取地名或者人名汉字拼音的第一个汉字的首字母
2. 将此首字母打印,没有问题,然后将其放在一个变量里
3. 准备26个英文字母,将这个字符串分割成26个元素,然后遍历一下这个数组。
4. 遍历第一个汉字拼音的首字母
5. 再拿26个字母 与 第一个汉字拼音的首字母比较
6. 如果两个字母相同,将第一个汉字拼音的首字母 对应的地名 放入一个新数组
7. 做个判断。当某个首字母对应的汉字为空,则不渲染这个字母列表
8. 如果数组中的对象有重复,调用去重函数
9. 输出

分析

难点1:这里面循环判断输出都没有什么难以实现的,难度不大。难的是如何将汉字转化为拼音,并获取到拼音的首字母
难点2:如果出现重复,怎么去重?
难点3:有没有别的方式优化程序,可以跳过去重


获取汉字拼音的首字母

方法有二:

方法1:使用插件,这里推荐pinyin-pro

 <script src="https://unpkg.com/pinyin-pro@3.12.0/dist/index.js"></script>

这是一款具有非常强大的汉字转换方法的插件,用路径在线引入即可使用。并且pinyin-pro 支持各种浏览器以及 Nodejs 环境运行。

方法2:使用unicode

unicode这是一种文字编码标准,是以\u6211\u559c\u6b22\u4f60等形式出现的

eg:
\u6211\u559c\u6b22\u4f60 == 我喜欢你
\u6211\u7231\u4f60 == 我爱你
\u4f60\u597d\u5e05\u554a == 你好帅啊
\u6211\u6211\u559c\u6b22\u5403\u70b8\u9171\u9762 == 我喜欢吃炸酱面

这就是uniode,我个人更喜欢用第二种方式。将文字编码打包成一个文件,需要的时候随时本地调用即可,非常安全。


去重数组中冗余的对象

这里推荐两种去重方法

法一:用Map去重

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
 
</body>
</html>
<script>
	 let obj = [{ name: "米面", id: 1 },
				{ name: "牛肉", id: 2 },
				{ name: "蔬菜", id: 3 },
				{ name: "水果", id: 3 },
				{ name: "饮料", id: 1 },
				{ name: "咖啡", id: 4 },
				{ name: "茶叶", id: 3 }];

			const map = new Map();
			const newArr = obj.filter(csdn => !map.has(csdn.id) && map.set(csdn.id, 1));
			console.log(newArr);
</script>

输出结果:
在这里插入图片描述

法二:用双层for循环配合splice使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
 
</body>
</html>
<script>
	 let obj = [{ name: "米面", id: 1 },
				{ name: "牛肉", id: 2 },
				{ name: "蔬菜", id: 3 },
				{ name: "水果", id: 3 },
				{ name: "饮料", id: 1 },
				{ name: "咖啡", id: 4 },
				{ name: "茶叶", id: 3 }];


	function fn1(tempArr) {
	    for (let i = 0; i < tempArr.length; i++) {
	        for (let j = i + 1; j < tempArr.length; j++) {
	            if (tempArr[i].id == tempArr[j].id) {
	                tempArr.splice(j, 1);
	                j--;
	            };
	        };
	    };
	    return tempArr;
	};
	console.log(fn1(obj));
</script>

输出结果:
在这里插入图片描述

两种去重方法,得到的结果是一模一样的。而这就是两个打包好的方法,可以复制后,直接调用。
我个人更喜欢用第二种方法,因为用双层for循环配合splice去重的方法,是最不耗费性能的。虽然结构复杂,让人看的恶心,但毕竟“省钱”。

代码实现

按照分析的思路去执行即可,怎么想就怎么做
程序如人生

Html,css

<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			:root{font-size: 2rem;scroll-behavior: smooth;}
			#right>a {display: block;text-decoration: none;color: black;text-align: center;}
			#right {position: fixed;right: 0.2rem;top: 1vh;font-size: .7rem;display: flex;flex-wrap: wrap;
			align-items: center;width: .5rem;padding: 0% 1rem;text-align: center;height: 100vh;background-color: greenyellow;overflow-y: scroll;}
			#list p {background: -webkit-linear-gradient(left, #2b80ff, #8098aa);}
			#list {height: 500vh;font-size: 2rem;}
		</style>
	</head>
	<body>
		<div id="list">
			<!-- <p>A</p>
			<span></span>
			<span></span>
			<p>B</p>
			<span></span>
			<span></span> -->
		</div>
		<div onclick="data()" id="kl" style="display: block;position: absolute;top: 0%;+6">
			<button>来吧,展示</button>
		</div>
		<div id="right">
			<a href="#A">A</a><a href="#B">B</a><a href="#C">C</a><a href="#D">D</a><a href="#E">E</a><a href="#F">F</a>
			<a href="#G">G</a><a href="#H">H</a><a href="#I">I</a><a href="#J">J</a><a href="#K">K</a><a href="#L">L</a>
			<a href="#M">M</a><a href="#N">N</a><a href="#O">O</a><a href="#P">P</a><a href="#Q">Q</a><a href="#R">R</a>
			<a href="#S">S</a><a href="#T">T</a><a href="#U">U</a><a href="#V">V</a><a href="#W">W</a><a href="#X">X</a>
			<a href="#Y">Y</a><a href="#Z">Z</a>
		</div>
	</body>
<html>

js需要引入的工具代码

	<script src="./data.js"></script>			//人名,地名的假数据
	<script src="./unicode.js"></script>		//汉字转换拼音的打包文件,含有编码和方法
	<script src="./jquery-3.6.1.js"></script>	//引入jquery文件,方便简化代码

这三个文件比较大,我放在资源里了,可以免费下载,希望对大家有帮助
其次还需要一个实现功能的js文件
注释也是必不可少的

	<script>
		// ----------数组中相同对象去重,选择两层for循环配合splice使用
		// function deWeight(arr) {
		// 	for (var i = 0; i < arr.length - 1; i++) {
		// 		for (var j = i + 1; j < arr.length; j++) {
		// 			if (arr[i].one == arr[j].one) {
		// 				arr.splice(j, 1);
		// 				j--;
		// 			}
		// 		}
		// 	}
		// 	return arr;
		// }
		//---------------------

		function data() {
			document.querySelector('#kl').style.display = 'none'
			// --------把地名拼音第一个首字母放到a数组里
			let a = [];
			for (let j = 0; j < arrs.length; j++) {
				var chinaName = arrs[j].name;
				var easyName = pinyin.getCamelChars(chinaName);
				// console.log(easyName);
				// console.log(easyName); //每个地名拼音的首字母缩写	
				a.push(easyName[0]) //第一个汉字拼音的首字母
			}

			//------------
			// let obj = {}
			let add = [];
			//-----------遍历一下26个字母,
			let strarr = 'ABCDEFGHIJKLMNOPQRSTUVWSYZ'.split('');
			for (let i = 0; i < strarr.length; i++) {
				//-------------
				//----------遍历第一个汉字拼音的首字母
				let names = [];
				for (let j = 0; j < a.length; j++) {
					//----------
					//----------26个字母  与  第一个汉字拼音的首字母比较
					if (strarr[i] == a[j]) {
						//----------如果两个字母相同,将第一个汉字拼音的首字母   对应的地名  放入数组names		eg:B 北京   B北海道      names= [北京,北海道]
						names.push(arrs[j].name)
						//----------
						console.log(names);
					}
					//----------
				}

				if (names.length != 0) {
					//----------B == 北京   				  one:B two:[北京,北海道]			B == 北海道	  		one:B  two:[北京,北海道]
					let obj = {
						one: strarr[i],
						two: names
					}
					//----------
					//----------将对象放入数组
					add.push(obj)
					// console.log(add);
					//----------
				}
			}
			console.log(add);
			//----------
			//----------调用去重函数,将数组里重复的对象去除
			// deWeight(add);
			//----------
			//----------输出
			let str = '';
			for (let i = 0; i < add.length; i++) {
				str += `<p id = ${add[i].one}>${add[i].one}</p><span>${add[i].two.join('<br/>')}</span>`
			}
			$("#list").html(str)
			//----------
		}
		// data()
	</script>

创作不易,如果对你有帮助,请三连支持。
在这里插入图片描述

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

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

相关文章

abap MODIFY常用语法解析

MODIFY 是既可以操作数据又可以操作内表的一个语法, 实现的逻辑都一样. 如果你内表或数据库中存在该行数据会对该行数据进行更新. 如果不存在,就会插入数据. , 1.如果it_tab是带有标题行的内表,是可以忽略FROM wa_tab工作区的 MODIFY it_tab .2.把工作区wa_tab中的数据更新…

中高级前端面试宝典之浏览器篇

中高级前端面试宝典 作为一名前端开发工程师&#xff0c;要掌握的知识点是多而杂的&#xff0c;在面试刷题阶段&#xff0c;经常没头没脑的&#xff0c;我将面试题系统化&#xff0c;分了好几个系列&#xff0c;祝愿大家&#xff08;包括我&#xff09;在这个疫情刚过去的互联网…

高通平台开发系列讲解(摄像头篇)QCM6490 上摄像头驱动开发

文章目录 一、Camera 硬件简介二、内核驱动移植2.1、确定设备树2.2、增加 camera 节点2.3、配置相关 GPIO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 qcm6490 摄像头驱动开发。 一、Camera 硬件简介 摄像头连接器一般会包含 Mipi 信号、mclk、供电、re…

从业者必读,一篇文章轻松掌握DevOps核心概念和最佳技能实践!

文章目录前言一. DevOps的定义及由来二. DevOps的价值三. devops工具有哪些3.1 devops工程师的硬实力3.2 devops工程师的软实力总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是对DevOps的总结&#xff0c;一篇文章告诉你什么是DevOps. 对很多…

Windows+CLion+Opencv+NCNN笔记

一、下载protobuf和ncnn在腾讯优图的github上下载ncnn&#xff0c;下载链接为https://github.com/Tencent/ncnn。在安装NCNN之前需要编译安装protobuf&#xff0c;protobuf3.4.0下载链接为https://github.com/google/protobuf/archive/v3.4.0.zip。下载后解压&#xff0c;将ncn…

什么是决策能力?HR人才测评

什么是决策能力&#xff1f;决策能力是一项多种能力的综合&#xff0c;指的是能够认识、理解、并且综合分析后得出判断&#xff0c;从而采取行动的能力。如&#xff1a;对当前形势的分析&#xff0c;对相关人员的判断&#xff0c;能做出合理的&#xff0c;适当的行动来应对。决…

【MyBatis】篇一.

文章目录1、MyBatis概述2、环境搭建1、MyBatis概述 认识&#xff1a; JavaEE开发的一个套件SSM&#xff0c;即&#xff1a; MyBatis是一个持久层的框架&#xff0c;是对JDBC的一个封装&#xff0c;是一个半自动的ORM框架。 ORM即实体类对象和数据库中的数据的一个映射关系&am…

关于Facebook Messenger CRM,这里有你想要知道的一切

关于Facebook Messenger CRM&#xff0c;这里有你想要知道的一切&#xff01;想把Facebook Messenger与你的CRM整合起来吗&#xff1f;这篇博文是为你准备的! 我们将介绍有关获得Facebook Messenger CRM整合的一切信息。然后&#xff0c;我们将解释为什么你需要像SaleSmartly&a…

Git使用:常用命令汇总

前言 Git对于程序猿来说并不陌生&#xff0c;它是一款非常好用的项目管理工具&#xff0c;无论是前端开发还是后台开发&#xff0c;只要项目里面可以使用Git来管理&#xff0c;就会涉及代码的提交和合并操作&#xff0c;主要是常用的Git操作命令的使用&#xff0c;虽然目前有好…

CA-SSL:用于检测和分割未知类的半监督学习

论文作者 | Lu Qi, Jason Kuen , Zhe Lin, and etal论文来源 | CVPR2022文章解读 | William1、摘要为了提高检测/分割的性能&#xff0c;现有的自监督和半监督方法从未标记的数据中提取任务相关或任务特定的训练标签&#xff0c;但这两种方法对于任务性能都是次优的&#xff0c…

【JeecgBoot-Vue3】第1节 源码下载和环境安装与启动

目录 一. 资料 1. 源码下载 2. 官网启动文档 二、 前端开发环境安装 2.1 开发工具 2.2 前后端代码下载 2.3 前端启动 Step 1&#xff1a;安装nodejs npm Step 2&#xff1a;配置国内镜像&#xff08;这里选阿里&#xff09; Step 3&#xff1a;安装yarn Step 4&…

python的 ping 网络状态监测方法(含多IP)

ping 基本概念 ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令&#xff0c; 主要是向特定的目的主机发送 ICMP&#xff08;Internet Control Messag…

九、Bean的循环依赖问题

1 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 2 singleton下的set注入产生的循环依赖 丈夫类 pac…

RabbitMQ的使用

1.初识MQ1.1.同步和异步通讯微服务间通讯有同步和异步两种方式&#xff1a;同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不…

Python3,好看的外(shen)表(cai)千篇一律,炫彩的日志万里挑一。

炫彩日志输出1、引言2、代码实战2.1 库介绍2.2 库安装2.3 代码示例2.3.1 demo2.3.2 实战3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 我今天被炫到了。 小鱼&#xff1a;怎么了&#xff0c;你还能被旋到了&#xff1f; 小屌丝对啊&#xff0c; 被炫到了&#xff0c;很…

python SDK打包

什么是SDK 先放一段专业性的文字来解释&#xff1a; SDK即“软体开发工具包”&#xff0c;一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。通俗点是指由第三方服务商提供的实现软件产品某项功能的工具包。 开发者不…

【PyTorch】教程:torch.nn.ELU

torch.nn.ELU CLASS torch.nn.ELU(alpha1.0, inplaceFalse) paper: Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). 参数 alpha ([float]) – α\alphaα 默认为1.0inplace ([bool] ) – 内部做, 默认为 False ELU 定义 ELU(x){x,if x>0α…

与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈

调研&#xff1a;李进宝 陈元新 撰写&#xff1a;李进宝 陈元新 随着数字化转型持续深入&#xff0c;国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据&#xff0c;以可视化流程图还原企业实际发生的业务流程&#xff0c;进而评估流程运行状况、诊断流程运…

Spring 6 and JUnit 5 组合

Spring 6 and JUnit 5 组合 Spring 6 and JUnit 5 只需引入相关的包&#xff0c;不过偶尔可能会出现 no tests were found&#xff0c;最后有解决方案。 引入相关依赖包 <dependencies><dependency><groupId>jakarta.annotation</groupId><artif…

边界无限入选首届“网络安全高成长性企业”并荣获“勇创之星”

近日&#xff0c;由工业和信息化部、四川省人民政府主办的“2023年中国网络和数据安全产业高峰论坛网络安全产融合作分论坛”在成都举行&#xff0c;论坛上公布了“2022年度网络安全高成长性企业”名单。云原生安全、应用安全“灵动智御”理念创领者北京边界无限科技有限公司&a…