JS实现移动端按首字母检索城市列表附源码下载


Posted in Javascript onJuly 05, 2017

我们常见的手机通讯录或微信通讯录,联系人信息是按字母顺序排列的列表,通过点击右侧的字母,会迅速定位检索到首字母对应的联系人。那么我今天给大家介绍的是按首字母快速定位到城市列表,效果和通讯录一样的。

JS实现移动端按首字母检索城市列表附源码下载 查看演示 下载源码 准备

查看演示     下载源码

准备

首先我们需要用到全国的城市数据,这些城市数据来源于网络,我已经将数据格式化成JSON形式了,大家可以直接拿去用。

我们还需要用到一个叫better-scroll的滚动插件,它能帮我们将超长的页面原生的滚动条处理掉,优化滚动效果。

接着我们准备HTML结构。

<div class="city"> 
 <div class="city-wrapper city-wrapper-hook"> 
 <div class="scroller-hook"> 
 <div class="cities cities-hook"></div> 
 </div> 
 <div class="shortcut shortcut-hook"></div> 
 </div> 
</div>

.cities是用来装载城市数据列表的;.shortcut是用来装载首字母列表的,需要使用CSS将其定位在右边侧。

Javascript

写JS代码之前,先将城市数据city.js和better-scroll加载进来。

<script src="js/bscroll.min.js"> </script> 
<script src="js/city.js"> </script>

开始写js,先定义要用到的变量:

var cityWrapper = document.querySelector('.city-wrapper-hook'); 
var cityScroller = document.querySelector('.scroller-hook'); 
var cities = document.querySelector('.cities-hook'); 
var shortcut = document.querySelector('.shortcut-hook'); 
var scroll; 
var shortcutList = []; 
var anchorMap = {};

函数initCities()循环遍历city.js中的城市数据,提取其中的城市名称、首字母和id信息,一次性加入到数据列表中。接着调用BScroll插件方法。

function initCities() { 
 var y = 0; 
 var titleHeight = 28; 
 var itemHeight = 44; 
 var lists = ''; 
 var en = '<ul>'; 
 cityData.forEach(function (group) { 
 var name = group.name; 
 lists += '<div class="title">'+name+'</div>'; 
 lists += '<ul>'; 
 group.cities.forEach(function(g) { 
 lists += '<li class="item" data-name="'+ g.name +'" data-id="'+ g.cityid +'"><span class="border-1px name">'+ g.name +'</span></li>'; 
 }); 
 lists += '</ul>'; 
 var name = group.name.substr(0, 1); 
 en += '<li data-anchor="'+name+'" class="item">'+name+'</li>'; 
 var len = group.cities.length; 
 anchorMap[name] = y; 
 y -= titleHeight + len * itemHeight; 
 }); 
 en += '</ul>'; 
 cities.innerHTML = lists; 
 shortcut.innerHTML = en; 
 shortcut.style.top = (cityWrapper.clientHeight - shortcut.clientHeight) / 2 + 'px'; 
 scroll = new window.BScroll(cityWrapper, { 
 probeType: 3 //1 会截流,只有在滚动结束的时候派发一个 scroll 事件。2在手指 move 的时候也会实时派发 scroll 事件,不会截流。 3除了手指 move 的时候派发scroll事件,在 swipe(手指迅速滑动一小段距离)的情况下,列表会有一个长距离的滚动动画,这个滚动的动画过程中也会实时派发滚动事件 
 }); 
 scroll.scrollTo(0, 0); 
}

然后函数bindEvent()绑定事件,监听右侧首字母的touchstart和touchmove事件。

function bindEvent() { 
 var touch = {}; 
 var firstTouch; 
 shortcut.addEventListener('touchstart', function (e) { 
 var anchor = e.target.getAttribute('data-anchor'); 
 firstTouch = e.touches[0]; 
 touch.y1 = firstTouch.pageY; 
 touch.anchor = anchor; 
 scrollTo(anchor); 
 }); 
 shortcut.addEventListener('touchmove', function (e) { 
 firstTouch = e.touches[0]; 
 touch.y2 = firstTouch.pageY; 
 var anchorHeight = 16; 
 var delta = (touch.y2 - touch.y1) / anchorHeight | 0; 
 var anchor = shortcutList[shortcutList.indexOf(touch.anchor) + delta]; 
 scrollTo(anchor); 
 e.preventDefault(); 
 e.stopPropagation(); 
 }); 
 function scrollTo(anchor) { 
 var maxScrollY = cityWrapper.clientHeight - cityScroller.clientHeight; 
 var y = Math.min(0, Math.max(maxScrollY, anchorMap[anchor])); 
 if (typeof y !== 'undefined') { 
 scroll.scrollTo(0, y); 
 } 
 } 
}

最后调用执行两个函数。

initCities(); 
bindEvent();

现在使用手机或平板访问就可以看到效果了,如果你要实现的是通讯录效果,可以将联系人数据信息格式化成city.js中对应的json即可。

以上所述是小编给大家介绍的JS实现移动端按首字母检索城市列表,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
AngularJS iframe跨域打开内容时报错误的解决办法
Jan 26 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
JS中this上下文对象使用方式
Oct 09 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
js实现获取鼠标当前的位置
Dec 14 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
使用vue-resource进行数据交互的实例
Sep 02 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
Jun 26 Javascript
ES2020系列之空值合并运算符 '??'
Jul 22 Javascript
node.js基础知识汇总
Aug 25 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 #Javascript
webstorm添加vue.js支持的方法教程
Jul 05 #Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 #Javascript
vue router2.0二级路由的简单使用
Jul 05 #Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 #Javascript
AngularJS实现进度条功能示例
Jul 05 #Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 #Javascript
You might like
人大复印资料处理程序_输入篇
2006/10/09 PHP
实用函数2
2007/11/08 PHP
PHP Cookie学习笔记
2016/08/23 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
PHP实现的日历功能示例
2018/09/01 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
js的一些常用方法小结
2011/06/29 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
Tensorflow简单验证码识别应用
2017/05/25 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
浅析python redis的连接及相关操作
2019/11/07 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
大学毕业感言
2014/01/10 职场文书
承认错误的检讨书
2014/01/30 职场文书
个人自我剖析材料
2014/02/07 职场文书
个人典型事迹材料
2014/12/30 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
三下乡活动心得体会
2016/01/23 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js