欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue.js實現(xiàn)仿原生ios時間選擇組件實例代碼

 更新時間:2016年12月21日 09:48:51   作者:k1868548  
本篇文章主要介紹了vue.js實現(xiàn)仿原生ios時間選擇組件實例代碼,具有一定的參考價值,有興趣的可以了解一下。

前言

最近幾個月一直在看VUE,然后試著只用原生js+vue實現(xiàn)某些組件。

PC端時間選擇組件 這是最開始實現(xiàn)的pc上的時間選擇,平時移動端也在做,所以就想實現(xiàn)一下移動端的時間選擇器,下面分享一下我實現(xiàn)移動端滾輪特效時間選擇器的思路和過程。整個組件是基于vue-cli來進(jìn)行構(gòu)建的

功能

1.時間選擇[ A.年月日選擇 B.年月日小時分鐘選擇 C.小時分鐘選擇 D.分鐘選擇]

2.滾輪效果[ A.構(gòu)成一個圓環(huán)首尾相連 B.不構(gòu)成首尾相連]

3.時間選擇范圍設(shè)置(所選時間超過范圍將彈窗提示),分鐘間隔設(shè)置

4.多語言設(shè)置

5.時間格式設(shè)置 滿足 yyyy/MM/dd HH:mm 這一類的設(shè)置規(guī)則

6.UE上做到接近ios原生效果

7.擴(kuò)展 不僅僅只能選擇時間,可以傳入自定義聯(lián)動選擇數(shù)據(jù)

這里主要講講無限滾輪的實現(xiàn)
數(shù)據(jù)準(zhǔn)備1

這里拿 來做說明

獲取一個月有多少天的一個巧妙的方法。

 dayList () {
       /* get currentMonthLenght */
        let currentMonthLength = new Date(this.tmpYear, this.tmpMonth + 1, 0).getDate();
       /* get currentMonth day */
        let daylist = Array.from({length: currentMonthLength}, (value, index) => {
          return index + 1
        });
        return daylist
      },

這里我用了vue 的computed方法來實現(xiàn),放入 yearList monthList dayList hourList minuteList 來存儲基礎(chǔ)數(shù)據(jù),這里數(shù)據(jù)準(zhǔn)備就先告一段落。

靜態(tài)效果實現(xiàn)

實現(xiàn)滾輪靜態(tài)效果有多種方式

1.視覺3D效果[加陰影]

2.實際3D效果[CSS3D]

我把實現(xiàn)效果大致分為上面2種,具體的大家可以自己搜索相關(guān)資料,這里展開涉及太多就帶過好了

我自己實現(xiàn)是用的第二種采用了CSS3D

說明

首先我們看到原生ios的選擇效果在進(jìn)入選擇范圍內(nèi)和選擇范圍外的滾輪是有差別的

所以為了實現(xiàn)這個效果差別我選擇用2個dom結(jié)構(gòu)來實現(xiàn),一個dom實現(xiàn)滾輪,一個dom實現(xiàn)黑色選中效果,這樣聯(lián)動的時候就有類似原生的效果差別

picker-panel 裝各種選擇dom,這里只給出了day的, box-day 裝天數(shù)據(jù)的一個最外層盒子, check-line 實現(xiàn)選中的那2條線, day-list 最外層黑色效果數(shù)據(jù), day-wheel 灰色滾輪部分

<div class="picker-panel">
<!--other box-->
<div class="box-day">
  <div class="check-line"></div>
  <div class="day-checked">
    <div class="day-list">
      <div class="list-div" v-for="day in renderListDay">
       {{day.value}}
      </div>
    </div>
  </div>
  <div class="day-wheel">
    <div class="wheel-div" v-for="day in renderListDay" transform: rotate3d(1, 0, 0, 80deg) translate3d(0px, 0px, 2.5rem);>
    {{day.value}}
    </div>
  </div>
</div>
<!--other box-->
</div>
.day-wheel{
    position: absolute;
    overflow: visible;
    height: px2rem(68px);
    font-size: px2rem(36px);
    top:px2rem(180px);
    left: 0;
    right: 0;
    color:$unchecked-date;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    .wheel-div{
     height: px2rem(68px);
     line-height: px2rem(68px);
     position: absolute;
     top:0;
     width: 100%;
     text-align: center;
     -webkit-backface-visibility: hidden;
     backface-visibility: hidden;
     white-space: nowrap;
     overflow: hidden;
     text-overflow: ellipsis;
    }
   }

主要涉及的css屬性

transform-style: preserve-3d;

展示3D效果,

-webkit-backface-visibility: hidden;

滾輪背后部分自動隱藏

postition:absolute;

用來定位輪子

transform: rotate3d(1, 0, 0, 80deg) translate3d(0px, 0px, 2.5rem);

每個數(shù)據(jù)旋轉(zhuǎn)的角度 和滾輪側(cè)視圖圓的半徑

每個數(shù)據(jù)旋轉(zhuǎn)的角度和構(gòu)造原理

如上圖

是我們滾輪的效果立體圖,r 就是我們 translated3d(0px,0px,2.5rem) 這條css中的2.5rem,

如果沒有這句css 那么所有的數(shù)據(jù)將匯聚在圓心

 

上圖 不做旋轉(zhuǎn)(紅色代表我們看到的數(shù)據(jù)效果)

 

上圖 做了旋轉(zhuǎn)(紅色 橙色代表我們看到的數(shù)據(jù)效果)

藍(lán)色弧線表示的角度是一樣的(這個涉及角的知識),也是視覺旋轉(zhuǎn)角度,就是rotate3d這句css里面的80deg ,我做的是每個間隔20度,這樣實際我們只用旋轉(zhuǎn)x軸就順帶旋轉(zhuǎn)了圓心角度,這樣就把整個環(huán)給鋪開了。完整一個圓可以裝下360/20 個數(shù)據(jù),而我們?nèi)庋壅芸匆娬娴臄?shù)據(jù),所以過了一定角度就在背后應(yīng)該不能被我們看見,而-webkit-backface-visibility: hidden;這句話就起了作用。

這里我們發(fā)現(xiàn)輪子裝不完所有數(shù)據(jù),而且我們要實現(xiàn)數(shù)據(jù)循環(huán)

類似下圖效果

所以就有了第二次數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)準(zhǔn)備2

這里也是用我們的dayList作為初始數(shù)據(jù)[1,2,3,4,.....,30,31]

這里我們每次取19個數(shù)據(jù)來作為渲染數(shù)據(jù),而我們需要renderListDay初始呈現(xiàn)是[23,24,25,26,27,28,29,30,31,1,2,3,4,5,6,7,8,9,10]

因為這樣取最中間的數(shù)剛好是第一個(僅在初始化的時候)

renderListDay(){
        let list = [];
        for (let k = this.spin.day.head; k <= this.spin.day.last; k++) {
          let obj = {
            value: this.getData(k, 'day'),
            index: k,
          };
          list.push(obj)
        }
        return list
      },

取數(shù)據(jù)的方法 小于0倒著取 大于0正著取,索引大于原始數(shù)據(jù)長度都用%計算來獲得正常范圍對應(yīng)的索引,所以上面的spin 就是我們的取數(shù)據(jù)的叉子(初始是從-9到9)

getData(idx, type){
       //...
        else if (type == 'day') {
          return this.dayList[idx % this.dayList.length >= 0 ? idx % this.dayList.length : idx % this.dayList.length + this.dayList.length];
        } 
        //...
      },

每條數(shù)據(jù)旋轉(zhuǎn)的角度(上半圓是正,下半圓是負(fù))

<div class="wheel-div" v-for="day in renderListDay" v-bind:data-index="day.index" v-bind:style="{transform: 'rotate3d(1, 0, 0, '+ (-day.index)*20%360+'deg) translate3d(0px, 0px, 2.5rem)'}">{{day.value}}{{day.value}}</div>

接著需要旋轉(zhuǎn)到我們需要的角度,跟我們的初始化時間對上,this.orDay-this.DayList[0] 是獲取偏移量來矯正角度

this.$el.getElementsByClassName('day-wheel')[0].style.transform = 'rotate3d(1, 0, 0, ' + (this.orDay - this.dayList[0]) * 20 + 'deg)';

增加touch事件

剩下的事就很好處理了,給對應(yīng)的dom綁定事件根據(jù)touchmove的距離來轉(zhuǎn)換成旋轉(zhuǎn)的角度 和check-list的位移這里translateY是用來記錄實際移動的距離的,最后輸出需要算入偏移量

<div class="box-day" v-on:touchstart="myTouch($event,'day')" v-on:touchmove="myMove($event,'day')" v-on:touchend="myEnd($event,'day')">
  <div class="check-line"></div>
  <div class="day-checked">
    <div class="day-list" data-translateY="0" style="transform: translateY(0rem)">
      <div class="list-div" v-for="day in renderListDay" v-bind:data-index="day.index">
        {{day.value}}
      </div>
    </div>
  </div>
  <div class="day-wheel" style=" transform: rotate3d(1, 0, 0,0deg)">
    <div class="wheel-div" v-for="day in renderListDay" v-bind:data-index="day.index" v-bind:style="{transform: 'rotate3d(1, 0, 0, '+ (-day.index)*20%360+'deg) translate3d(0px, 0px, 2.5rem)'}">
     {{day.value}}
    </div>
  </div>
</div>

慣性滾動

這個實現(xiàn)我是用了一個 cubic-bezier(0.19, 1, 0.22, 1)

判斷手勢是不是flicker 如果是flicker通過一個瞬時速度來算出位移,和時間,然后一次性設(shè)置,然后用transition做慣性滾動,
普通拖動 設(shè)置1秒

這個實際效果還是有點不好,以后來改進(jìn)。

其他功能的實現(xiàn)

這里不做詳細(xì)說明了

總結(jié)

自適應(yīng)方面用了手淘的解決方案

這次實現(xiàn)這個組件最困難的就是實現(xiàn)無限滾動,和無限滾動的渲染數(shù)據(jù)的構(gòu)造,接著就是慣性滾動的實現(xiàn)。

已知問題

1.慣性滾動不完美

2.無限滾動實現(xiàn)了。非無限滾動沒實現(xiàn),就是渲染數(shù)據(jù)就是[1,2,3,4,5,6,7,8,9,10]

3.現(xiàn)在選擇必須 年月日 或者年月日小時分鐘 不能單獨選小時或者分鐘

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何使用vuejs實現(xiàn)更好的Form validation?

    如何使用vuejs實現(xiàn)更好的Form validation?

    如何使用vuejs實現(xiàn)更好的Form validation?這篇文章主要介紹了vue-form插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • vue cli 全面解析

    vue cli 全面解析

    vue是一套構(gòu)建用戶界面的漸進(jìn)式框架。這篇文章主要介紹了vue cli的相關(guān)知識,本文給大家及時的非常全面,需要的朋友可以參考下
    2018-02-02
  • vue-tree-chart樹形組件的實現(xiàn)(含鼠標(biāo)右擊事件)

    vue-tree-chart樹形組件的實現(xiàn)(含鼠標(biāo)右擊事件)

    Vue-Tree-Chart,一個Vue.js2組件,本文就詳細(xì)的介紹一下vue-tree-chart樹形組件的實現(xiàn)(含鼠標(biāo)右擊事件),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 如何解決ElementUI導(dǎo)航欄重復(fù)點菜單報錯問題

    如何解決ElementUI導(dǎo)航欄重復(fù)點菜單報錯問題

    這篇文章主要介紹了如何解決ElementUI導(dǎo)航欄重復(fù)點菜單報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue實現(xiàn)固定位置顯示功能

    vue實現(xiàn)固定位置顯示功能

    這篇文章主要介紹了vue實現(xiàn)固定位置顯示功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Vue2 Vue3 Scoped 樣式穿透問題

    Vue2 Vue3 Scoped 樣式穿透問題

    Vue中scoped樣式的作用是通過在DOM結(jié)構(gòu)和CSS樣式上添加唯一標(biāo)記來實現(xiàn)樣式私有化和模塊化,這一功能是通過PostCSS轉(zhuǎn)譯實現(xiàn)的,總結(jié)了三條渲染規(guī)則:1. 為HTML DOM節(jié)點添加不重復(fù)的data屬性;2. 在每個CSS選擇器末尾添加當(dāng)前組件的data屬性選擇器
    2025-01-01
  • Element UI 上傳組件實現(xiàn)文件上傳并附帶額外參數(shù)功能

    Element UI 上傳組件實現(xiàn)文件上傳并附帶額外參數(shù)功能

    在使用 ElementUI 的上傳組件 el-upload 實現(xiàn)文件上傳功能時,如果單文件上傳是比較簡單的,但是在實際需求中,往往會在上傳文件時伴隨著一些其他參數(shù),怎么操作呢,下面通過示例代碼講解感興趣的朋友一起看看吧
    2023-08-08
  • 如何在Vue.js中實現(xiàn)標(biāo)簽頁組件詳解

    如何在Vue.js中實現(xiàn)標(biāo)簽頁組件詳解

    這篇文章主要給大家介紹了關(guān)于如何在Vue.js中實現(xiàn)標(biāo)簽頁組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Vue引入高德地圖并觸發(fā)實現(xiàn)多個標(biāo)點的示例詳解

    Vue引入高德地圖并觸發(fā)實現(xiàn)多個標(biāo)點的示例詳解

    這篇文章主要介紹了Vue引入高德地圖并觸發(fā)實現(xiàn)多個標(biāo)點,主要是在public下的index.html中引入地圖,引入組件設(shè)置寬高100%,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Vue實現(xiàn)點擊導(dǎo)航欄當(dāng)前標(biāo)簽后變色功能

    Vue實現(xiàn)點擊導(dǎo)航欄當(dāng)前標(biāo)簽后變色功能

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)點擊導(dǎo)航欄當(dāng)前標(biāo)簽后變色功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論