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 相关文章推荐
基于JQuery 选择器使用说明介绍
Apr 18 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
Jan 18 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
Jul 21 Javascript
详解js的事件代理(委托)
Dec 22 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 Javascript
vue语法自动转typescript(解放双手)
Sep 18 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
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
纯php生成随机密码
2015/10/30 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
PowerBI和Python关于数据分析的对比
2019/07/11 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
wxPython实现分隔窗口
2019/11/19 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
教师岗位职责
2013/11/17 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
担保书范本
2015/01/20 职场文书
监考失职检讨书
2015/01/26 职场文书
教师个人年度总结
2015/02/11 职场文书
员工考勤管理制度
2015/08/06 职场文书
导游词之天下银坑景区
2019/11/21 职场文书