Vue3ナビゲーションバーコンポーネントのカプセル化実装方法

Vue3ナビゲーションバーコンポーネントのカプセル化実装方法

参考までに、Vue3でナビゲーションバーコンポーネントをカプセル化し、スクロールバーのスクロールに合わせて天井効果を実現します。

ナビゲーション バー コンポーネントの効果図:

スクロールバーをスクロールした後の天井効果の模式図:

特定のコード表示:

<テンプレート>
  <ヘッダークラ​​ス="アプリヘッダー">
    <div class="コンテナ">
      <!-- ヘッダーナビゲーション領域 -->
      <ヘッダーナビゲーション共通 />
      <div class="検索">
        <i class="iconfont icon-search"></i>
        <input type="text" placeholder="検索" />
      </div>
      <div class="カート">
        <a href="#" class="curr">
          <i class="iconfont icon-cart"></i>
          2
        </a>
      </div>
    </div>
  </ヘッダー>
</テンプレート>
 
<スクリプト>
'@/components/header-nav-common.vue' から HeaderNavCommon をインポートします。
エクスポートデフォルト{
  名前: 'AppHeader',
  コンポーネント:
    ヘッダーナビゲーション共通
  }
}
</スクリプト>
 
<style スコープ lang="less">
.app-header {
  背景: #fff;
  。容器 {
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
  }
  .navs{
    幅: 820ピクセル;
    ディスプレイ: フレックス;
    コンテンツの両端揃え: スペースを空ける;
    左パディング: 40px;
    li {
      右マージン: 40px;
      幅: 38px;
      テキスト配置: 中央;
      {
        表示: インラインブロック;
        フォントサイズ: 16px;
        行の高さ: 32px;
        高さ: 32px;
      }
      &:ホバー{
        {
          色: @xtxColor;
          下部境界線: 1px 実線 @xtxColor;
        }
      }
    }
  }
  。検索 {
    幅: 170ピクセル;
    高さ: 32px;
    位置: 相対的;
    下境界線: 1px 実線 #e7e7e7;
    行の高さ: 32px;
    .アイコン検索{
      フォントサイズ: 18px;
      左マージン: 5px;
    }
    入力{
      幅: 140ピクセル;
      左パディング: 5px;
      色: #666;
    }
  }
  .カート{
    幅: 50px;
    .curr {
      高さ: 32px;
      行の高さ: 32px;
      テキスト配置: 中央;
      位置: 相対的;
      表示: ブロック;
      .icon-cart {
        フォントサイズ: 22px;
      }
      えむ {
        フォントスタイル: 通常;
        位置: 絶対;
        右: 0;
        上: 0;
        パディング: 1px 6px;
        行の高さ: 1;
        背景: @helpColor;
        色: #fff;
        フォントサイズ: 12px;
        境界線の半径: 10px;
        フォントファミリ: Arial;
      }
    }
  }
}
</スタイル>

中央のメニュー部門は、2つのコンポーネント(HeaderNavCommonコンポーネント)の再利用を実現するために、別のコンポーネントにカプセル化されています。

<テンプレート>
  <ul class="app-header-nav">
    <li class="home"><RouterLink to="/">ホーム</RouterLink></li>
    <li><a href="#" >おいしい食べ物</a></li>
    <li><a href="#" >キッチン</a></li>
    <li><a href="#" >アート</a></li>
    <li><a href="#" >電化製品</a></li>
    <li><a href="#" >ホーム</a></li>
    <li><a href="#" >ケア</a></li>
    <li><a href="#" >妊娠と乳児</a></li>
    <li><a href="#" >衣類</a></li>
    <li><a href="#" >食料品</a></li>
  </ul>
</テンプレート>
 
<スクリプト>
 エクスポートデフォルト{
    名前: 'AppHeaderNav'
   }
</スクリプト>
 
<スタイル スコープ lang='less'>
.app-header-nav {
    幅: 820ピクセル;
    ディスプレイ: フレックス;
    左パディング: 40px;
    位置: 相対的;
    zインデックス: 998;
  li {
    右マージン: 40px;
    幅: 38px;
    テキスト配置: 中央;
  {
    フォントサイズ: 16px;
    行の高さ: 32px;
    高さ: 32px;
    表示: インラインブロック;
   }
  &:ホバー{
    {
    色: @xtxColor;
    下部境界線: 1px 実線 @xtxColor;
        }
      }
  }
}
</スタイル>

天井効果をカプセル化するコンポーネント

<テンプレート>
  <div class="app-header-sticky" :class="{ show: top >= 78 }">
    <div class="コンテナ" v-if="トップ >= 78">
      <!-- 中間 -->
      <ヘッダーナビゲーション共通 />
      <!-- 右ボタン -->
      <div class="right">
        <RouterLink to="/">ブランド</RouterLink>
        <RouterLink to="/">トピック</RouterLink>
      </div>
    </div>
  </div>
</テンプレート>
 
<スクリプト>
'@/components/header-nav-common.vue' から HeaderNavCommon をインポートします。
// 'vue' から { ref } をインポートします
'@vueuse/core' から { useWindowScroll } をインポートします。
エクスポートデフォルト{
  名前: 'AppHeaderSticky',
  コンポーネント: { HeaderNavCommon },
  設定() {
    // ページスクロール距離 // const top = ref(0)
    // window.onscroll = () => {
    // top.value = document.documentElement.scrollTop
    // }
    // サードパーティのパッケージを使用したページスクロール const { y: top } = useWindowScroll()
    戻る {トップ}
  }
}
</スクリプト>
 
<style スコープ lang="less">
.app-header-sticky {
  幅: 100%;
  高さ: 80px;
  位置: 固定;
  左: 0;
  上: 0;
  zインデックス: 999;
  背景色: #fff;
  下境界線: 1px 実線 #e4e4e4;
  // これがキースタイルです!!!
  // デフォルトでは、完全に上に移動します。transform: translateY(-100%);
  // 完全に透明 opacity: 0;
  //表示されるクラス名&.show {
    遷移: すべて 0.3 秒線形。
    変換: なし;
    不透明度: 1;
  }
  。容器 {
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
  }
  。右 {
    幅: 220ピクセル;
    ディスプレイ: フレックス;
    テキスト配置: 中央;
    左パディング: 40px;
    左境界線: 2px 実線 @xtxColor;
    {
      幅: 38px;
      右マージン: 40px;
      フォントサイズ: 16px;
      行の高さ: 1;
      &:ホバー{
        色: @xtxColor;
      }
    }
  }
}
</スタイル>

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

以下もご興味があるかもしれません:
  • Vue3.xはコンポーネント通信にmitt.jsを使用します
  • Vue3 がコンポーネント通信に mitt を使用する手順
  • Vue3カプセル化メッセージメッセージプロンプトインスタンス関数の詳細な説明
  • Vue3 親子コンポーネントパラメータ転送における sync 修飾子の使用法の詳細な説明
  • Vue3 のリアクティブ関数 toRef 関数 ref 関数の紹介
  • vue3とvue2の利点の比較
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践の概要
  • Vue3 ドキュメント クイックスタート
  • Vue3における7種類のコンポーネント通信の詳細

<<:  Dockerコンテナの個別展開のためのLNMPの実装

>>:  MySQL ルートパスワードエラー番号 1045 の解決方法

推薦する

Docker 環境で JMeter+Grafana+influxdb ビジュアル パフォーマンス監視プラットフォームを構築するチュートリアル

目次1. Dockerをインストールする2. influxDBをインストールして設定する3. Gra...

Mybatisの各SQL文の実行時間の統計

背景最近、面接でデータベース トランザクションについてよく質問されます。通常は、@Transacti...

Linux での MySQL 5.7.18 yum のアンインストールからインストールまでのプロセスの図

いろいろ苦労しましたが、やっと yum インストールの手順がわかりました。以前、バイナリ パッケージ...

Ubuntu 18.04 に Anaconda3 をインストールするための詳細なチュートリアル

Anaconda は、conda、Python、およびそれらの依存関係など、180 を超える科学パッ...

jsシミュレーションでJingdongの詳細ページで画像を拡大する効果を実現

この記事では、Jingdongの詳細ページの画像の拡大を実現するためのjsの具体的なコードを紹介しま...

HTML の色に関する参考資料

HTML では、色は 2 つの方法で表現されます。 1 つは、青の場合は blue のように色の名前...

ソースコード分析からTomcatがサーブレットの初期化を呼び出す方法の詳細な説明

目次導入1. Tomcatを起動するコード2. Tomcatフレームワーク3. コンテナを作成する ...

MySQL インデックスが失敗するいくつかの状況の概要

1. インデックスはnull値を保存しないより正確に言うと、単一列インデックスには null 値は格...

複数クリックを防ぐVueの実践

通常、クリック イベントは、メッセージ リマインダーのさまざまな状況に分割されます。これらが処理され...

広告を閉じる効果を実現するJavascript

参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...

CocosCreatorでクールなレーダーチャートを描く方法

目次序文プレビュー文章グラフィックコンポーネントプロパティ機能グリッドを描く軸角度を計算するスケール...

CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...

CentOS 環境で NFS リモート ディレクトリ マウントを使用する手順の紹介

目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....

Alipay の新しいホームページのフロントエンドの実践的な概要

もちろん、ページ パフォーマンスの最適化に関する個人的な経験も含まれています。ここでいくつかの点につ...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...