Vue3スタイルのCSS変数注入の実装

Vue3スタイルのCSS変数注入の実装

まとめ

単一ファイル コンポーネント スタイルでコンポーネント状態駆動型 CSS 変数 (CSS カスタム プロパティ) を使用するためのサポート。

基本的な例

<テンプレート>
  <div class="text">こんにちは</div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    データ() {
      戻る {
        色: '赤'、
        フォント:
          サイズ: '2em',
        },
      }
    },
  }
</スクリプト>

<スタイル>
  。文章 {
    色: v-bind (色);

    /* 式 (引用符で囲む) */
    フォントサイズ: v-bind('font.size');
  }
</スタイル>

モチベーション

Vue SFC スタイルは、簡単な CSS のコロケーションとカプセル化を提供しますが、完全に静的です。つまり、現時点では、コンポーネントの状態に基づいて実行時にスタイルを動的に更新する機能はありません。

現在、ほとんどの最新ブラウザがネイティブ CSS 変数をサポートしているため、これを利用してコンポーネントの状態とスタイルを簡単に接続できます。

デザインの詳細

SFC のタグは、カスタム CSS 関数 v-bind をサポートするようになりました。

<!-- Vue SFC 内 -->
<スタイル>
  。文章 {
    色: v-bind (色);
  }
</スタイル>

予想通り、これにより宣言された値がコンポーネント状態のプロパティ color にバインドされ、reactively.color になります。

この関数は任意のJavaScript式をサポートできますが、JavaScript式にはCSS識別子に無効な文字が含まれる可能性があるため、ほとんどの場合引用符で囲む必要があります: v-bind

。文章 {
  フォントサイズ: v-bind('theme.font.size');
}

このような CSS 変数が検出されると、SFC コンパイラは次の処理を実行します。

ハッシュされた変数名を使用してネイティブのものにオーバーライドします。上記の内容は次のように書き換えられます: v-bind() var()

。文章 {
  色: var (--6b53742-color);
  フォントサイズ: var (--6b53742-theme_font_size);
}

タグにスコープがあるかどうかに関係なく、ハッシュはすべての場合に適用されることに注意してください。つまり、挿入された CSS 変数が誤って子コンポーネントに漏れることはありません。

対応する変数は、インライン スタイルとしてコンポーネントのルート要素に挿入されます。上記の例では、最終的にレンダリングされた DOM は次のようになります。

<div style="--6b53742-color:red;--6b53742-theme_font_size:2em;" class="text">
  こんにちは
</div>

インジェクションはレスポンシブなので、コンポーネントのプロパティが変更されると、インジェクションされた CSS 変数もそれに応じて更新されます。この更新はコンポーネントのテンプレート更新とは独立しているため、純粋な CSS レスポンシブ プロパティを変更してもテンプレートの再レンダリングはトリガーされません。

コンパイルの詳細

CSS 変数を挿入するには、コンパイラーが次のコードを生成し、コンポーネントの setup() に挿入する必要があります。

'vue' から { useCssVars } をインポートします

エクスポートデフォルト{
  設定() {
    //...
    使用CssVars(_ctx => ({
      色: _ctx.color,
      テーマフォントサイズ: _ctx.theme.font.size,
    }))
  },
}

... ここで、ランタイム ヘルパーは、変数をレスポンシブに適用する DOM.useCssVars watchEffect を設定します。

このコンパイル戦略では、スクリプトをコンパイルするときに、最初にタグ コンテンツに対して簡単な再エンコード分析を実行して、公開される変数のリストを決定する必要があります。ただし、この解析フェーズでは、<style> の完全な AST ベースの解析ほどオーバーヘッドは発生しません。

本番環境では、変数名をさらにハッシュして CSS フットプリントを削減できます。

。文章 {
  色: var (--x3b2fs2);
  フォントサイズ: var (--29fh29g);
}

対応する生成された JavaScript コードでは、それに応じて同じハッシュ値が使用されます。

採用戦略

これは完全に下位互換性のある新しい機能です。ただし、ネイティブ CSS 変数に依存していることを明確にしておく必要があります。そのため、ユーザーはブラウザのサポート範囲を認識する必要があります。

練習する

スクリプトで、wallpaperBlur と wallpaperMask という 2 つのレスポンシブ プロパティを宣言します。 wallpaperBlur は壁紙のぼかしレベルを示し、wallpaperMask はマスクの透明度を示します。これらを v-bind 経由でスタイルに適用すると、スクリプト内でこれら 2 つの値を変更すると、スタイルがその変更に反応するようになります。

// スクリプト
const wallpaperBlur = ref('0px')
const wallpaperMask = ref('rgba(0, 0, 0, 0)')
//スタイル
.壁紙 {
  フィルター: ぼかし(v-bind(wallpaperBlur));
  下部: calc(v-bind(wallpaperBlur) * -2);
  左: calc(v-bind(wallpaperBlur) * -2);
  右: calc(v-bind(wallpaperBlur) * -2);
  上: calc(v-bind(wallpaperBlur) * -2);
  .壁紙画像 {
    遷移: 背景画像 0.6 秒、背景色 0.4 秒。
  }
  .壁紙マスク{
    背景色: v-bind(壁紙マスク);
  }
}

ヒント

適切なプロパティをバインドする

上記の例では、マスクの透明度を変更するには、0 から 1 までの数値を宣言し、次のようなスタイルで記述するだけでよいと思われるかもしれません。

.壁紙マスク{
  背景色: rgba(0, 0, 0, v-bind(wallpaperMask));
}

前述のように、スタイルの v-bind はコンパイル段階で CSS 変数として書き換えられます。上記のコードは次のように書き換えられます。

.壁紙マスク{
  背景色: rgba(0, 0, 0, var (--[ハッシュ]-wallpaper_mask));
}

rgba(0, 0, 0, var (--[hash]-wallpaper_mask)) は CSS では解析できません。そのため、wallpaperMask の初期値は rgba(0, 0, 0, 0) として宣言されます。これは非常に重要なポイントであり、CSS にも同様の状況が数多くあります。

スタイルのアップデートに注目

デザインの詳細に記載されている対応する変数は、コンポーネントのルート要素にインライン スタイルとして挿入されます。最終的にレンダリングされた DOM は次のようになります。

<div style="--6b53742-color:red;--6b53742-theme_font_size:2em;"></div>

<script> 内の <style> にバインドされたプロパティを変更すると、インライン スタイル内の CSS 変数がその変更に応答します。ただし、インライン スタイル内の単一の CSS 変数を更新することはできません。つまり、コンポーネント内の「動的スタイル」を更新すると、ルート コンポーネント内のすべてのインライン スタイルが更新されます。スタイル属性の値に多数の CSS 変数が含まれている場合は、コンポーネントの再編成を検討する必要があります。コンパイルされた CSS 変数はインライン スタイルとしてコンポーネントのルート要素に挿入されるため、この動作を制御して、更新を引き起こす CSS 変数を他の CSS 変数から分離することはできません。

スタイル内のコンパイルされた CSS 変数に、値が巨大な base64 である CSS 変数が含まれている状況を想像してください。コンポーネント内の他の CSS 変数が更新されると、スタイル全体が更新され、追加のハードウェア オーバーヘッドが発生します。 CSS 変数をコンポーネントのルート要素に挿入し、他の CSS 変数の更新による影響を受けないようにするために、base64 CSS 変数を生成するコンポーネントを分離する必要があります。

参考文献

https://github.com/vuejs/rfcs/pull/231

Vue3 スタイルの CSS 変数インジェクションの実装に関するこの記事はこれで終わりです。Vue3 スタイルの CSS 変数インジェクションに関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • jsとcssのブロッキング問題の詳細な分析
  • CSS、スタイルの基本を理解する
  • 登録ページを実装するためのJS、CSS、HTML
  • Vue3はCSSの無限シームレススクロール効果を実装します
  • React はモバイル端末を構築するために antd-mobile+postcss を導入しました
  • CSSの不規則な境界線の生成スキームについての簡単な説明
  • CSS グリッチ アートの説明
  • CSS3 はトランジションアニメーションとイージング効果のケーススタディを使用します

<<:  Centos7.2 で mysql5.7 データベースをインストールするための詳細な手順

>>:  Linuxでホスト名を永続的に変更する方法

推薦する

Linux C++ マルチスレッド同期の非常に詳細な説明

目次1. ミューテックス1. ミューテックスの初期化2. ミューテックスロックの関連特性と分類3. ...

MySQL SQL ステートメントが遅い場合の一般的な原因と解決策

1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...

MySQLのグローバルロックとテーブルロックに関する詳細な理解

序文ロックの範囲に応じて、MySQL のロックは、グローバル ロック、テーブル ロック、行ロックに大...

Docker で Ubuntu に Python3 と Pip をインストールする際の問題

文章1) Ubuntuイメージをダウンロードする docker プル Ubuntu 2) 画像を見る...

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

TSで最も一般的な宣言マージ(インターフェースマージ)

目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...

HTML テーブルタグチュートリアル (32): セルの水平方向の配置属性 ALIGN

水平方向では、セルの配置を左、中央、右に設定できます。基本的な構文<TD ALIGN=&quo...

Vue-Routerのインストールと使用方法の詳細な説明

目次インストールルーティングの基本構成Vue にルーターをインストールするルーターの設定Router...

CSS はスクロールバーを非表示にしてコンテンツをスクロールする効果を実現します (3 つの方法)

フロントエンド開発では、スクロールバーを非表示にしながらスクロールをサポートしなければならないという...

docker+jenkins+node.js の自動デプロイメント環境をゼロから構築する方法

このケースはCentOS 7システムに基づいていますDockerの使用経験がある人に適していますLi...

JavaScript オブジェクトからプリミティブ値への変換の詳細な説明

目次オブジェクトプロトタイプの値()オブジェクトプロトタイプtoString()シンボル.toPri...

JavaScript の遅延読み込み属性パターンに関する簡単な説明

目次1. はじめに2. オンデマンド属性モード3. 乱雑な遅延読み込み属性パターン4. クラスの唯一...

CSS3を使用してトランジションとアニメーション効果を実現する

JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...

Vueのキャッシュ方法の例の詳細な説明

最近、「フロントエンドキャッシュ」という新しい要件が作成されました要件背景: フォームへの高頻度の繰...

JS関数の呼び出し、適用、バインドの超詳細な方法

目次JS 関数呼び出し、適用、バインドメソッド1. call() メソッド1. call() メソッ...