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 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
prototype Element学习笔记(篇二)
Oct 26 Javascript
基于jQuery的history历史记录插件
Dec 11 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
Jun 09 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
jQuery的text()方法用法分析
Dec 20 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
Aug 10 Javascript
vue实现动态表格提交参数动态生成控件的操作
Nov 09 Javascript
javascript进阶篇深拷贝实现的四种方式
Jul 07 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
服务器web工具 php环境下
2010/12/29 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python实现备份文件实例
2014/09/16 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
金融管理毕业生求职信
2014/03/03 职场文书
植树节标语
2014/06/27 职场文书
公司委托书格式
2014/08/01 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
培养联系人考察意见
2015/06/01 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python