摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。預(yù)知后話地址為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器到此,的操作和手勢(shì)算法就已經(jīng)基本掌握了。
寫在前面
之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)說(shuō)它的成長(zhǎng)史~
在閱讀本文之前,確保你有稍微看過(guò) MultiPicker 的源碼 喔~
點(diǎn)擊查看源碼 ,也可以在 npm 上找到他們:
日期選擇器 - DateSelector - NPM.
自定義json選擇器 - MultiPicker. NPM.
二、彈層的實(shí)現(xiàn) & DOM的小技巧 思考第3個(gè)問(wèn)題:『如何實(shí)現(xiàn)彈層,使得插件能夠兼容更多框架,并且樣式上萬(wàn)無(wú)一失?』回顧上集:如何造一個(gè)移動(dòng)端的聯(lián)動(dòng)選擇器(一)
實(shí)現(xiàn)彈層的思路:【插入DOM → 初始化聯(lián)動(dòng)的數(shù)據(jù) → 綁定事件 】
① 在插入DOM的部分( initDomFuc ),采用字符串拼接的方式插入DOM(而不是使用字符串模板)。
聯(lián)動(dòng)的主要結(jié)構(gòu)式如下圖:
每個(gè)聯(lián)動(dòng)是一個(gè) div,div 包裹著一個(gè) ul,ul 中的每個(gè) li 就是聯(lián)動(dòng)的值
其中div的高度是5個(gè) li 的高度,ul的高度是實(shí)際的所有 li 的高度。
② 在初始化聯(lián)動(dòng)數(shù)據(jù)的部分( initReady ),在頭尾分別插入兩個(gè)空字符,能夠起到占位符的作用,這樣在計(jì)算手勢(shì)的translate3d的時(shí)候更方便。
③ 為DOM元素綁定事件時(shí),具體做法有兩步:
第一步:為每個(gè)初始化好的ul綁定touch事件( initReady );
第二步:為一些操作按鈕綁定事件( initBinding )。
③ - 第一步:touch事件的種類無(wú)非就是 touchstart、touchmove 和 touchend。但需要在每次滑動(dòng)的時(shí)候記錄一些數(shù)據(jù)。這是為了實(shí)現(xiàn)一個(gè)滑動(dòng)加速度的效果,下文會(huì)說(shuō)到。
③ - 第二步:用到了自己封裝的一個(gè)簡(jiǎn)單的事件監(jiān)聽函數(shù)on:
這個(gè)函數(shù)主要用在【觸發(fā)】【取消】和【提交】這幾個(gè)重要按鈕上。
PS:在設(shè)計(jì)樣式的過(guò)程中考慮到,完整使用【年月日時(shí)分】五種時(shí)間單位的場(chǎng)景居多,為了優(yōu)化界面和用戶體驗(yàn),所以在日期選擇器的設(shè)計(jì)中,需要設(shè)計(jì)一種帶tab切換效果的完整版日期選擇器。其他場(chǎng)景中不會(huì)出現(xiàn)。
我發(fā)現(xiàn),無(wú)論用戶使用哪個(gè)手指,只要用戶的滑動(dòng)弧長(zhǎng)在短時(shí)間內(nèi)比較大的話,說(shuō)明用戶比較想快速向上滑或是向下滑。比如,在選擇出生年份的時(shí)候,用戶肯定會(huì)想快速滑到上面的部分,就會(huì)用很快速的手勢(shì)向下滑動(dòng)一個(gè)比較大的弧長(zhǎng)。這時(shí)候就應(yīng)該有一個(gè)滑動(dòng)加速度的效果。
那么如何實(shí)現(xiàn)呢,如何判斷用戶想要快速滑動(dòng)呢?
很簡(jiǎn)單,只需要考慮,單位時(shí)間內(nèi)的速度變化率,也就是加速度,就行了。
之前提到過(guò),在touchmove的過(guò)程中會(huì)有一個(gè) 【speed數(shù)組】用來(lái)存儲(chǔ)滑動(dòng)時(shí),手勢(shì)的速度。
并在touchend中調(diào)用 initSpeed 函數(shù),確定最后 transition-duration 的值。
initSpeed 的主要工作是計(jì)算 speed 中的速度方差,方差和加速度是成正相關(guān)的。
所以當(dāng)方差大于0.1時(shí),ul 的實(shí)際滑動(dòng)距離是手勢(shì)滑動(dòng)距離的兩倍,transition-duration的值為0.2s;
而當(dāng)方差小于0.1的時(shí)候,就認(rèn)為基本是勻速滑動(dòng),ul 的實(shí)際滑動(dòng)距等于手勢(shì)滑動(dòng)距離,取 speed[0] 作為 transition-duration 的值。
確定好了滑動(dòng)距離之后,就可以計(jì)算最后停留的位置 translate3d ( initPosition )。
滑動(dòng)加速度的效果就基本實(shí)現(xiàn)了。
預(yù)知后話Github地址:『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器
到此,dom的操作和手勢(shì)算法就已經(jīng)基本掌握了。
預(yù)知后話,后兩天見(jiàn)分曉
我是嘉寶Appian,一個(gè)賣萌出家的算法妹紙。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/54383.html
摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。具體實(shí)現(xiàn)步驟如下先傳入一個(gè)需要計(jì)算深度的對(duì)象給,判斷如果還有則迭代,并計(jì)算深度。如果增加了聯(lián)動(dòng)級(jí)數(shù)需要來(lái)判斷,則為新增加的聯(lián)動(dòng)綁定新的事件。 寫在前面 之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)...
摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。具體實(shí)現(xiàn)步驟如下先傳入一個(gè)需要計(jì)算深度的對(duì)象給,判斷如果還有則迭代,并計(jì)算深度。如果增加了聯(lián)動(dòng)級(jí)數(shù)需要來(lái)判斷,則為新增加的聯(lián)動(dòng)綁定新的事件。 寫在前面 之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)...
摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。具體實(shí)現(xiàn)步驟如下先傳入一個(gè)需要計(jì)算深度的對(duì)象給,判斷如果還有則迭代,并計(jì)算深度。如果增加了聯(lián)動(dòng)級(jí)數(shù)需要來(lái)判斷,則為新增加的聯(lián)動(dòng)綁定新的事件。 寫在前面 之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)...
摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。預(yù)知后話地址為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器到此,的操作和手勢(shì)算法就已經(jīng)基本掌握了。 寫在前面 之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)說(shuō)它的成長(zhǎng)史~ 在閱讀本文之前,確保你有稍微看過(guò) Mu...
摘要:寫在前面之前寫了一篇為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。預(yù)知后話地址為移動(dòng)端而生的自定義多級(jí)聯(lián)動(dòng)選擇器到此,的操作和手勢(shì)算法就已經(jīng)基本掌握了。 寫在前面 之前寫了一篇 MultiPicker -『為移動(dòng)端而生』的自定義多級(jí)聯(lián)動(dòng)選擇器,得到了很多人的關(guān)注。鑒于很多人對(duì)這種手寫插件的過(guò)程很好奇,所以寫了幾篇文章,來(lái)說(shuō)說(shuō)它的成長(zhǎng)史~ 在閱讀本文之前,確保你有稍微看過(guò) Mu...
閱讀 803·2021-10-14 09:43
閱讀 2129·2021-09-30 09:48
閱讀 3451·2021-09-08 09:45
閱讀 1101·2021-09-02 15:41
閱讀 1894·2021-08-26 14:15
閱讀 779·2021-08-03 14:04
閱讀 2982·2019-08-30 15:56
閱讀 3077·2019-08-30 15:52