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 の解決方法

推薦する

CSSを使用してダークモードとブライトモードを切り替える

Web Skills第5号では、CSSでダークモードやハイライトモードを実装するための技術的なソリュ...

適応的な幅と高さを持つ9つの正方形グリッドの背景画像の切り取りの分析

<br />幅と高さが適応するオリジナルの 9 グリッド レイアウトをベースに、ネットワ...

Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

序文以前、MySQL 5.6 をインストールしました。3 か月後、開発者から MySQL で JSO...

MySQL の垂直テーブルを水平テーブルに変換する方法と最適化のチュートリアル

1. 縦型テーブルと横型テーブル垂直テーブル: テーブル内のフィールドとフィールド値はキーと値の形式...

MySQL データベースのインストールと Navicat for MySQL の使用に関するチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...

Docker で Redis センチネル モードを構成する方法 (複数のサーバー上)

目次序文状態DockerをインストールするRedisのマスターノードとスレーブノードを構成する序文以...

MySQL 5.7.24 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、参考までにMySQL 5.7.24圧縮パッケージのインストールチュートリアルを紹介しま...

Dockerでnginxを実行し、ローカルディレクトリをイメージにマウントする方法

1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...

スネークゲームを作るための Pygame コード

目次使用されるPygame関数スクリーンの作成ヘビの作成ヘビを動かすゲームオーバーの処理食事を増やす...

Win10でIIS10を構成し、ASPプログラムのデバッグをサポートする手順

マイクロソフトIIS (Internet Information Server) は、Microso...

Docker 可視化グラフィックツール portainer の詳細な説明

目次1. ポーテナーの紹介2. Portainer アーキテクチャの概要3. Portainerのイ...

MySQL 5.7 共通データ型

——「MySQL in Simple Terms (第 2 版)」からのメモ数値型整数型バイト最小最...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

Ubuntu で XFS ファイルシステム用の LVM を作成する方法

序文lvm (論理ボリューム マネージャー) 論理ボリューム管理は、Linux システムのニーズを満...