類似ios select下拉選擇框的實現
阿新 • • 發佈:2018-12-29
select下拉選擇標籤在移動端是很常用的,但是不同的瀏覽器展示的效果都不一樣,其中iOS中的效果還是令人比較滿意的,所以產品設計往往給出這樣的一種設計。。百度中這種外掛也比較多,比較複雜,最近整理了一下。
實現效果:
原理:
1。定義每行的高度是40px,在touchend實踐出發時,計算出當前div的scrollTop.判斷是否已經滑動結束。如果滑動結束,四捨五入算出當前的高度距離第幾個最近,則設定div的scrolltop.如果滑動未結束。計算當前的scrollTop,與100毫秒之後的scrollTop值是否相等。
以下是原始碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>活動</title>
<style>
* {
margin: 0;
padding : 0;
}
.bottom {
border-top: 1px solid #959899;
position: fixed;
bottom: 0px;
left: 0px;
width: 100%;
padding-top: 40px;
}
.slide {
height: 40px;
overflow: scroll;
position : relative;
padding: 80px 0;
float: left;
left: 15px
}
.item {
padding: 0 10px;
}
.slide2 {
height: 40px;
overflow: scroll;
position: relative;
padding: 80px 0;
float: right;
right: 15px;
}
.centerDiv {
border-top: 1px solid #c5c5c5;
border-bottom: 1px solid #c5c5c5;
position: fixed;
bottom: 80px;
width: 100%;
height: 40px;
z-index: 1;
font-size:16px;
}
.main {
background-color: #e2e2e2;
line-height: 40px;
text-align: center;
z-index: 1;
position: relative;
}
.head {
line-height: 40px;
text-align: right;
color: #007bf5;
position: absolute;
right: 10px;
top: 0px;
z-index: 2;
background-color: white;
}
</style>
</head>
<body>
<div class="bottom">
<div class="head" onclick="hideDiv()">完成</div>
<div id="mainSlide">
<div class="main">
<div class="slide">
</div>
<div class="slide2">
</div>
<div style="clear: both;"></div>
</div>
<div class="centerDiv"></div>
</div>
</div>
</body>
<script src="../js/jquery.min.js"></script>
<script src="../js/base.js"></script>
<script>
var listData = {};
function init() {
ajaxPost({}, "sqyc/cityList.api", function (data) {
var list = data.cityList;
for (var k in list) {
$("<div class='item'/>").text(list[k].cityName).appendTo($(".slide"));
}
touchStart();
var event = document.createEvent('Events');
event.initEvent('touchend', true, true);
document.getElementById("mainSlide").dispatchEvent(event);
})
}
init();
var index = 0;
var startx = 0, starty = 0, endx = 0, endy = 0, direction = 1;
function touchStart() {
document.getElementById("mainSlide").addEventListener("touchstart", function (event) {
startx = event.touches[0].clientX;
starty = event.touches[0].clientY;
}, false);
document.getElementById("mainSlide").addEventListener("touchmove", function (event) {
}, false);
document.getElementById("mainSlide").addEventListener("touchend", function (event) {
event.preventDefault();
var height = $(".slide").scrollTop();
if (startx < $(".slide").width()) {
isEnd(height, function () {
$(".slide2").children().remove();
var str = $(".slide .item:eq(" + (endIndex - 1) + ")").text();
if (!listData[str])
ajaxPost({cityName: str}, "sqyc/cityAirport.api", function (data) {
var list = data.airportList.airports;
listData[str] = list;
for (var k in list) {
$("<div class='item'>").text(list[k].airportName).attr({
"lng":"",
"lat":""
}).appendTo($(".slide2"));
}
})
else {
var list = listData[str];
for (var k in list) {
$("<div class='item'>").text(list[k].airportName).appendTo($(".slide2"));
}
}
}, "slide");
}
else {
var height1 = $(".slide2").scrollTop();
isEnd(height1, function(){
$(".slide2 .item:eq(" + (endIndex - 1) + ")").text();
}, "slide2");
}
}, false);
}
var endIndex = 0;
function isEnd(height, endFun, className) {
setTimeout(function () {
var height1 = $("." + className).scrollTop();
if (height == height1) {
var n = parseInt((height + 60) / 40);
$("." + className).animate({
scrollTop: 40 * n - 40
}, 10);
endIndex = n;
if (endFun)
setTimeout(function () {
endFun();
}, 10)
} else {
isEnd(height1, endFun, className);
}
}, 50);
}
function hideDiv(){
$(".bottom").hide();
}
</script>
</html>