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

推薦する

divコンテナ内の背景色または画像は、サイズが大きくなるにつれて大きくなります。

コードをコピーコードは次のとおりです。高さ:自動 !重要;高さ:550px;最小高さ:550px; ...

Navicat を使用して MySQL データベースをエクスポートおよびインポートする方法

MySql は、私たちが頻繁に使用するデータ ソースです。開発者が練習、小規模なプライベート ゲーム...

テーブルレイアウトの長所と短所、そして推奨されない理由

テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...

Docker ベースのよく使われる CentOS7 イメージの概要

目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...

CentOS6.9+Mysql5.7.18 ソースコードのインストール詳細チュートリアル

CentOS6.9+Mysql5.7.18 ソースコードのインストールでは、以下の操作を root ...

CSS の子要素を親要素と高い一貫性を持たせる方法

絶対位置決め方式: (1)親要素を相対配置に設定します。親要素の高さを指定しない場合は、左の子要素の...

React リストバーとショッピングカートコンポーネントの使用の詳細な説明

この記事では、Reactリストバーとショッピングカートコンポーネントの具体的なコードを参考までに紹介...

フロントエンドのパフォーマンス最適化を学習するための準備として、HTML ページのレンダリング プロセスを理解する (続き)

昨夜、ブラウザのレンダリングプロセスに関するエッセイを書きましたが、小さなコードで説明しただけでした...

Vue の nextTick について話す

データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...

docker を使用して Redis マスター/スレーブを構築する方法

1. Docker環境を構築する1. Dockerfileを作成する Centos:latest か...

Linuxはバイナリモードを使用してmysqlをインストールします

この記事では、LinuxにバイナリモードでMySQLをインストールする具体的な手順を参考までに紹介し...

インタビューの質問: ホーリー グレイル レイアウトとダブル ウィング レイアウトの違い

序文今日は、聖杯レイアウトとダブルウィングレイアウト、そしてそれらの違いについてお話しします。この2...

知っておくべき 7 つのネイティブ JS エラーの種類

目次概要1. 範囲エラー2. 参照エラー3. 構文エラー4. タイプエラー5. URIエラー6. 評...

Vue カスタム オプション時間カレンダー コンポーネント

この記事の例では、参考のためにvueカスタムオプションタイムカレンダーコンポーネントの具体的なコード...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...