ホームページ >ウェブフロントエンド >jsチュートリアル >vueモバイル端末のUIフレームワークでサイドメニュープラグイン効果を実現

vueモバイル端末のUIフレームワークでサイドメニュープラグイン効果を実現

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-11 15:36:523432ブラウズ

今回は、サイドメニュープラグインエフェクトを実装するためのvueモバイルターミナルのUIフレームワークについて説明します。 サイドメニュープラグインを実装するためのvueモバイルターミナルのUIフレームワークの注意点は次のとおりです。実際のケースですので、見てみましょう。

最近のインタビューで、フロントエンド プログラマの多くはプラグインを作成した経験がなく、基本的には Baidu で作業していることがわかりました。そこで私は、コンポーネントを書いたことのない兄弟たちにプラグインの書き方を段階的に教える一連の記事を書くつもりです。この一連の記事はすべて VUE に基づいており、コアの内容は同じです。理解した後は、React、Angular、または小さなプログラムなどのコンポーネントにすぐに書き直すことができます。この記事は最初の記事で、QQ に似たサイド メニュー コンポーネントについて説明します。

作り始めます

DOM構造

全体的な構造には 2 つのコンテナがあるはずです: 1. メニュー コンテナ 2. メイン ページ コンテナ; したがって、現在の DOM 構造は次のようになります:

<template>
 <p class="r-slide-menu">
 <p class="r-slide-menu-wrap"></p>
 <p class="r-slide-menu-content"></p>
 </p>
</template>
メニュー コンテンツとテーマ コンテンツをカスタマイズ可能にするために、2 つのコンテナに 2 つのスロットを追加します。メイン コンテンツはデフォルトのスロットに配置され、メニューはメニュー スロットに配置されます。

CSSスタイル

私のプロジェクトでは scss を使用しました。コードは次のとおりです:

<template>
 <p class="r-slide-menu">
 <p class="r-slide-menu-wrap">
  <slot name="menu"></slot>
 </p>
 <p class="r-slide-menu-content">
  <slot></slot>
 </p>
 </p>
</template>
この時点で、

絶対に配置された

コンテナ

が 2 つあります。

javascript

それでは、正式なコードの作成を開始しましょう。まず、対話ロジックを明確にしましょう:

指を左右にスライドさせると、メインコンテナもメニューコンテナも指の動きに合わせて動きます
  • 指の移動距離がメニューコンテナの幅を超えると、ページを右にスライドし続けることができなくなります
  • 指が左に移動してメニューとページ間の移動距離がゼロに戻ると、ページはそれ以上左に移動できなくなります
  • 画面から指を離したときに、ページのスライドが一定の距離(メニュー全体の幅の割合)を超えるとメニュー全体が開き、ページのスライドが一定の距離未満の場合はメニューが閉じます
  • したがって、コンポーネントを使用するときにパラメータを入力して、メニューの幅と、メニューを閉じるトリガーとなる重要な値の比率、およびメニューの幅をカスタマイズできるようにする必要があります。同時に、タッチ イベントを追加する必要があります。最後に、メニュー コンテナとメイン コンテナにそれぞれの動きを制御するスタイルを追加します
<style lang="scss">
@mixin one-screen {
 position: absolute;
 left:0;
 top:0;
 width:100%;
 height:100%;
 overflow: hidden;
}
.r-slide-menu{
 @include one-screen;
 &-wrap, &-content{
 @include one-screen;
 }
 &-transition{
 -webkit-transition: transform .3s;
 transition: transform .3s;
 }
}
</style>
。 次に、コアの touch

イベント処理

関数を実装しましょう。イベントのロジックは次のとおりです:

指が押された瞬間、指が触れた点と現在のメインコンテナの位置が記録されます
  1. 指が動くと移動点の位置が取得されます
  2. 現在の指点の移動の X 軸と Y 軸の距離を計算します。X の移動距離が Y の移動距離より大きい場合は水平方向の移動と判断され、それ以外の場合は垂直方向の移動となります
  3. 。 水平方向に移動する場合、現在の移動距離が妥当な移動範囲 (0 ~ メニュー幅) 内であると判断され、その場合、2 つのコンテナの位置が変更されます (移動中にページ上の他のイベントがトリガーされるのを防ぎます)。 )
  4. 指が画面から離れる: 累積移動距離が臨界値を超えると、アニメーションを使用してメニューが開き、そうでない場合はメニューを閉じます
  5. <template>
     <p class="r-slide-menu">
     <p class="r-slide-menu-wrap" :style="wrapStyle">
      <slot name="menu"></slot>
     </p>
     <p class="r-slide-menu-content" :style="contentStyle"
     @touchstart="touchstart"
     @touchmove="touchmove"
     @touchend="touchend">
      <slot></slot>
     </p>
     </p>
    </template>
    <script>
    export default {
     props: {
     width: {
      type: String,
      default: '250'
     },
     ratio: {
      type: Number,
      default: 2
     }
     },
     data () {
     return {
      isMoving: false,
      transitionClass: '',
      startPoint: {
      X: 0,
      y: 0
      },
      oldPoint: {
      x: 0,
      y: 0
      },
      move: {
      x: 0,
      y: 0
      }
     }
     },
     computed: {
     wrapStyle () {
      let style = {
      width: `${this.width}px`,
      left: `-${this.width / this.ratio}px`,
      transform: `translate3d(${this.move.x / this.ratio}px, 0px, 0px)`
      }
      return style
     },
     contentStyle () {
      let style = {
      transform: `translate3d(${this.move.x}px, 0px, 0px)`
      }
      return style
     }
     },
     methods: {
     touchstart (e) {},
     touchmove (e) {},
     touchend (e) {}
     }
    }
    上記のコア コードには setTransition があります。 この関数の機能は、指が離れたときにコンテナ要素に遷移属性を追加して、コンテナが閉じるアニメーションまたは開くアニメーションを完了するための遷移アニメーションを持つようにすることです。したがって、コンテナの遷移属性を削除する必要があります。回避しようと指を押し下げた瞬間に、スライドの過程で容器と指が滑るのが遅れてしまうという嫌な経験があります。 最後に注意しておきますが、コード内でtranslateの代わりにtranslate3dを使用する理由は、携帯電話でのアニメーションの3Dアクセラレーションを有効にし、アニメーションの滑らかさを向上させるためです。最終的なコードは次のとおりです:
  6. touchstart (e) {
     this.oldPoint.x = e.touches[0].pageX
     this.oldPoint.y = e.touches[0].pageY
     this.startPoint.x = this.move.x
     this.startPoint.y = this.move.y
     this.setTransition()
    },
    touchmove (e) {
     let newPoint = {
     x: e.touches[0].pageX,
     y: e.touches[0].pageY
     }
     let moveX = newPoint.x - this.oldPoint.x
     let moveY = newPoint.y - this.oldPoint.y
     if (Math.abs(moveX) < Math.abs(moveY)) return false
     e.preventDefault()
     this.isMoving = true
     moveX = this.startPoint.x * 1 + moveX * 1
     moveY = this.startPoint.y * 1 + moveY * 1
     if (moveX >= this.width) {
     this.move.x = this.width
     } else if (moveX <= 0) {
     this.move.x = 0
     } else {
     this.move.x = moveX
     }
    },
    touchend (e) {
     this.setTransition(true)
     this.isMoving = false
     this.move.x = (this.move.x > this.width / this.ratio) ? this.width : 0
    },
    setTransition (isTransition = false) {
     this.transitionClass = isTransition ? 'r-slide-menu-transition' : ''
    }
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

AngularJS でルーティング ページをリロードする方法

要素 UI バインディング @keyup イベントが無効なのはなぜですか?

以上がvueモバイル端末のUIフレームワークでサイドメニュープラグイン効果を実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。