vue+element で動的スキニングを実装するためのサンプルコード

vue+element で動的スキニングを実装するためのサンプルコード

プロジェクトのテーマがすべての人の美的感覚を満足できないこともあります。このとき、スキン変更機能は非常に便利です。このプロジェクトは、vue + elementに基づいて背景管理プロジェクトのスキン変更機能を実装します。

1. スキニングコンポーネントを作成する

<テンプレート>
  <el-カラーピッカー
    クラス="テーマピッカー"
    ポッパークラス="テーマピッカードロップダウン"
    v-model="テーマ"
    :predefine="事前定義色"
  </el-カラーピッカー>
</テンプレート>
 
<スクリプト>
const version = require("element-ui/package.json").version; // node_modules からの element-ui バージョン
const ORIGINAL_THEME = "#409EFF"; // デフォルトの色
エクスポートデフォルト{
  名前: "ThemePicker",
  小道具: {
    デフォルト: {
      // 外部から渡されるトピックを初期化します。タイプ: String
      // デフォルト: '#2668b1'
      // デフォルト: `${localStorage.getItem("tremePackers")==null?"#C60404":localStorage.getItem("tremePackers")}`
    }
    // size: { // 外部から渡されるトピックを初期化します // type: String,
    // デフォルト: 'small'
    // },
  },
  データ() {
    戻る {
      chalk: "", // theme-chalk css の内容
      テーマ: ORIGINAL_THEME、
      showSuccess: true, // スキンの変更成功メッセージをポップアップするかどうか predefineColors: [
        "#2668b1",
        "#52b493",
        "#429798",
        "#32789c",
        "#1944a5",
        "#5944bc",
        "#995dcd",
        "#ce7e5b",
        "#ee8b9b",
        「#283551」
      ]
    };
  },
  マウント() {
    this.theme = this.defaultTheme;
    // this.$emit('onThemeChange', this.theme)
    this.showSuccess = true;
  },
  計算: {
    デフォルトテーマ() {
      this.$store.state.theme を返します。
    }
  },
  時計:
    非同期テーマ(val, oldVal) {
          if (typeof val !== "string") return;
          テーマ クラスターを this.getThemeCluster(val.replace("#", ""));
          const originalCluster = this.getThemeCluster(oldVal.replace("#", ""));
          const getHandler = (変数、ID) => {
            戻り値 () => {
              const オリジナルクラスタ = this.getThemeCluster(
                ORIGINAL_THEME.replace("#", "")
              );
              定数newStyle = this.updateStyle(
                this[変数]、
                オリジナルクラスター、
                テーマクラスター
              );
 
              styleTag = document.getElementById(id); とします。
              if (!styleTag) {
                styleTag = document.createElement("style");
                styleTag.setAttribute("id", id);
                // document.head.appendChild(スタイルタグ)
                書類
                  .getElementsByTagName("スタイル")[0]
                  .insertBefore(スタイルタグ、null);
              }
              styleTag.innerText = 新しいスタイル;
            };
          };
 
          const chalkHandler = getHandler("chalk", "chalk-style");
 
          もし (!this.chalk) {
            const url = `../../assets/style/theme/index.css`; // ローカル CSS スタイル アドレス // const url = `./dist/index.css`; // プロジェクト パッケージ化後の CSS アドレス (元のファイルは public フォルダーに配置されます)
            // const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`; // 会社のイントラネットの場合、この URL は適用されません this.getCSSString(url, chalkHandler, "chalk");
 
          } それ以外 {
            チャコールハンドラ();
          }
 
          定数スタイル = [].slice
            .call(document.querySelectorAll("スタイル"))
            .filter(スタイル => {
              定数テキスト = style.innerText;
              戻る (
                新しい正規表現(oldVal, "i").test(テキスト) &&
                !/Chalk 変数/.test(テキスト)
              );
            });
          スタイル.forEach(スタイル => {
            const { innerText } = スタイル;
            if (typeof innerText !== "string") return;
            style.innerText = this.updateStyle(
              内部テキスト、
              オリジナルクラスター、
              テーマクラスター
            );
          });
          this.$store.commit("themColor", val);//変更した色をストアに保存します
          this.$emit("onThemeChange", val);
 
        // 外部操作に応答する // localStorage に保存する
        // localStorage.setItem('tremePackers',val);
        // if(this.showSuccess) {
        // this.$message({
        // メッセージ: 'スキンの変更に成功しました',
        // タイプ: '成功'
        // })
        // } それ以外 {
        // this.showSuccess = true
        // }
      
    }
  },
  メソッド: {
    スタイルを更新(スタイル、古いクラスタ、新しいクラスタ) {
      newStyle = style; とします。
      oldCluster.forEach((色, インデックス) => {
        newStyle = newStyle.replace(新しい正規表現(色、"ig")、新しいクラスター[インデックス]);
      });
      新しいスタイルを返します。
    },
    
    getCSSString(url, コールバック, 変数) {
      const xhr = 新しい XMLHttpRequest();
      xhr.onreadystatechange = () => {
        xhr.readyState === 4 && xhr.status === 200 の場合 {
          this[変数] = xhr.responseText.replace(/@font-face{[^}]+}/, "");
          折り返し電話();
        }
      };
      xhr.open("GET", url);
      xhr.send();
    },
 
    getThemeCluster(テーマ) {
      const tintColor = (色, 色合い) => {
        red = parseInt(color.slice(0, 2), 16) とします。
        緑をparseInt(color.slice(2, 4), 16)とします。
        blue = parseInt(color.slice(4, 6), 16) とします。
 
        (色合い === 0)の場合{
          // 原色が RGB 空間にある場合
          [赤、緑、青].join(","); を返します。
        } それ以外 {
          red += Math.round(tint * (255 - red));
          緑 += Math.round(tint * (255 - 緑));
          blue += Math.round(tint * (255 - blue));
 
          赤 = red.toString(16);
          緑 = green.toString(16);
          青 = blue.toString(16);
 
          `#${red}${green}${blue}` を返します。
        }
      };
 
      const shadeColor = (色、シェード) => {
        red = parseInt(color.slice(0, 2), 16) とします。
        緑をparseInt(color.slice(2, 4), 16)とします。
        blue = parseInt(color.slice(4, 6), 16) とします。
 
        red = Math.round((1 - shade) * red);
        緑 = Math.round((1 - shade) * 緑);
        blue = Math.round((1 - shade) * blue);
 
        赤 = red.toString(16);
        緑 = green.toString(16);
        青 = blue.toString(16);
 
        `#${red}${green}${blue}` を返します。
      };
 
      const クラスター = [テーマ];
      (i = 0; i <= 9; i++ とします) {
        clusters.push(tintColor(テーマ、Number((i / 10).toFixed(2))));
      }
      clusters.push(shadeColor(テーマ、0.1));
      クラスターを返します。
    }
  }
};
</スクリプト>
 
<スタイル>
.theme-picker .el-color-picker__trigger {
  垂直位置合わせ: 中央;
}
 
.theme-picker-dropdown .el-color-dropdown__link-btn {
  表示: なし;
}
.el-color-picker--小さい .el-color-picker__trigger {
  境界線: なし;
}
</スタイル> 

上記のコードは注目に値します。赤枠内のコードは、ヘッド内のすべてのノードの後に​​新しいスタイルタグを挿入します。パッケージ化後、優先順位が高くなりますが、問題があります。一部の場所の色が直接消えて空白になり、スタイルに影響を与えます。そのため、緑枠内のコードに変更します。ただし、緑枠内のコードの優先順位は、パッケージ化後に元のスタイル色の優先順位よりも低くなるため、プロジェクトに応じてスタイルの優先順位を調整する必要があります。

このコードにも注意が必要です。会社が外部ネットワークを直接使用している場合は、3番目のURLを直接使用できます。会社が外部Webページにアクセスできない内部ネットワークを使用している場合は、3番目のURLを通じてプロジェクトの要素バージョンのcssスタイルをダウンロードし、プロジェクトにcssファイルを置くことができますが、コンパイルされないフォルダーに置くように注意してください。私のプロジェクトはvue cli4を使用しているため、動的に変換したcssファイルはpublicフォルダーに配置されています。assetsフォルダー内のスタイルファイルはコンパイルされるため、パスは404を報告し、このブロックで使用されているURLは、ファイルがパッケージ化されてコンパイルされた後のスタイルのパスです。これは注目に値します。

2. プロジェクト内の一部のスタイルカラーが要素を使用しない場合は、vuexでカラーをキャッシュし、特定のステップで計算されたプロパティを通じて取得し、それをスタイルに動的にバインドすることができます。

ヴュークス:

使用されるコンポーネント:

これで、vue+element で動的スキン変更を実装するサンプルコードに関するこの記事は終了です。vue+element の動的スキン変更に関する関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue+Elementバックグラウンド管理フレームワークの統合実践
  • Element+vueを使用して開始時間と終了時間の制限を実装する
  • Antdesign-vueとsortablejsを組み合わせて、2つのテーブルをドラッグして並べ替える機能を実現
  • Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

<<:  Docker+K8S クラスタ環境構築と分散アプリケーション展開

>>:  VS2019 が mysql8.0 データベースに接続する方法 (画像とテキスト付き)

推薦する

Linux で MySQL 5.6 X64 バージョンをインストールする詳細な手順

環境: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-glibc2.5...

HTML の一般的でないタグ optgroup、sub、sup、bdo のサンプルコード

Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...

トークン生成と検証を実装するミニプログラム

目次プロセスデモミニプログラムバックエンドインターフェースプロセス各リクエストインターフェースは検証...

CSS における z-index: 0 と z-index: auto の違い

最近、スタック コンテキストについて学習しています。学習の過程で、z-index が 0 の場合と ...

HTMLフォーム要素の詳しい解説(パート2)

HTML 入力属性値属性value 属性は、入力フィールドの初期値を指定します。 <フォーム...

mysql-joinsの具体的な使用方法

目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....

ECMAscript の新機能の紹介

目次1. 関数パラメータのデフォルト値1.1 関数パラメータのデフォルト値の指定1.2 分離割り当て...

TCP 3 回目のハンドシェイク データ転送プロセス図

RFC793 ドキュメントの SYN フラグを持つプロセス パケットはデータを伝送できません。つま...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

Nginx/Httpd リバース プロキシ Tomcat 設定チュートリアル

以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...

Ubuntu環境でPHPとNginxをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で PHP と Nginx をコンパイルしてインストールする方法につ...

Vue3 を使用して虫眼鏡効果を実現する方法の例

目次序文1. カプセル化の重要性2. どのようにカプセル化しますか? 1. 準備2. 梱包を開始する...

要素UIポップアップコンポーネントをカプセル化する手順

el-dialogをコンポーネントとしてカプセル化するelement-ui を使用する場合、ポップア...