vue移动端项目仿IOS写一个滚筒选择器

        作为一个工作了两年多的前端,每次写移动端项目的时候,经常会碰到滚筒选择器的需求,比如电商类选择收货地址,比如互金类选择商品品类等,相信大家写移动端项目的时候也碰到过需要滚筒选择器的需求。不得不说,就移动端而言,滚筒选择器选择品类或者地址交互确实蛮流畅的,对用户来说也是很舒服的一种用户体验,但是个人觉的开源的UI框架好像没好用或者说刚好满足需求的现成的滚筒选择器组件,综上,我决定自己手撸一个滚筒选择器。

        先来了解一下滚筒选择器需要做到的功能和交互,这里先放一张我写的滚筒选择器的效果图

滚筒选择器效果图

这里我直接放的是屏幕截图(因为我懒得做一个gif图放上去了哈哈哈哈,各位看官将就着看吧),可以看到这里的滚筒我是放了三列,三列是独立的,实际上组件我只写了一列,然后v-for循环了三个哈哈哈哈哈,只是在外层容器用flex把他们平铺到一行去了。

        好了废话也不多说了,先来说说思路吧,首先我们要的是一个数据列表,然后中间给个高亮表示选中的数据,换句话说,没选中的部分给个遮罩让他们看起来模模糊糊的就好了是吧,滚动的时候让数据能在高亮行(即上图中两条蓝线区域,下文同理)中居中显示就好了。刚开始我本来想直接CSS来实现,后来只能做出个样子,交互效果很一般,因为高亮行上下都有一层灰蒙蒙的遮罩,导致能滚动的区域只有高亮行这么一小块区域,并且让数据列滚筒时不能自动把数据在高亮行内居中(可能表达的不是很清楚,总之一句话就是,单纯CSS写滚筒,交互效果不好),所以我放弃了,然后我开始各种百度,终于让我找到了一个比较好的我能理解的demo了,这里附上demo原git地址(本来想放原文地址的,后来找不到了,这里跟原作者说个不好意思),这个demo给提供了一个新的思路,html部分,原作者分了三个部分,一个高亮区域和两个数据列,通过position和transform+translate来固定位置,讲道理这个是我之前没有想到的,或许这就是菜鸡与大神之前的区别把。好了接下来我们来看一下代码吧。

        这里要着重说的两个样式transform-style: preserve-3d;  backface-visibility: hidden;

       (1)transfrom-style 属性规定如何在3D空间呈现被嵌套的元素,值如下图:

transfrom-style属性值

我们使用preserve-3d 是让我们的值列表呈现3d效果,他是写在列表父级的;

        (2)backface-visivility 属性定义当元素不面向屏幕时是否可见,值如下图:

backface-visivility属性值

我们使用hidden是背面不可见的,他是写在列表上的。这两个属性单独拿出来讲并不是属性有多难,只是比较少见而已,不过只有他们是无法完成这个艰巨界面的。

    接下来我们来看看js部分吧,我觉的js部分才是这个组件的有趣之处。

初始化的时候绑定事件

因为是移动端,所以我们要重手指触摸到屏幕那刻开始处理,刚开始触摸touchstart的时候给一个itemTouchStrat事件,滑动的时候touchmove给个itemTouchMove事件,触摸结束touchend的时候给个itemTouchEnd事件,然后我们想想这些时间段里我们要做那些事情,你就能想到,在itemTouchStart和itemTouchEnd里我们要保存当前触摸的位置和当前触摸的时间,为什么呢,因为滚筒选择器里有一个相当于惯性滚动的后续效果,所以我们得知道用户手指滑动的位移和时间,用于后面计算惯性滚动的位移量,即开始时间和结束时间以及move的位移量。因为我们html里把选中的和可供选择的数据分开了,也就说灰蒙蒙的那些数据跟高亮的数据实际上是不搭嘎的,只是我们通过一些操作让他们联动了起来,所以我们在touchmove的时候也要知道位移时间和位移量,用于改变高亮数据样式。好接下来就是最关键的问题,我手离开屏幕之后,滚筒依旧在滚动并在一段时间停下来并选中这个效果要怎么实现呢,实际上,我们只要知道手指离开之后滚动的位移量是多少就行了,然后我们用这个位移量去除以单条数据的高度就能知道最后会选中那条数据了对吧,好的那就涉及到touchend触发时滚动的加速度了,但是!这种高中物理知识!像我这种辣鸡肯定是解不出来的哈哈哈所以在这块没多做纠缠,直接跟着原作者走了哈哈哈哈哈。那么到这里基本上就搞定了对不对,这里把滚动时改CSS代码贴出来

样式变化

看官们,你们品!你们细品!是不是觉的有点好玩,反正我觉的挺好玩的哈哈哈哈哈。

        对了因为是移动端项目,所以兼容各个设备宽度自然是要做的,这里我用的是postcss-pxtorem,一个PostCSS的插件,用于将像素单元生成rem单位,因为js改变css的时候里面用px的画postcss-pxtorem并不会帮你专程rem,就存在兼容性问题,所以上面的直接用的是rem为单位,在这个组件里我先去获取了当前设备的宽度,iphone 6/7/8 下1rem=16px;因为数据行高是34px,所以我写成了2.125rem。接下来说一下postcss-pxtorem的使用步骤吧,安装的话直接npm install postcss-pxtorem -D就行了,然后在项目了新建一个公用js文件命名为rem.js,在main.js里import到全局去

rem.js

做到这我们还差一步,那就是.postcssrc.js里面还要配置postcss-pxtorem,不然也不会生效的哦。直接把'postcss-pxtorem': {

      rootValue: 16,

      propList: ['*']

    }复制到module.exports里面就行了。

        好了这个组件也讲的差不多了,如果有我讲的不够清楚的地方,没关系我把这个组件上传到我个人github了,你们可以直接clone下来跑一边,然后一步一步过代码,就会明白这个组件该怎么写了,因为是当初也是把原作者demo直接clone下来跑一遍的哈哈哈哈哈。

        抛砖引玉,看出问题及不足之处的大神望指正(落魄前端,在线磕头)。

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

推荐阅读更多精彩内容