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 相关文章推荐
js replace正则表达式应用案例讲解
Jan 17 Javascript
js如何获取兄弟、父类等节点
Jan 06 Javascript
javascript定义变量时加var与不加var的区别
Dec 22 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
Apr 17 Javascript
javascript通过元素id和name直接取得元素的方法
Apr 28 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
javascript实现消灭星星小游戏简单版
Nov 15 Javascript
详解vue-cli之webpack3构建全面提速优化
Dec 25 Javascript
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
Nov 05 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
Mar 19 Javascript
vue中改变滚动条样式的方法
Mar 03 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 addslashes 函数详细分析说明
2009/06/23 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Python中url标签使用知识点总结
2020/01/16 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
大型车展策划方案
2014/02/01 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
客房服务员岗位职责
2015/02/09 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python