ホームページ ウェブフロントエンド jsチュートリアル 慣性スライド&リバウンドVueナビゲーションバーをモバイル端末に実装する方法

慣性スライド&リバウンドVueナビゲーションバーをモバイル端末に実装する方法

Mar 28, 2018 pm 05:16 PM
ナビゲーション 滑り台

今回はモバイル端末に慣性スライド&リバウンドVueナビゲーションバーを実装する方法を紹介します。モバイル端末に慣性スライド&リバウンドVueナビゲーションバーを実装するための注意事項を紹介します。見てください。

私は少し前に、モバイル用のアダプティブ スライディング Vue ナビゲーション バー コンポーネントを作成しました。これにはある程度の実用性があり、誰でも使用できるかもしれないと考えていました (もちろん、大手の人が自分たちでより適切に作成すれば、その必要はありません)。 ) ということで、この 2 日間で整理しました。しばらくして、npm と GitHub に公開されました。必要な学生は、npm install ly- をクリックしてください。 tab -S または をプロジェクト内で使用します。具体的な使用法については以下で説明します。 <code>npm install ly-tab -S 或者 yarn add ly-tab 使用,具体用法下面会讲到。

好了,先看看效果吧

 

好的,开始废话了,实习差不多3个月了,这段时间跟着导师大佬也有接触过一些项目,也学到了不少东西,接触到的项目基本都是移动端项目,而且框架主要用的是Vue。做过移动端或者用过移动端APP(呸,屁话)的同学肯定会发现很多时候都会有类似上面这种有滑动效果的tab导航栏,相信大家肯定在掘金的首页就看到过。

实现思路

当时的项目中恰好也有这种需求,于是我想偷个懒直接使用 Mint-ui 组件库里现成的tabbar和tab-item组件,github上看了下它的实现源码发现只实现了切换功能但不能滑动,so,懒偷不了就只好自己写咯。

其实单单实现tab切换功能是不难的,看mint-ui使用的其实是v-model语法糖,就像下面这样

<ly-tab v-model="selected">
  <ly-tab-item></ly-tab-item>
</ly-tab>
ログイン後にコピー

下面是拆解v-model语法糖的实现

<ly-tab :value="selected" @input="selected = arguments[0]">
  <ly-tab-item></ly-tab-item>
</ly-tab>
ログイン後にコピー

然后只需要在tab-item组件内实现当自己被点击时,让其父组件也就是ly-tab组件 $emit 一个 input 事件,并传入一个标识每个tab-item的唯一值作为第一个参数,关于这个唯一值,mint-ui的做法需要用户自己手动给每个tab-item通过props传入一个唯一的id值,如下为Mint UI的Demo实现:

<mt-tabbar v-model="selected">
  <mt-tab-item id="订单">
    <img slot="icon" src="http://placehold.it/100x100">
    <span slot="label">订单</span>
  </mt-tab-item>
 </mt-tabbar>
ログイン後にコピー

但是,在看过大佬的 vue当中设计Tabbar插件时的思考 后觉得文章中的那种做法会更好一点,因为对于父组件 来说,只要知道点击的是哪个 <ly-tab-item/> 就行了啊,那么我把每个 <ly-tab-item/> 组件的 index 索引值作为它的唯一标识值不就行了吗。

那么问题来了:怎么在tab-item组件内部取到自己的 index 值呢?

首先ly-tab组件的 $children 是一个数组,由于每个 <ly-tab-item/> 组件是依次创建并通过push的方式插入该数组,所以在每个 <ly-tab-item/> 组件创建并push到 $children 时,对于 <ly-tab-item/> 组件来说 (this.$parent.$children.length || 1) - 1 不就是每个 <ly-tab-item/> 组件唯一的 index 值了啊。实际上,到这里点击切换的功能就已经可以实现了。下面贴上tab-item.vue中的代码:

tab-item.vue

<template>
 <a class="ly-tab-item"
    :style="$parent.value === id ? activeStyle : {}"
    @click="$parent.$emit(&#39;input&#39;, id)">
  <p class="ly-tab-item-icon"><slot name="icon"></slot></p>
  <p class="ly-tab-item-label"><slot></slot></p>
 </a>
</template>
<script>
export default {
 name: 'LyTabItem',
 computed: {
  activeStyle () {
   return {
    color: this.$parent.activeColor,
    borderColor: this.$parent.activeColor,
    borderWidth: this.$parent.lineWidth,
    borderBottomStyle: 'solid'
   }
  }
 },
 data () {
  return {
   id: (this.$parent.$children.length || 1) - 1
  }
 }
}
</script>
<style lang="scss">
.ly-tab-item {
 text-decoration: none;
 text-align: center;
 .ly-tab-item-icon {
  margin: 0 auto 5px;
 }
 .ly-tab-item-label {
  margin: 0 auto 10px;
  line-height: 18px;
 }
}
</style>
ログイン後にコピー

关于tab.vue中触摸滑动、惯性滑动以及回弹等效果实现在这里就没办法详细讲了,有兴趣的小伙伴可以到github上查看, 点我去github查看项目 ,如果想看示例demo可以clone项目到本地跑一跑,写得不好的地方欢迎大家指正,如果觉得用得着或者能够帮到大家的话最好了,那也不妨点个star吧,哈哈......

哎哎哎,不对不对,怎么就开始求star了,最重要的还没讲呢—— ly-tab怎么使用呢?

如何使用 ly-tab

小伙伴们如果想使用ly-tab,需要在你的项目中通过npm或者yarn下载安装:

npm install ly-tab -S
or
yarn add ly-tab
ログイン後にコピー

接着在main.js中全局引入:

import Vue from 'vue';
import LyTab from 'ly-tab';
Vue.use(LyTab);
ログイン後にコピー

之后你就可以在你项目中任意使用 <ly-tab></ly-tab> <ly-tab-item></ly-tab-item>

それでは、まず効果を見てみましょう

さて、ナンセンスな話を始めましょう。私はほぼ 3 か月間インターンをしてきましたが、この間、私が関わったプロジェクトは基本的にモバイル プロジェクトでした。 , フレームワークは主にVueが使われています。モバイル デバイスで作業したり、モバイル アプリを使用したことのある学生は (まあ、でたらめです)、上記のようなスライド効果のあるタブ ナビゲーション バーが何度も存在することに気づくでしょう。きっと、このバーのホームページで見たことがあるはずです。ナゲット。 🎜🎜🎜実装アイデア🎜🎜🎜当時のプロジェクトにはたまたまこのような需要があったため、面倒になって既製のタブバーを直接使用したいと考えていました。 Mint-uiコンポーネントライブラリ そしてtab-itemコンポーネントですが、githubで実装ソースコードを見てみると、切り替え機能を実装しているだけでスライドができないので、自分で書くのがめんどくさいです。 🎜🎜実際、タブ切り替え機能の実装は難しくありません。Mint-uiでは以下に示すようにv-model構文sugarを使用しています🎜
<ly-tab v-model="selected" fixBottom>
 <!-- selected是你自己定义的一个在data中用于存放当前tab-item的索引值的变量 -->
 <ly-tab-item v-for="(item, index) in tabList" :key="index">
  {{item.itemName}}
 </ly-tab-item>
</ly-tab>
ログイン後にコピー
ログイン後にコピー
🎜以下はv-model構文sugarの実装を逆アセンブリしたものです🎜rrreee🎜そして、これを tab-item コンポーネントに実装する必要があります。クリックされたときに、その親コン​​ポーネント (ly-tab コンポーネント) に入力イベントを $emit させ、各タブを識別する一意の値を渡します。この一意の値について、mint-ui では、ユーザーが props を通じて各タブ項目に一意の ID 値を手動で渡す必要があります。以下は、Mint UI のデモ実装です: 🎜rrreee🎜 ただし、その後。 Tabbar プラグインを設計するときにそれについて考えた後、親コンポーネント がどちらであるかがわかっている限り、この記事のアプローチの方が良いと感じました。 <ly-tab-item is clicked /> であれば、各 <ly-tab-item/> のインデックス値を使用できます。一意の識別値として。 🎜🎜次に問題は、tab-item コンポーネント内で独自のインデックス値を取得する方法です。🎜🎜 まず第一に、ly-tab コンポーネントの $children は配列であるためです。 ;ly- tab-item/> コンポーネントは順番に作成され、プッシュによって配列に挿入されるため、各 <ly-tab-item/> コンポーネントが作成されて $children にプッシュされます。 、 <ly-tab-item/> コンポーネントの場合、 (this.$parent.$children.length || 1) - 1 は各 < に対してのみではありません。 ly-tab-item /> コンポーネントの一意のインデックス値。実際、ここではクリックしてスイッチ機能をすでに実装できます。以下の tab-item.vue にコードを貼り付けます: 🎜🎜tab-item.vue🎜rrreee🎜 tab.vue でのタッチ スライド、慣性スライド、リバウンド効果の実装については、ここでは詳しく説明できません。興味のある方は、github でプロジェクトをチェックしてください。サンプルのデモを見たい場合は、プロジェクトをローカルに複製して実行してください。あまりよく書かれていませんが、役に立つ、または役立つと思われる場合は、星をクリックしてください (笑)。まだ説明されていません - ly-tabの使い方は? 🎜🎜🎜ly-tab の使用方法🎜🎜🎜 ly-tab を使用したい場合は、npm または Yarn を介してプロジェクトにダウンロードしてインストールする必要があります: 🎜 rrreee🎜その後、main.js でグローバルに導入します: 🎜rrreee🎜その後、<ly-tab></ly-tab> を使用できます。 ly-tab-item> コンポーネントを再度導入する必要はありません🎜🎜🎜栗🎜🎜;
<ly-tab v-model="selected" fixBottom>
 <!-- selected是你自己定义的一个在data中用于存放当前tab-item的索引值的变量 -->
 <ly-tab-item v-for="(item, index) in tabList" :key="index">
  {{item.itemName}}
 </ly-tab-item>
</ly-tab>
ログイン後にコピー
ログイン後にコピー

上面的栗子其实只是tabbar的实现,大家项目中肯定还需要做视图区的切换,在这里简单说一下我目前的做法:

  • 使用Vue-router做router-view的切换

  • 使用动态组件(可以配合异步组件使用)

我暂时的话好像只用过这两种,不知道大家还有其他什么更好的方法,欢迎分享~

配置项

可以给 <ly-tab></ly-tab> 组件传入一些配置项以自定义你想要的效果

配置项 类型 描述 默认值
lineWidth Number fixBottom为false时tabbar底部border-width 1px
activeColor String 激活状态下字体color以及border-bottom-color red
fixBottom Boolean 是否固定在视图底部(为false时不可滑动) false
additionalX Number 近似等于超出边界时最大可拖动距离 50px
reBoundExponent Number 惯性回弹指数(值越大,幅度越大,惯性回弹距离越长) 10
sensitivity Number 惯性滑动时的灵敏度(值越小,阻力越大),可近似认为手松开后速度减为零所需时间 1000ms
reBoundingDuration Number 回弹动画duration 360ms

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读

解决vue2.0路由不显示router-view的问题

vue.js怎么在标签属性中插入变量参数

以上が慣性スライド&リバウンドVueナビゲーションバーをモバイル端末に実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

携帯電話の画面が滑りにくく、乾燥しにくい場合はどうすればよいですか? 携帯電話の画面が滑りにくく、乾燥しにくい場合はどうすればよいですか? Dec 04, 2023 pm 03:51 PM

携帯電話の画面が滑りにくく乾燥しにくい場合の解決策: 1. 画面を加湿する; 2. 画面を定期的に清掃する; 3. 指の滑り強度を高める; 4. 携帯電話の画面保護フィルムを使用する; 5. 保護カバーを交換する; 5. 保護カバーを交換する6. 手を湿らせてください; 7. フィルムを貼るときは清潔に扱ってください; 8. 潤滑剤を使用してください; 9. 手袋を使用してください; 10. 画面の明るさを調整してください; 11. 携帯電話を交換してください。詳細な紹介: 1. スクリーンを加湿し、スクリーンの隣に加湿器を置くか、水をスプレーして空気中の湿度を上げ、スクリーンの乾燥を減らします; 2. スクリーンを定期的に掃除し、専門のスクリーンクリーナーなどを使用してください。

フットボール ナビゲーション音声パッケージはどのナビゲーション ソフトウェアに含まれていますか? フットボール ナビゲーション音声パッケージはどのナビゲーション ソフトウェアに含まれていますか? Nov 09, 2022 pm 04:33 PM

「Amap Navigation」ソフトウェアのサッカーナビゲーション音声パッケージは、自動車版Amapマップのナビゲーション音声パッケージの1つで、コンテンツは黄建祥選手のサッカー解説バージョンのナビゲーション音声です。設定方法: 1. Amap ソフトウェアを開きます; 2. クリックして「その他のツール」-「ナビゲーション音声」オプションに入ります; 3. 「Huang Jianxiang Passionate Voice」を見つけて「ダウンロード」をクリックします; 4. ポップアップページでをクリックし、「音声のみを使用する」をクリックします。

百度地図アプリ最新バージョン18.8.0リリース、信号機レーダー機能を初導入、リアルタイム駐車推奨機能を追加 百度地図アプリ最新バージョン18.8.0リリース、信号機レーダー機能を初導入、リアルタイム駐車推奨機能を追加 Aug 06, 2023 pm 06:05 PM

Android 版と iOS 版の百度地図アプリは、業界に先駆けて信号機レーダー機能を初めて導入したバージョン 18.8.0 をリリースしました。公式の紹介によると、信号機レーダーをオンにした後、自動検出をサポートします目的地を入力することなく、運転中に信号機の位置を確認できます。北斗高精度はリアルタイムで位置を測ることができます。全国の 100 万台以上の信号機で、自動的に青信号リマインダーがトリガーされます。さらに、この新機能は完全なサイレントナビゲーションも提供し、地図エリアがより簡潔になり、重要な情報が一目で明確になり、音声ブロードキャストがないため、ドライバーは運転にさらに集中できるようになります。 2020年10月 リアルタイムカウントダウン予測に対応 信号交差点に近づくとナビが自動的にカウントダウンの残り秒数を表示し、常に前方の道路状況を把握できるようになりました。 2022 年 12 月 31 日までの信号カウントダウン

ナビの地図にある横8の字は何ですか? ナビの地図にある横8の字は何ですか? Jun 27, 2023 am 11:43 AM

ナビゲーション マップ上の水平の数字 8 は霧を意味し、中程度は黄色の 8 警告信号、重度はオレンジ 8 の警告信号を意味します。

Amap、運転ETAサービスのアップグレード版を開始:現在の道路状況のリアルタイム分析とより正確な到着予想時刻 Amap、運転ETAサービスのアップグレード版を開始:現在の道路状況のリアルタイム分析とより正確な到着予想時刻 Apr 30, 2024 am 08:37 AM

4月29日の当サイトのニュースによると、Amapは運転ETAのアップグレード版の開始を正式に発表した(当サイト注:ETAとは到着予定時刻であり、ユーザーが出発するまでにかかる推定時間を指す) )サービスは、ユーザーがより正確にルートを計画し、所要時間と交通状況を推定し、旅行の決定を支援することを目的としています。この地図アプリケーションは、最新のアップグレードされた Amap アプリケーションであり、「超大規模グラフ畳み込みニューラル ネットワーク モデル」が導入されており、交通の流れのパターンをより適切に捕捉して学習し、都市の道路網と高速道路システムをサポートし、時空間を正確に描写できます。交通状況の動的な変化。さらに、新しいバージョンのマップでは、iTransformer 時系列予測モデルがさらに統合され、リアルタイム分析がサポートされます。

JavaScript を使用して画像の上下スライド切り替え効果を実現し、フェードインおよびフェードアウト アニメーションを追加するにはどうすればよいですか? JavaScript を使用して画像の上下スライド切り替え効果を実現し、フェードインおよびフェードアウト アニメーションを追加するにはどうすればよいですか? Oct 20, 2023 am 11:19 AM

JavaScript はどのようにして画像の上下スライド切り替え効果を実現し、フェードインおよびフェードアウト アニメーションを追加できるのでしょうか? Web 開発では、画像の切り替え効果を実現することが必要になることがよくありますが、JavaScript を使用して上下のスライド切り替えを実現したり、フェードインおよびフェードアウトのアニメーション効果を追加したりすることができます。まず、複数の画像を含むコンテナが必要です。HTML の div タグを使用して画像をホストできます。たとえば、「image-container」という ID を持つ div を作成して、

uniappでページジャンプとナビゲーションを実装する方法 uniappでページジャンプとナビゲーションを実装する方法 Oct 20, 2023 pm 02:07 PM

uniapp でページ ジャンプとナビゲーションを実装する方法。uniapp は、ワンタイム コーディングとマルチエンド パブリッシングをサポートするフロントエンド フレームワークです。Vue.js に基づいています。開発者は、uniapp を使用してモバイル アプリケーションを迅速に開発できます。 uniapp では、ページ ジャンプとナビゲーションの実装は非常に一般的な要件です。この記事では、uniapp でページジャンプとナビゲーションを実装する方法と、具体的なコード例を紹介します。 1. ページジャンプ uniapp が提供するメソッド群を利用してページをジャンプします。

Vue を介して画像の閲覧とサムネイル ナビゲーションを実装するにはどうすればよいですか? Vue を介して画像の閲覧とサムネイル ナビゲーションを実装するにはどうすればよいですか? Aug 18, 2023 pm 02:51 PM

Vue を介して画像の閲覧とサムネイル ナビゲーションを実装するにはどうすればよいですか? Web アプリケーションの発展に伴い、写真は私たちの日常生活においてますます重要な役割を果たしています。多くの場合、画像の閲覧やサムネイルのナビゲーション機能を実装する必要があります。この記事では、Vue フレームワークを使用してこの機能を実装する方法とコード例を紹介します。 Vue では、Vue プラグインを使用して画像の閲覧やサムネイル ナビゲーション機能を実装できます。人気のあるプラグインは vue-gallery で、シンプルで使いやすいインターフェイスを提供します。

See all articles