移动端滑屏滚动选择

前端入坑纪 31

又一个项目里的需求,套插件的话不好自定义页面的显示效果。所以就自己写了一个,还是自己写的东西比较好自定义。尤其是对那些喜欢定制的客户来说,要求多的情况下,变更需求后,也好操作修改。平时的刻苦努力,只是为了改需求时能游刃有馀,早点回家抱孩子。毕竟工作不是生活的全部,家人才是最重要的。

真实项目效果图

OK,first things first!项目链接

HTML 结构
    <div class="mWrp" id="dv">
        <h2>选择学位</h2>
        <div class="tapas clear">
            <div>
                <a href="javascript:;">幼儿园</a>
            </div>
            <div>
                <a href="javascript:;">小学</a>
            </div>
            <div>
                <a href="javascript:;">初中</a>
            </div>
            <div>
                <a href="javascript:;">高中</a>
            </div>
        </div>
        <h2>选择学校和年级班级</h2>
        <div class="mtwrp clear">
            <div id="ltwrp" class="fl">
                <div class="divs">
                    <section style="transform:translateY(0)">
                        <a class="on" href="javascript:;">龙湾海城心动幼儿园1</a>
                        <a href="javascript:;">龙湾幼儿园2</a>
                        <a href="javascript:;">龙湾幼儿园3</a>
                        <a href="javascript:;">龙湾幼儿园4</a>
                        <a href="javascript:;">龙湾幼儿园5</a>
                        <a href="javascript:;">龙湾幼儿园6</a>
                        <a href="javascript:;">龙湾幼儿园7</a>
                    </section>
                </div>
            </div>
            <div id="rtwrp" class="fr">
                <div class="divs">
                    <section style="transform:translateY(0)">
                        <a class="on" href="javascript:;">大班1</a>
                        <a href="javascript:;">大班2</a>
                        <a href="javascript:;">大班3</a>
                        <a href="javascript:;">中班1</a>
                        <a href="javascript:;">中班2</a>
                        <a href="javascript:;">中班3</a>
                        <a href="javascript:;">小班1</a>
                        <a href="javascript:;">小班2</a>
                        <a href="javascript:;">小班3</a>
                    </section>
                </div>
            </div>
        </div>
        <a class="netBtn" href="javascript:;">下一步</a>

        <div class="clear" style="margin-top:6%">
            <input class="fl" id="socName" type="text" />
            <input class="fr" id="clsName" type="text" />
        </div>

    </div>

html 这里 给div#rtwrp和div#ltwrp 设定固定的高,这样里面的所有a超过高度就会隐藏了。然后给section 添加transform:translateY。所有的关键也都是和这个translateY有关,通过控制它的不同值,让不同的a在滑动时都处在第一位置。

CSS 结构
        /*rest style*/
        
        body {
            padding: 0;
            margin: 0;
            background-color: #fff;
            max-width: 640px;
            margin: 0 auto;
        }
        
        p {
            padding: 0;
            margin: 0;
        }
        
        ul,
        li {
            padding: 0;
            margin: 0;
            list-style: none;
        }
        
        a {
            outline: none;
            text-decoration: none;
            color: #525252;
        }
        
        img {
            vertical-align: middle;
        }
        
        .fl {
            float: left;
        }
        
        .fr {
            float: right;
        }
        
        .clear::after {
            display: block;
            content: "";
            clear: both;
        }
        /*page style*/
        
        .mWrp {
            padding: 10px;
        }
        
        .tapas a {
            display: inline-block;
            background-image: linear-gradient(-140deg, #f3557a 0%, #fa7157 98%);
            border: 3px solid #ffe9e6;
            border-radius: 50%;
            width: 56px;
            height: 56px;
            line-height: 56px;
            font-size: 12px;
            color: #ffffff;
            text-align: center;
        }
        
        .tapas div {
            float: left;
            width: 25%;
            text-align: center;
        }
        
        .mWrp h2 {
            text-align: center;
            font-size: 16px;
            color: #4a4a4a;
        }
        
        .netBtn {
            display: block;
            background-image: linear-gradient(-132deg, #f3557b 0%, #fa7157 100%);
            border-radius: 9px;
            width: 90%;
            margin-left: 5%;
            height: 50px;
            line-height: 50px;
            text-align: center;
            font-size: 18px;
            color: #ffffff;
            margin-top: 6%;
        }
        
        .mtwrp>div {
            width: 50%;
            height: 240px;
            overflow: hidden;
        }
        
        .divs>section {
            transition: all 300ms linear
        }
        
        .mtwrp a {
            display: block;
            background: #ffffff;
            border: 2px solid #ffe1db;
            border-radius: 100px;
            width: 96%;
            box-sizing: border-box;
            height: 45px;
            font-size: 14px;
            color: #f55a75;
            text-align: center;
            margin: 15px 2%;
            line-height: 41px;
            transition: all 120ms ease
        }
        
        .mtwrp a.on {
            background-image: linear-gradient(-134deg, #f4567b 0%, #fa7157 100%);
            border-color: #ffe1db;
            color: #fff;
        }

css这里记得要给滑动的dom元素,也就是每个section 和它们里面的a添加过渡属性就对了

JS 结构
        // 这里是禁止微信里下滑是出现整个网页下拉的效果,其实本质就是禁止了触控滑动,然后用scorlltop去模拟滑动效果
        var y, st, dv = document.getElementById('dv');
        document.addEventListener('touchend', function(e) {
            document.body.scrollTop = document.documentElement.scrollTop = st + y - e.changedTouches[0].pageY;
        }, false);
        document.addEventListener('touchstart', function(e) {
            st = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
            y = e.touches[0].pageY;
            e.preventDefault();
        }, false);



        var leftNav = document.getElementById("ltwrp");
        var rightCont = document.getElementById("rtwrp");
        var school = document.getElementById("socName");
        var oclsName = document.getElementById("clsName");
        var startY = endY = changeHet = cNum = 0;
        var rightHet = rightCont.getElementsByTagName("section")[0].offsetHeight;
        var leftHet = leftNav.getElementsByTagName("section")[0].offsetHeight;
        var maxhetRight = rightHet - 60 + 15;// 右边滑动内容最大的可滑动高度
        var maxhetLeft = leftHet - 60 + 15;// 左边滑动内容最大的可滑动高度


        // 初始化input里面的值为第一个a的内容
        school.setAttribute("value", leftNav.getElementsByTagName("a")[0].innerText);
        oclsName.setAttribute("value", rightCont.getElementsByTagName("a")[0].innerText);



        // 滑动时要执行操作的都在这个函数里,传入滑动的对象,对象的高,还有对应的变更值的input
        function scrollFuc(obejt, oheight, oinpt) {
            
            var distance = 0;// 用来存每次滑动后translateY的值

            obejt.addEventListener("touchstart", function(evt) {
                startY = evt.targetTouches[0].clientY;// 触摸起先(touchstart)的clientY的值
            });
            obejt.addEventListener("touchmove", function(evt) {
                endY = evt.targetTouches[0].clientY;// 触摸过程中(touchmove)的clientY的值
            });

            obejt.addEventListener("touchend", function(evt) {

                cNum = endY - startY;// 触摸结束时(touchend)的clientY的差值

                changeHet = Math.round(cNum / 90) * 60;// 将差值除以30的倍数后四舍五入取整,再乘以60(每个a相差60)得到最终的变更高度。

                distance += changeHet;// 每次变更的高度再加原先的高度值


                // 这里自然是高度的范围,不然滑动过头
                if (distance > 0) {
                    distance = 0;
                } else if (distance < -oheight) {
                    distance = -oheight
                }

                // 将最终的tranlateY值付给当前传入的对象
                this.getElementsByTagName("section")[0].style.transform = "translateY(" + distance + "px)";

                // 取消当前对象下所有选项a的效果
                var mas = this.getElementsByTagName("a");
                for (var i = 0; i < mas.length; i++) {
                    mas[i].className = "";
                }

                 // 选中滚动距离对应的a,添加on 的选中效果
                setTimeout(function() {
                    mas[Math.abs(distance / 60)].className = "on";
                    oinpt.setAttribute("value", mas[Math.abs(distance / 60)].innerText)
                }, 560);

            });

        }


        // 这里自然就是调用上面构建的函数了
        scrollFuc(rightCont, maxhetRight, oclsName);
        scrollFuc(leftNav, maxhetLeft, school);

js基本备注已经添加完毕,感兴趣的小伙伴可以研究下。

好了,到此,本文告一段落!感谢您的阅读!祝你身体健康,阖家幸福!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • 学习 jQuery-fullPage.js 插件已经两天,参照网上的案例仿造了一个“魅族Note2官网”网页,中间...
    seporga阅读 6,458评论 2 11
  • Today is Monday. They sat down to eat. Sylvester was now ...
    Mr_Oldman阅读 75评论 0 0
  • 哲学不是宗教,为什么它能给予人信仰?哲学不是艺术,为什么它能赋予人美感?哲学不是科学,为什么它能启迪人真理?哲学不...
    Li老师阅读 2,250评论 1 10
  • 他说,日子再苦,都会过去的。 他五十多岁,头发花白。我会经常和他说,把头发染一染吧,他回我一句,老了就是...
    玲娜阅读 377评论 0 1