类似ios select下拉选择框的实现

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>

注意:1:本例的效果是基于向服务端请求数据,然后在渲染。
2:请在手机上打开该地址,若为PC端,请调至手机模式
示例url:
http://uair.aiplatform.com.cn/UAirWeb/activity/index2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值