最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue + any-touch實(shí)現(xiàn)一個(gè)iscroll 實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果

 更新時(shí)間:2019年04月08日 08:53:20   作者:鐵皮飯盒  
這篇文章主要介紹了vue + any-touch實(shí)現(xiàn)一個(gè)iscroll實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

https://github.com/383514580/any-touch

先看demo

demo

說(shuō)點(diǎn)濕的

 

iscroll其實(shí)代碼量挺大的(近2100行, 還有另一個(gè)類似的庫(kù) betterScroll 他的代碼量和iscroll差不多, 因?yàn)樵矶际且粯拥?, 閱讀他們的代碼

發(fā)現(xiàn)里面很多邏輯 其實(shí)都是在做手勢(shì)判斷 , 比如拖拽(pan), 和劃(swipe), 還有部分元素(表單元素等)需要單獨(dú)判斷點(diǎn)擊(tap), 這部分代碼接近1/3, 所以我決定用自己開(kāi)發(fā)的手勢(shì)庫(kù)(any-touch)實(shí)現(xiàn)一個(gè)iscroll, 同時(shí)配合文字讓大家 最終都可以以最少的代碼實(shí)現(xiàn)一個(gè)iscroll .

vue

觀察了一段時(shí)間推薦排行, 發(fā)現(xiàn)大家都對(duì) vue 感興趣, 所以本次的"iscroll"將以vue組件的形式實(shí)現(xiàn), 同時(shí)我也希望借助vue強(qiáng)大的抽象能力, 讓最終代碼控制在500行以內(nèi) , 希望大家喜歡.

本文是個(gè)系列文章

本文先實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà), 因?yàn)檫@2部分都依賴 手勢(shì) , 借此用最少的代碼先實(shí)現(xiàn)最核心的功能, 也讓大家對(duì)后續(xù)的內(nèi)容有信心.

簡(jiǎn)單說(shuō)下iscroll原理

添加2個(gè)div, 最內(nèi)的div(子div)通過(guò)設(shè)置css的transform的translate的值來(lái)模擬系統(tǒng)滾動(dòng)效果.

說(shuō)完邏輯再說(shuō)代碼

拖拽的時(shí)候通過(guò)panstart/panmove手勢(shì)返回的 位移增量 (deltaX/Y)進(jìn)行位置變化, 同時(shí)關(guān)閉動(dòng)畫(huà)效果.
發(fā)生快速劃(swipe)的時(shí)候, 開(kāi)啟動(dòng)畫(huà), 同時(shí)通過(guò)計(jì)算 目標(biāo)位置 和 動(dòng)畫(huà)時(shí)間 來(lái)觸發(fā)滑動(dòng)動(dòng)畫(huà).
代碼

<div class="any-scroll-view">
  <div ref="body" :style="bodyStyle" class="any-scroll-view__body"><slot></slot></div>
</div>
.any-scroll-view {
  position: relative;
  width: 100%;
  height: 90vh; 
  overflow: hidden;

  &__body {
    transition-timing-function: cubic-bezier(0.1, 0.57, 0.1, 1);
    background: #eee;
    position: absolute;
    width: 100%;
    height: 100%;
  }
}
import AnyTouch from 'any-touch';
export default {
  name: 'any-scroll-view',

  props: {
    // 減速度, 單位px/s²
    acceleration: {
      type: Number,
      default: 3600
    }
  },

  data() {
    return {
      scrollTop: 0,
      scrollLeft: 0,
      transitionDuration: 300
    };
  },

  computed: {
    bodyStyle() {
      return {
        transitionDuration: `${this.transitionDuration}ms`,
        transform: `translate(${this.scrollLeft}px, ${
          this.scrollTop
        }px)`
      };
    }
  },

  mounted() {
    const at = new AnyTouch(this.$el);

    // 第一次觸碰
    at.on('inputstart', (ev) => {
      this.stopRoll();
    });

    // 拖拽開(kāi)始
    at.on('panstart', (ev) => {
      this.move(ev);
    });

    // 拖拽中
    at.on('panmove', (ev) => {
      this.move(ev);
    });

    // 快速滑動(dòng)
    at.on('swipe', (ev) => {
      this.decelerate(ev);
    });

    this.$on('hook:destroy', () => {
      at.destroy();
    });
  },

  methods: {
    // https://github.com/nolimits4web/swiper/blob/master/dist/js/swiper.esm.js#L87
    // https://github.com/nolimits4web/Swiper/blob/master/src/utils/utils.js#L25
    getCurrentTranslate() {
      const style = getComputedStyle(this.$refs.body, null);
      const { transform } = style;
      const array = transform.match(/(\-?)(\d)+(\.\d{0,})?/g);
      return { x: Math.round(array[4]), y: Math.round(array[5]) };
    },

    stopRoll() {
      const { x, y } = this.getCurrentTranslate();
      this.moveTo({ scrollTop: y, scrollLeft: x });
    },

    /**
     * 移動(dòng)body
     * @param {Object} 拖拽產(chǎn)生的數(shù)據(jù)
     * @param {Number} deltaX: x軸位移變化
     * @param {Number} deltaY: y軸位移變化
     */
    move({ deltaX, deltaY }, transitionDuration = 0) {
      this.transitionDuration = transitionDuration;
      this.scrollLeft += deltaX;
      this.scrollTop += deltaY;
    },

    /**
     * 移動(dòng)到
     */
    moveTo({ scrollTop, scrollLeft }, transitionDuration = 0) {
      this.transitionDuration = transitionDuration;
      this.scrollLeft = scrollLeft;
      this.scrollTop = scrollTop;
    },

    /**
     * 拖拽松手后減速移動(dòng)至停止
     * velocityX/Y的單位是px/ms
     */
    decelerate(ev) {
      const directionSign = { up: -1, right: 1, down: 1, left: -1 }[
        ev.direction
      ];

      // Top? | Left?
      let SCROLL_SUFFIX = 'Top';
      // x ? | y?
      let AXIS_SUFFIX = 'Y';
      if (ev.velocityX > ev.velocityY) {
        SCROLL_SUFFIX = 'Left';
        AXIS_SUFFIX = 'X';
      }

      // 減速時(shí)間, 單位ms
      // t = (v₂ - v₁) / a
      const velocity = ev[`velocity${AXIS_SUFFIX}`];
      this.transitionDuration = Math.round(
        ((velocity * 1000) / this.acceleration) * 1000
      );

      // 滑動(dòng)距離
      // s = (v₂² - v₁²) / (2 * a)
      const scrollAxis = `scroll${SCROLL_SUFFIX}`;
      this[scrollAxis] +=
        directionSign *
        Math.round(
          Math.pow(velocity * 1000, 2) / (2 * this.acceleration)
        );
    }
  }
};

總結(jié)

以上所述是小編給大家介紹的vue + any-touch實(shí)現(xiàn)一個(gè)iscroll 實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue中el-table兩個(gè)表尾合計(jì)行聯(lián)動(dòng)同步滾動(dòng)條實(shí)例代碼

    vue中el-table兩個(gè)表尾合計(jì)行聯(lián)動(dòng)同步滾動(dòng)條實(shí)例代碼

    項(xiàng)目開(kāi)發(fā)中遇到一個(gè)比較兩個(gè)form差異的需求,但當(dāng)item過(guò)多就需要滾動(dòng)條,下面這篇文章主要給大家介紹了關(guān)于vue中el-table兩個(gè)表尾合計(jì)行聯(lián)動(dòng)同步滾動(dòng)條的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • vue-cli實(shí)現(xiàn)多頁(yè)面多路由的示例代碼

    vue-cli實(shí)現(xiàn)多頁(yè)面多路由的示例代碼

    本篇文章主要介紹了vue-cli實(shí)現(xiàn)多頁(yè)面多路由的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • vue自定義開(kāi)發(fā)滑動(dòng)圖片驗(yàn)證組件

    vue自定義開(kāi)發(fā)滑動(dòng)圖片驗(yàn)證組件

    這篇文章主要為大家詳細(xì)介紹了vue自定義開(kāi)發(fā)滑動(dòng)圖片驗(yàn)證組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Electron vue的使用教程圖文詳解

    Electron vue的使用教程圖文詳解

    Electron相當(dāng)于一個(gè)瀏覽器的外殼,可以把網(wǎng)頁(yè)程序嵌入到殼里面,可以運(yùn)行在桌面上的一個(gè)程序,可以把網(wǎng)頁(yè)打包成一個(gè)在桌面運(yùn)行的程序。這篇文章主要介紹了electron-vue多顯示屏下將新窗口投放是其他屏幕 ,需要的朋友可以參考下
    2019-07-07
  • vue和小程序項(xiàng)目中使用iconfont的方法

    vue和小程序項(xiàng)目中使用iconfont的方法

    這篇文章主要介紹了vue中和小程序中使用iconfont的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Vue中使用Sortable的示例代碼

    Vue中使用Sortable的示例代碼

    這篇文章主要介紹了Vue中使用Sortable的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 利用Vue3和Plotly.js創(chuàng)建交互式表格

    利用Vue3和Plotly.js創(chuàng)建交互式表格

    在數(shù)據(jù)分析和可視化領(lǐng)域,經(jīng)常需要以表格的形式展示數(shù)據(jù),Plotly.js 是一款功能強(qiáng)大的 JavaScript 庫(kù),不僅可以創(chuàng)建交互式圖表,還可以動(dòng)態(tài)生成 HTML 表格,本文給大家介紹了如何用Vue3和Plotly.js創(chuàng)建交互式表格,需要的朋友可以參考下
    2024-07-07
  • laravel5.4+vue+element簡(jiǎn)單搭建的示例代碼

    laravel5.4+vue+element簡(jiǎn)單搭建的示例代碼

    本篇文章主要介紹了laravel5.4+vue+element簡(jiǎn)單搭建的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • vue異步請(qǐng)求數(shù)據(jù)重新渲染方式

    vue異步請(qǐng)求數(shù)據(jù)重新渲染方式

    這篇文章主要介紹了vue異步請(qǐng)求數(shù)據(jù)重新渲染方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • vue2.0實(shí)戰(zhàn)之使用vue-cli搭建項(xiàng)目(2)

    vue2.0實(shí)戰(zhàn)之使用vue-cli搭建項(xiàng)目(2)

    這篇文章主要為大家詳細(xì)介紹了vue2.0實(shí)戰(zhàn)第二篇使用vue-cli搭建項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

连江县| 黑山县| 泌阳县| 怀化市| 定结县| 体育| 武清区| 新平| 固阳县| 额尔古纳市| 临安市| 宁德市| 永泰县| 德格县| 辽源市| 贵阳市| 阿鲁科尔沁旗| 罗源县| 郑州市| 武乡县| 淮阳县| 澄城县| 松滋市| 四川省| 恭城| 通辽市| 延寿县| 芦溪县| 黄冈市| 华宁县| 大足县| 上林县| 贵阳市| 灵丘县| 陵川县| 军事| 双江| 邵武市| 浙江省| 珲春市| 禄劝|