原生JS实现微信通讯录


Posted in Javascript onJune 18, 2020

最近工作当中再一次遇到要实现一个车辆列表,要求能够像微信通讯录一样,实现右侧滑动,点击功能,并且滑动过程中,能够有提示。原来用jquery实现过一次,为了精简代码,现在用原生的实现一次。想必工作中大家都能用上,所以就临时谢了一个小案例,分享给大家。本案例重在分享移动端的实现思路,代码和样式可能没有优化,大家见谅。

原本微信通讯录效果:

原生JS实现微信通讯录

本案例效果图:

原生JS实现微信通讯录

实际工作中可以实现类似于城市列表,产品字母排序这种需求:

原生JS实现微信通讯录

代码展示

Dom

Dom结构仅供参考,实际情况看自己需求,比如我现在工作当中使用的React框架,这个静态的dom结构肯定不适用,不过万变不离其宗,原理都是通过id实现的。

<!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">
 <script src="./js/flexible_css.js"></script>
 <script src="./js/flexible.js"></script>
 <link rel="stylesheet" href="css/index.css" rel="external nofollow" >
 <title>原生js仿照微信通讯录</title>
</head>

<body>
<!-- 右侧|字母列表 -->
<ul id="letters">
 <li class="letter-item">A</li>
 <li class="letter-item">B</li>
 <li class="letter-item">C</li>
 <li class="letter-item">D</li>
 <li class="letter-item">E</li>
 ...
</ul>
<!-- 人名单列表 -->
<div class="list-container">
 <dl id="namesList">
 <dt id='a'>A</dt>
 <dd>aaa</dd>
 <dd>aaa</dd>
 ...
 <dt id="b">B</dt>
 <dd>bbb</dd>
 <dd>bbb</dd>
 <dd>bbb</dd>
 ...
 <dt id="c">C</dt>
 <dd>cccc</dd>
 <dd>cccc</dd>
 <dd>cccc</dd>
 <dd>cccc</dd>
 ...
 <dt id="d">D</dt>
 <dd>dddd</dd>
 <dd>dddd</dd>
 <dd>dddd</dd>
 ...
 </dl>
</div>
<!--提示字母框-->
<div class="tip">A</div>
</body>

</html>

css

#letters {
 width: 0.3rem;
 position: fixed; //固定定位很关键,一般右侧都是固定的
 right: 0.2rem;
 top: 50%;
 z-index: 999;
 -webkit-transform: translateY(-50%);
 -moz-transform: translateY(-50%);
 -ms-transform: translateY(-50%);
 -o-transform: translateY(-50%);
 transform: translateY(-50%);
 color: #B2B2B2;
 -webkit-border-radius: 0.1rem;
 -moz-border-radius: 0.1rem;
 border-radius: 0.1rem;
 background-color: #efefef; }
 #letters li {
 background-color: #efefef;
 display: block;
 text-align: center;
 width: 0.4rem;
 height: 0.4rem;
 line-height: 0.4rem;
 font-size: 0.3rem;
 text-align: center; }

.list-container #namesList dt {
 font-size: 0.65rem;
 background-image: linear-gradient(-90deg, #ffffff 0%, #F1F3F6 100%);
 padding-left: 0.2rem; }
.list-container #namesList dd {
 padding-left: 0.2rem;
 line-height: 0.8rem;
 font-size: 0.46rem; }

.tip {
 width: 1rem;
 height: 1rem;
 line-height: 1rem;
 text-align: center;
 position: fixed;
 margin: 0 auto;
 z-index: 999;
 left: 50%;
 top: 50%;
 -webkit-transform: translate(-50%, -50%);
 -moz-transform: translate(-50%, -50%);
 -ms-transform: translate(-50%, -50%);
 -o-transform: translate(-50%, -50%);
 transform: translate(-50%, -50%);
 background-color: rgba(0, 0, 0, 0.38);
 -webkit-border-radius: 0.2rem;
 -moz-border-radius: 0.2rem;
 border-radius: 0.2rem;
 font-size: 0.6rem;
 color: #ffffff;
 display: none; }

JS

这里的点击跳转并没有用a标签的跳转实现,而是使用了 element.scrollIntoView() 的方式实现,这样可以有效的避免点击后url上添加#的尴尬。

<script>
 let tipDom = document.querySelector(".tip")
 // 获取右侧字母DOM
 let letterDom = document.querySelector("#letters")

 // 右侧字母触摸判断逻辑
 letterDom.addEventListener('touchmove', function (e) {
 e.preventDefault()
 //坐标(获取当前触控点的坐标)
 let y = e.touches[0].clientY
 let x = e.touches[0].clientX
 //根据当前纵向坐标控制内容的位置
 let MaxL = letterDom.getBoundingClientRect().left;
 let MaxR = letterDom.getBoundingClientRect().right;
 let MaxT = letterDom.getBoundingClientRect().top
 let MaxB = letterDom.getBoundingClientRect().top + letterDom.getBoundingClientRect().height;
 // 判断是否从一个字母到另一个字母
 if ((x >= MaxL && x <= MaxR) && (y >= MaxT && y <= MaxB) && x && y) {
 let ele = document.elementFromPoint(x, y)
 let eleContent = ele.innerHTML
 clickLetter(eleContent)
 tipDom.innerHTML = eleContent
 tipDom.style.display = 'block'
 letterDom.style.background = "#B2B2B2"
 letterDom.style.color = "#fff"
 }
 letterDom.removeEventListener("touchend", this, false)
 })

 letterDom.addEventListener("touchend", function (e) {
 tipDom.style.display = "none"
 letterDom.style.background = ""
 letterDom.style.color = "#B2B2B2"
 letterDom.removeEventListener("touchmove", this, false)
 })

 let letterDoms = document.querySelectorAll('#letters>.letter-item')

 for (let i = 0; i < letterDoms.length; i++) {
 const letterDom = letterDoms[i];
 let letterTmp = letterDom.innerHTML
 letterDom.addEventListener('click',function () {
 clickLetter(letterTmp)
 })
 }

 // 右侧字母点击事件
 function clickLetter(letter) {
 let tmpLetter = letter.toLowerCase()
 let element = window.document.getElementById(tmpLetter)
 element.scrollIntoView()
 }

</script>

详细源码GitHub地址:WeChatAddressList

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于文本框的一些限制控制总结~~
Apr 15 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
Apr 27 Javascript
原生javascript实现的分页插件pagenav
Aug 28 Javascript
JS回调函数的应用简单实例
Sep 17 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
javascript小数精度丢失的完美解决方法
May 31 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
Nov 22 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
Jun 19 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
Dec 09 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
Dec 26 Javascript
vue+element-ui表格封装tag标签使用插槽
Jun 18 #Javascript
js实现ajax的用户简单登入功能
Jun 18 #Javascript
JS实现躲避粒子小游戏
Jun 18 #Javascript
html-webpack-plugin修改页面的title的方法
Jun 18 #Javascript
vue实现购物车结算功能
Jun 18 #Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 #Javascript
javascript实现文字跑马灯效果
Jun 18 #Javascript
You might like
php Calender(日历)代码分享
2014/01/03 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
描述RIP和OSPF区别以及特点
2015/01/17 面试题
历史专业毕业生的自我鉴定
2013/11/15 职场文书
大学生村官事迹材料
2014/01/21 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
邀请函的格式
2015/01/30 职场文书
施工员岗位职责
2015/02/10 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
TypeScript 内置高级类型编程示例
2022/09/23 Javascript