Element PlusはAffixを実装します

Element PlusはAffixを実装します

1. コンポーネントの紹介

アフィックス コンポーネントは、ページ要素を特定の視覚領域に固定するために使用されます。

1.1 プロパティ

  • 位置: ピンの位置を指定します。上または下に設定できます。デフォルトは上です。
  • offset: オフセット距離を設定します。デフォルトは0です。
  • target: ピンを常にコンテナ内に保持するためのコンテナ (CSS セレクタ) を指定します。範囲を超えると非表示になります。デフォルトのコンテナは document.documentElement です。
  • z-index: ピンのレベル。デフォルトは 100

1.2 イベント

  • scroll: コンテナがスクロールしたときにイベントをトリガーします。パラメータは、scrollTop 値と固定ピンのステータス (固定されているかどうか) です。
  • 変更: 固定ピンの状態が変わったときにトリガーされます。パラメータは、固定ピンが現在固定状態にあるかどうかです。

2. ソースコード分析

2.1 テンプレート

<テンプレート>
  <div ref="root" class="el-affix" :style="rootStyle">
    <div :class="{'el-affix--fixed': state.fixed}" :style="affixStyle">
      <スロット></スロット>
    </div>
  </div>
</テンプレート>

テンプレート部分は非常にシンプルで、スロットを通じてコン​​テンツを受け取ります

2.2 スクリプト

// いくつかのコアコード、コードの順序は調整されています setup(props, { emitting }) {
    // ターゲットコンテナ参照
    定数ターゲット = ref(null) 
    // ref を修正し、テンプレートの ref 属性と連携して HTML 要素を取得します。const root = ref(null)
    // スクロールコンテナ参照
    定数スクロールコンテナ = ref(null)
    
    // 固定状態 const state = reactive({
      修正: false、
      height: 0, // ルートの高さ
      width: 0, // ルートの幅
      scrollTop: 0, // documentElement のスクロールトップ
      clientHeight: 0, // documentElement の clientHeight
      変換: 0,
    })
    
    マウント時(() => {
      // 受信ターゲットに基づいてターゲットコンテナを決定する if (props.target) {
        ターゲット値 = document.querySelector(props.target)
        if (!target.value) {
          新しいエラーをスローします(`ターゲットが存在しません: ${props.target}`)
        }
      } それ以外 {
        ターゲット値 = document.documentElement
      }
      
      // 固定要素に応じて、上方向のスクロールコンテナを検索します scrollContainer.value = getScrollContainer(root.value)
      // スクロールコンテナのスクロールイベントをリッスンします on(scrollContainer.value, 'scroll', onScroll)
      // 固定要素のサイズ変更イベントをリッスンします。addResizeListener(root.value, updateState)
    })
    
    // スクロールコンテナのスクロールイベントの応答関数 const onScroll = () => {
      // 固定状態を更新する updateState()
      
      出力('スクロール', {
        スクロールトップ: state.scrollTop、
        固定: state.fixed、
      })
    }
    
    // 固定状態を更新する function const updateState = () => {
      定数 rootRect = root.value.getBoundingClientRect()
      定数 targetRect = target.value.getBoundingClientRect()
      状態.height = ルート矩形.height
      状態.幅 = ルート矩形.幅
      state.scrollTop = scrollContainer.value === window ? document.documentElement.scrollTop : scrollContainer.value.scrollTop
      state.clientHeight = document.documentElement.clientHeight

      props.position === 'top'の場合{
        もしprops.targetが
          定数の差 = targetRect.bottom - props.offset - state.height
          // targetRect.bottom > 0 は、固定ピンが常にコンテナー内に保持され、範囲を超えると非表示になることを意味します state.fixed = props.offset > rootRect.top && targetRect.bottom > 0
          // 次のシナリオを処理するために使用されます: スクロール処理中に、ターゲット コンテナーの表示領域がピン全体を表示するのに十分でない場合は、ピンをオフセットしてその一部のみを表示する必要があります。 state.transform = Difference < 0 ? Difference: 0
        } それ以外 {
          state.fixed = props.offset > rootRect.top
        }
      } それ以外 {
        もしprops.targetが
          定数の差 = state.clientHeight - targetRect.top - props.offset - state.height
          state.fixed = state.clientHeight - props.offset < rootRect.bottom && state.clientHeight > targetRect.top
          state.transform = 差 < 0 ? -差: 0
        } それ以外 {
          state.fixed = state.clientHeight - props.offset < rootRect.bottom
        }
      }
    }
    // 固定状態の変化を監視し、変更イベントを発行します watch(() => state.fixed, () => {
      出力('change'、状態.fixed)
    })
    
    // プロパティを計算し、ネイルの状態に応じてネイルのスタイルを自動的に更新します。const affixStyle = computed(() => {
      状態が固定されている場合
        戻る
      }
      定数オフセット = props.offset ? `${props.offset}px` : 0
      const transform = state.transform ? `translateY(${state.transform}px)` : ''

      戻る {
        高さ: `${state.height}px`,
        幅: `${state.width}px`,
        上部: props.position === 'top' ? オフセット: ''、
        下部: props.position === 'bottom' ? オフセット: ''、
        変換: 変換、
        zIndex: props.zIndex、
      }
    })
}

2.3 実装の概要:

  • スクロール コンテナーのスクロール イベント (およびピン自体のサイズ変更イベント) を監視することにより、
  • イベント応答機能では、ピンとターゲット コンテナーの DOM 属性が動的に取得され、ピンの状態を計算するために使用されます。
  • 計算プロパティを使用してピンのスタイルを自動的に更新します。

Element Plus の Affix ピンニングの実装に関するこの記事はこれで終わりです。Element Affix ピンニングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • BootStrap での Affix コントロールの使用とレイアウトを美しく保つ方法について詳しく説明します。
  • Bootstrap 追加ナビゲーション (Affix) プラグインの例の詳細な説明
  • Bootstrap におけるトランジションとアフィックスの使用に関する包括的な分析
  • BootstrapのAffixプラグイン

<<:  sqlite3 から mysql に移行するときに起こりうる問題のコレクション

>>:  VMware および CentOS システムのインストール方法 - ルート パスワードをリセットする

推薦する

Rancher で Kubernetes 用の標準化された VMware イメージを構築する方法

Kubernetes を学習するときは、Kubernetes 環境で練習する必要があります。ただし、...

背景位置パーセンテージ原則の詳細な説明

今日、誰かがコードを調整するのを手伝っていたとき、次のようなスタイルを見つけました。 背景位置: 5...

JSコードコンパイラMonacoの使い方

序文私が必要としているのは、構文の強調表示、関数プロンプト、自動行折り返し、およびコードの折りたたみ...

Vue は PDF ファイルのオンライン プレビューを実装します (pdf.js/iframe/embed を使用)

序文現在、私はコースウェア PPT のオンライン プレビューを必要とする高品質のコースに取り組んでい...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

Django+Mysql+Redis+Gunicorn+NginxのDockerデプロイメントの実装

I. はじめにDockerテクノロジーは現在非常に人気があります。コンテナを介してプロジェクト環境を...

docker を使用して複数のネットワーク インターフェースを持つコンテナーを起動する方法の例

コンテナにネットワークインターフェースを追加する1 デフォルトのネットワークモードでコンテナを実行す...

Windows システムでの MySQL 8.0.21 インストール チュートリアル (図とテキスト)

インストールの提案: インストールには .exe を使用せず、圧縮パッケージを使用してください。これ...

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フロ...

ポータルサイト再設計のユーザーエクスペリエンス

<br />2006年10月12日のNetEaseの新ホームページの公開から、2008年...

Linux で Docker を使用して MySQL をインストールする手順

テスターとして、学習プロセス中に Linux でソフトウェアをインストールする必要が頻繁にある場合が...

Mysql5.7 のルートパスワードを忘れた場合の対処法 (シンプルで効果的な方法)

前回の記事では、MySQL 5.7でルートパスワードを忘れた場合と、MySQL 5.7でルートパスワ...

高性能な HTML アプリケーションを作成するためのヒント

Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...

jQuery キャンバスは QR コード付きのポスターを生成します

この記事では、jQuery キャンバスを使用して QR コード付きのポスターを生成するための具体的な...