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 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
javascript中使用css需要注意的地方小结
Sep 01 Javascript
jquery实现Ctrl+Enter提交表单的方法
Jul 21 Javascript
基于jQuery实现点击弹出层实例代码
Jan 01 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
React Router基础使用
Jan 17 Javascript
JS FormData上传文件的设置方法
Jul 05 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 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中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
php判断linux下程序问题实例
2015/07/09 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
电话客服工作职责
2014/07/27 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书