手机端选择弹框插件(有滑动效果)

在这里插入图片描述

一般小程序中都有对应的插件,但在h5中,需要通过swiper自己写插件。

一、引入文件

<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/Swiper/3.0.4/css/swiper.min.css">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/Swiper/3.0.4/js/swiper.min.js"></script>

HTML结构

<!-- 选择框 -->
<input type="text" class="city" placeholder="选择城市" readonly="readonly">
<!-- 弹框 -->
<div class="select_box"></div>

JS

<script>
	//根据当前的屏幕大小,设置根元素的fontsize
   (function(doc,win,page_width,font_size){
        let docEl=doc.documentElement,
        resizeEvt='orientationchange'in window?'orientationchange':'resize',
        recalc=function(){
            let clientWidth=docEl.clientWidth;
            console.log(clientWidth,page_width,font_size);
            if(!clientWidth)return;
            docEl.style.fontSize=clientWidth>page_width?(font_size*2)+'px':font_size*(clientWidth/(page_width/2))+'px';
            console.log(docEl.style.fontSize);
        };
        if(!doc.addEventListener)return;
        win.addEventListener(resizeEvt,function(){
            recalc();
        },false);
        doc.addEventListener('DOMContentLoaded',function(){
            recalc();
        },false);
    })(document,window,750,50);

    function selectSwiper(obj){
        let _self=this;
        _self.el=$(obj.el);
        _self.selectSwiper=null;
        _self.swiperData={};
        _self.swiperData.mustSelect=obj.mustSelect||false;
        _self.swiperData.activeIndex=(typeof obj.activeIndex==='number'&&obj.activeIndex>=-1)?obj.activeIndex:-1;
        _self.swiperData.oldIndex=_self.swiperData.activeIndex;
        _self.swiperData.data=obj.data||[];
        _self.swiperData.okFun=obj.okFun;
        _self.swiperData.okFunUndefind=obj.okFunUndefind||function(){};
        _self.swiperData.closeFun=obj.closeFun||function(){};
        _self.swiperData.init=obj.init;
        let hgSelect=`
            <div class="select">
                <span class="close">取消</span>
                <span class="ok">确定</span>
                <div class="selectData">
                    <div class="swiper-container">
                        <div class="cloth"></div>
                        <div class="swiper-wrapper">
                            <div class="swiper-slide">请选择</div>
                        </div>
                    </div>
                </div>
            </div>
        `;
        _self.init=function(){
            _self.el.html(hgSelect);
            _self.el.addClass('click_no');
            _self.selectSwiper=new Swiper(obj.el+' .swiper-container',{
                direction:'vertical',
                slidesPerView:5,
                centeredSlides:true,
                slideToClickedSlide:true,
                onInit:function(swiper){
                    swiper.removeSlide(0);
                    let data=_self.swiperData.data;
                    let s=[];
                    s[0]='<div class="swiper-slide">请选择</div>';
                    for(i=0;i<data.length;i++){
                        s[i+1]='<div class="swiper-slide">'+data[i]+'</div>';
                    }
                    swiper.appendSlide(s);
                    _self.swiperData.init(_self.swiperData.activeIndex);
                },
                onSlideChangeEnd:function(swiper){
                    _self.swiperData.activeIndex=swiper.activeIndex-1;
                },
            });
            _self.el.find('.ok').on('click',_self.okSelectSwiper);
            _self.el.find('.close').on('click',function(){
                _self.swiperData.activeIndex=_self.swiperData.oldIndex;
                _self.swiperData.closeFun();_self.closeSelectSwiper();
            });
            _self.el.on('click',function(){
                _self.el.find('.close').trigger('click');});
                $('.select').on('click',function(e){
                    e.stopPropagation();
            });
        };
        _self.openSelectSwiper=function(){
            let _self=this;
            _self.el.addClass('yes');
            _self.selectSwiper.update();
            _self.selectSwiper.slideTo(_self.swiperData.activeIndex+1,0);
        };
        _self.okSelectSwiper=function(){
            if(_self.swiperData.mustSelect&&_self.swiperData.activeIndex===-1){
                _self.swiperData.okFunUndefind();
            }else{
                _self.swiperData.okFun(_self.swiperData.activeIndex);
                _self.swiperData.oldIndex=_self.swiperData.activeIndex;
                _self.closeSelectSwiper();
            }
        };
        _self.closeSelectSwiper=function(){
            _self.el.removeClass('yes');
        };
        _self.init();
    }

    $(function(){
    	根据上面的方法实例化一个对象
        let citySelect = new selectSwiper({
            el:'.select_box',
            data:['北京','南京','上海','天津','广东','苏州','杭州','郑州','青岛'],
            init:function(index){
                if(index!==-1){
                    $('.city').val(this.data[index]);
                }
            },
            okFunUndefind:function(){
                alert('必须选择一项');
                return false;
            },
            okFun:function(index){
                console.log(index);
                $('.city').val(this.data[index]);
            },
            closeFun:function(){
                console.log('取消');
            },
        });
        $('.city').on('click',function(){
            citySelect.openSelectSwiper();
        });
    })
</script>

CSS

html,body{
   margin:0;
   padding:0;
   font-family:微软雅黑 regular,微软雅黑;
   font-size:.14rem;
   color:#333;
   -webkit-user-select:none;
   -moz-user-select:none;
   -ms-user-select:none;
   user-select:none
}
ul,li{
   list-style:none;
   padding:0
}
a{
   text-decoration:none;
   color:#333
}
.w750{
   max-width:750px;
   margin:0 auto;
   overflow:hidden;
   background-color:#f5f5f5
}
.swiper-container,.selectData{
   height:2.5rem
}
.swiper-slide{
   height:.7rem;
   line-height:.7rem;
   font-size:.3rem;
   color:#ccc
}
.swiper-slide:first-child{
   color:#b7babf
}
.swiper-slide-prev,.swiper-slide-next{
   font-size:.35rem;
   color:#898b8f
}
.swiper-slide-active{
   font-size:.4rem;
   color:#191919
}
@keyframes fadeInUp1{
   100%{bottom:0}
}
.select_box{
   display:none;
   position:fixed;
   left:0;
   top:0;
   right:0;
   bottom:0;
   background-color:rgba(0,0,0,.5);
   -webkit-transition:all .5s;
   -moz-transition:all .5s;
   -ms-transition:all .5s;
   -o-transition:all .5s;
   transition:all .5s
}
.select_box.yes{
   display:block
}
.select_box .select{
   height:3.5rem;
   overflow:auto;
   text-align:center;
   padding:.8rem .1rem .2rem;
   position:absolute;
   left:0;
   right:0;
   bottom:-100%;
   background-color:#fff
}
.select_box.yes .select{
   animation:fadeInUp1 .3s ease-out;
   animation-fill-mode:forwards
}
.select_box.yes .select .close,.select_box.yes .select .ok{
   color:#333;
   font-size:.32rem;
   position:absolute;
   top:.2rem
}
.select_box.yes .select .close{
   left:.2rem
}
.select_box.yes .select .ok{
   right:.2rem
}
.select_box.yes .select .cloth{
   position:absolute;
   height:.625rem;
   top:1rem;
   left:0;
   right:0;
   background-color:rgba(0,0,0,.05)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值