Vue.jsはタイムライン機能を実装します

Vue.jsはタイムライン機能を実装します

この記事では、タイムライン機能を実装するためのVue.jsの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

GitHub

タイムラインコンポーネントパッケージ

メイン.js

<テンプレート>
  <div class="timeline-main">
    <div class="タイムライン軸">
      <div class="axis-item"
        v-for="(time, index) in dateTimes"
        :key="インデックス">
        <div class="axis-item-tick"
          :class="{ 'axis-item-tick-active': インデックス === ハイライトインデックス }"
          @mouseenter="hoverIndex = インデックス"
          @mouseleave="ホバーインデックス = -1"
          @click="tickClick(時間、インデックス)">
        </div>
        <div class="軸項目ラベル"
          v-if="dateTimeIndexes.indexOf(index) >= 0">
          {{ 時間 }}
        <div class="axis-item-tip"
          v-if="インデックス === ハイライトインデックス || インデックス === ホバーインデックス">
          {{ 時間 }}
      </div>
    </div>
    <div class="タイムラインコントロール">
      <i class="メニューアイコンアイコン左"
        :class="{'menu-icon-disabled': 再生中}"
        @click="後方"></i>
      <i class="メニューアイコン"
        :class="{'icon-play': !再生中、'icon-pause': 再生中}"
        @click="再生を切り替える"
        @mouseleave="hoverIndex = -1"></i>
      <i class="メニューアイコンアイコン右"
        :class="{'menu-icon-disabled': 再生中}"
        @click="進む"></i>
      <i class="メニューアイコンアイコンアップ"
        :class="{'menu-icon-disabled': 再生中}"
        @click="speedSlow"></i>
      <i
        class="menu-icon speed">{{ options.speed }}</i>
      <i class="メニューアイコンアイコンダウン"
        :class="{'menu-icon-disabled': 再生中}"
        @click="speedQuick"></i>
    </div>
  </div>
</テンプレート>
<スクリプト>
import { dateFormat } from '../util/formatdate.js' // 日付形式 export default {
  データ() {
    戻る {
      intervalTimer: null, // タイマー dateTimeIndexes: [], // 日付リスト playing: false, // 再生 activeIndex: 0, // 現在の時間位置 hoverIndex: 0 // マウスが移動したときの時間位置 }
  },
  小道具: {
    オプション:
      タイプ: オブジェクト、
      デフォルト() {
        戻る {}
      }
    },
    日付時刻: {
      タイプ: 配列、
      デフォルト() {
        戻る []
      }
    },
    間隔: {
      タイプ: 数値、
      デフォルト() {
        100を返す
      }
    }
  },
  計算: {
    ハイライトインデックス() {
      戻る (
        (this.activeIndex === -1 && this.dateTimes.length - 1) ||
        this.activeIndex
      )
    }
  },
  時計:
    オプション:
      ハンドラ() {
        this.renderTimeline()
      },
      深い: 本当
    },
    再生中(){
      if (this.playing) {
        this.intervalTimer = setInterval(() => {
          this.activeIndex = (this.activeIndex + 1) % this.dateTimes.length
        }, this.options.speed * 1000)
      } それ以外 {
        if (this.intervalTimer) {
          クリア間隔(this.intervalTimer)
          this.intervalTimer = null
        }
      }
    },
    アクティブインデックス() {
      定数時間 = this.dateTimes[this.activeIndex].split(' ')[0]
      this.$emit('getDateFun', 時間)
    }
  },
  マウント() {
    this.renderTimeline()
    それを = これとする
    window.onresize = 関数 () {
      that.renderTimeline()
    }
  },
  フィルター:
    フォーマット日時(dateTime) {
      dateTime = dateFormat(dateTime, 'MM.dd')
      戻り日時
    }
  },
  メソッド: {
    /**
     * @name: タイムラインを初期化する*/
    レンダリングタイムライン() {
      // タイムラインの幅 const timelineWidth = this.$el.offsetWidth - 40
      //日付の数 const dateTimesSize = this.dateTimes.length
      // すべての時間を表示する場合、タイムラインの理想的な幅 const dateTimesWidth = dateTimesSize * this.interval
      // タイムラインの幅が理想的な幅より小さい場合 if (timelineWidth >= dateTimesWidth) {
        this.dateTimeIndexes = this.dateTimes.map((dateTime, インデックス) => {
          インデックスを返す
        })
        戻る
      }
      // 現在のタイムラインの幅は、最大で何個の日付ティックを収容できるか const maxTicks = Math.floor(timelineWidth / this.interval)
      // 間隔の目盛りの数 const gapTicks = Math.floor(dateTimesSize / maxTicks)
      // 表示する日付インデックスを記録します this.dateTimeIndexes = []
      (t = 0; t <= maxTicks; t++) の場合 {
        this.dateTimeIndexes.push(t * ギャップティック)
      }
      定数len = this.dateTimeIndexes.length
      // 最後の項目は特別な処理が必要です if (len > 0) {
        定数 lastIndex = this.dateTimeIndexes[len - 1]
        (lastIndex + gapTicks > dateTimesSize - 1) の場合 {
          this.dateTimeIndexes[len - 1] = dateTimesSize - 1
        } それ以外 {
          this.dateTimeIndexes.push(dateTimesSize - 1)
        }
      }
    },

    /**
     * @name: クリックスケール * @param {time}
     * @param {インデックス}
     */
    tickClick(時間, インデックス) {
      if (this.playing) {
        戻る
      }
      this.activeIndex = インデックス
    },

    /**
     * @name: 再生と一時停止 */
    トグル再生() {
      this.playing = !this.playing
    },

    /**
     * @name: 時間が一日戻る*/
    後方(){
      if (this.playing) {
        戻る
      }
      this.activeIndex = this.activeIndex - 1
      (this.activeIndex === -1)の場合{
        this.activeIndex = this.dateTimes.length - 1
      }
    },

    /**
     * @name: 時間が一日進む*/
    フォワード() {
      if (this.playing) {
        戻る
      }
      this.activeIndex = (this.activeIndex + 1) % this.dateTimes.length
    },

    /**
     * @name: 遅くなる */
    スピードが遅い() {
      if (this.playing || this.options.speed >= this.options.speedMax) {
        戻る
      }
      this.options.speed = this.options.speed + 1
    },

    /**
     * @name: スピードアップ */
    スピードクイック() {
      if (this.playing || this.options.speed <= 1) {
        戻る
      }
      this.options.speed = this.options.speed - 1
    }
  }
}
</スクリプト>
<スタイル スコープ lang="scss">
.timeline-main {
  パディング: 10px;
  ボックスのサイズ: 境界線ボックス;
  .タイムライン軸{
    位置: 相対的;
    ディスプレイ: フレックス;
    コンテンツの両端揃え: スペースを空ける;
    パディング: 8px 0;
    &::前に {
      コンテンツ: '';
      幅: 100%;
      高さ: 10px;
      位置: 絶対;
      左: 0;
      下: 8px;
      表示: インラインブロック;
      背景: rgba(0, 0, 0, 0.5);
    }
    .軸項目{
      位置: 相対的;
      ディスプレイ: フレックス;
      flex-direction: 列;
      アイテムの位置を中央揃えにします。
      .axis-item-tick {
        表示: インラインブロック;
        幅: 4px;
        高さ: 20px;
        背景: rgba(0, 0, 0, 0.5);
        遷移: 背景 0.3 秒;
        カーソル: ポインタ;
        &:ホバー{
          背景: #000;
        }
      }
      .axis-item-tick-active {
        背景: #000;
      }
      .axis-item-label {
        位置: 絶対;
        下: -30px;
        空白: ラップなし;
      }
      .axis-item-tip {
        位置: 絶対;
        上: -25px;
        パディング: 2px 6px;
        境界線の半径: 2px;
        背景: rgba(0, 0, 0, 0.5);
        空白: ラップなし;
        色: #fff;
      }
    }
  }
  .タイムラインコントロール{
    上マージン: 40px;
    テキスト配置: 中央;
    私 {
      カーソル: ポインタ;
      表示: インラインブロック;
      フォントスタイル: 通常;
    }
    .メニューアイコン{
      フォントサイズ: 20px;
      幅: 20px;
      高さ: 20px;
      背景サイズ: カバー;
      背景繰り返し: 繰り返しなし;
      &.アイコン左{
        背景画像: url('../assets/icon-left.png');
      }

      &.アイコン右{
        背景画像: url('../assets/icon-right.png');
      }

      &.アイコン再生{
        背景画像: url('../assets/icon-play.png');
      }

      &.アイコン一時停止{
        背景画像: url('../assets/icon-pause.png');
      }
      &.アイコンアップ{
        背景画像: url('../assets/icon-up.png');
      }

      &.アイコンダウン{
        背景画像: url('../assets/icon-down.png');
      }
      &.メニューアイコンが無効{
        カーソル: ドロップなし;
        不透明度: 0.5;
      }
    }
  }
}
</スタイル>

コンポーネントの使用

アプリ.vue

<テンプレート>
  <div>
    <h2
      スタイル="margin:0;text-align:center;">
      {{this.date}}
    </h2>
    <メイン:options="オプション"
      :dateTimes="日付時刻"
      @getDateFun="getDateFun"
      :interval="間隔"></メイン>
  </div>
</テンプレート>

<スクリプト>
'./util/formatdate.js' から { dateFormat } をインポートします。
'./components/Main' から Main をインポートします。
エクスポートデフォルト{
  名前: 'アプリ',
  データ() {
    戻る {
      日付: ''、
      オプション:
        speed: 1, // 速度 speedMax: 10 // 最高速度},
      interval: 20, // 日の間隔 dateTimes: [
        '03-04'、
        '03-05'、
        '03-06'、
        '03-07'、
        '03-08'、
        '03-09'、
        '03-10'、
        '03-11'、
        '03-12'、
        '03-13'
      ]
    }
  },
  コンポーネント:
    主要
  },
  マウント() {
    // 過去10日間の日付を取得します。let list = []
    (i = 0; i < 10; i++ とします) {
      リスト.unshift()
        日付フォーマット(
          新しい日付(
            新しい日付()。setDate(新しい日付()。getDate() - i)
          ).toLocaleDateString(),
          「MM-dd」
        )
      )
    }
    this.date = リスト[0]
    this.dateTimes = リスト
  },
  メソッド: {
    // 親コンポーネントから渡された値を受け取る getDateFun(time) {
      コンソール.log(時間)
      this.date = 時間
    },
  }
}
</スクリプト>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueは水平タイムラインを実装する
  • Vueはタイムライン機能を実装する
  • 2列の水平タイムラインを実装するためのVueサンプルコード
  • VUEはタイムライン再生コンポーネントを実装します
  • vue+canvasでタイムラインを描く方法
  • Vue+swiperでタイムライン効果を実現
  • Vueは物流タイムライン効果を実現します
  • Vue タイムライン vue-light-timeline 使用方法
  • Vueは移動可能な水平タイムラインを実装します
  • Vueはタイムライン効果を実装する

<<:  Linux システムコマンドのメモ

>>:  MySQLでのカスタムパラメータの使用に関する詳細な説明

推薦する

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

Vue はクリックフリップ効果を実現します

参考までに、vueを使用してクリックフリップエフェクトを簡単に実装します。具体的な内容は次のとおりで...

Nodejs 配列キューと forEach アプリケーションの詳細な説明

この記事では、Nodejs 開発プロセスで遭遇する配列の特性によって発生する問題と解決策、および配列...

CUDA10.0 のインストールと Ubuntu での問題

Tensorflow バージョンと Cuda および CUDNN の対応: https://tens...

MYSQL8.0.13 無料インストール版 設定チュートリアル例 詳細説明

1. ダウンロード、例として8.0を取り上げますダウンロードアドレス: https://dev.my...

Springboot プロジェクトの Docker-compose イメージリリースプロセス分析

導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...

MySQL データベースの show processlist コマンドの使用の分析

実際のプロジェクト開発では、多数のクエリや挿入、特にマルチスレッド挿入など、データベースに大きな負荷...

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...

HTML テーブル マークアップ チュートリアル (42): テーブル ヘッダーの水平方向の配置属性 ALIGN

水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...

163 メールボックスログインボックスインタラクティブデザインの改善体験と共有

LOFTER のコンテストで、ログイン ボックスを再設計できると言及されているのを見ました。過去 2...

Amap を使用した React 実装例 (react-amap)

React の PC 版は Amap を使用するようにリファクタリングされました。情報を検索したと...

JavaScript は setTimeout を使用してカウントダウン効果を実現します

JavaScript ネイティブ コードの記述能力を高め、setTimeout() の使用を強化する...

Mysqlリモート接続構成を実装する2つの方法

Mysqlリモート接続構成を実装する2つの方法会社で働いていると、誰かのコンピュータに保存されている...

MySQL は、現在のデータ テーブル内のすべての時間に対して指定された時間間隔を増加または減少させます (推奨)

DATE_ADD() 関数は、指定された時間間隔を日付に追加します。現在のテーブル内のすべてのデー...

jQueryはフォーム検証を実装する

jQueryを使用してフォーム検証を実装します。参考までに、具体的な内容は次のとおりです。登録.ht...