JS實(shí)現(xiàn)移動(dòng)端按首字母檢索城市列表附源碼下載
我們常見的手機(jī)通訊錄或微信通訊錄,聯(lián)系人信息是按字母順序排列的列表,通過點(diǎn)擊右側(cè)的字母,會(huì)迅速定位檢索到首字母對(duì)應(yīng)的聯(lián)系人。那么我今天給大家介紹的是按首字母快速定位到城市列表,效果和通訊錄一樣的。
查看演示 下載源碼 準(zhǔn)備
準(zhǔn)備
首先我們需要用到全國的城市數(shù)據(jù),這些城市數(shù)據(jù)來源于網(wǎng)絡(luò),我已經(jīng)將數(shù)據(jù)格式化成JSON形式了,大家可以直接拿去用。
我們還需要用到一個(gè)叫better-scroll的滾動(dòng)插件,它能幫我們將超長的頁面原生的滾動(dòng)條處理掉,優(yōu)化滾動(dòng)效果。
接著我們準(zhǔn)備HTML結(jié)構(gòu)。
<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是用來裝載城市數(shù)據(jù)列表的;.shortcut是用來裝載首字母列表的,需要使用CSS將其定位在右邊側(cè)。
Javascript
寫JS代碼之前,先將城市數(shù)據(jù)city.js和better-scroll加載進(jìn)來。
<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 = {};
函數(shù)initCities()循環(huán)遍歷city.js中的城市數(shù)據(jù),提取其中的城市名稱、首字母和id信息,一次性加入到數(shù)據(jù)列表中。接著調(diào)用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 會(huì)截流,只有在滾動(dòng)結(jié)束的時(shí)候派發(fā)一個(gè) scroll 事件。2在手指 move 的時(shí)候也會(huì)實(shí)時(shí)派發(fā) scroll 事件,不會(huì)截流。 3除了手指 move 的時(shí)候派發(fā)scroll事件,在 swipe(手指迅速滑動(dòng)一小段距離)的情況下,列表會(huì)有一個(gè)長距離的滾動(dòng)動(dòng)畫,這個(gè)滾動(dòng)的動(dòng)畫過程中也會(huì)實(shí)時(shí)派發(fā)滾動(dòng)事件
});
scroll.scrollTo(0, 0);
}
然后函數(shù)bindEvent()綁定事件,監(jiān)聽右側(cè)首字母的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);
}
}
}
最后調(diào)用執(zhí)行兩個(gè)函數(shù)。
initCities(); bindEvent();
現(xiàn)在使用手機(jī)或平板訪問就可以看到效果了,如果你要實(shí)現(xiàn)的是通訊錄效果,可以將聯(lián)系人數(shù)據(jù)信息格式化成city.js中對(duì)應(yīng)的json即可。
以上所述是小編給大家介紹的JS實(shí)現(xiàn)移動(dòng)端按首字母檢索城市列表,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象的方法
這篇文章主要介紹了 JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象,下面文章主要分析了兩中方法,分別是從 QML 字符串創(chuàng)建對(duì)象和動(dòng)態(tài)創(chuàng)建組件以及刪除對(duì)象等方法,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12
微信小程序開發(fā)之tabbar圖標(biāo)和顏色的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序開發(fā)之tabbar圖標(biāo)和顏色的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
JavaScript實(shí)現(xiàn)隨機(jī)五位數(shù)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)五位數(shù)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
微信小程序利用button控制條件標(biāo)簽的變量問題
這篇文章主要介紹了微信小程序利用button控制條件標(biāo)簽的變量問題,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-03-03

