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 データベースに接続する方法 (画像とテキスト付き)

推薦する

ウェブマスターが注目すべき、ウェブサイトのユーザビリティを向上させる 9 つのコード最適化のヒント

1. ロゴに代替テキストを追加するこれには 2 つの利点があります。スクリーン リーダーがロゴ画像の...

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...

Deepin Linuxでカーネルを手動でアップグレードする方法

deepinとUbuntuどちらもdebianをベースにしたディストリビューションであり、ここではU...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

MySQL で binlog を使用する際のフォーマットの選択方法

目次1. binlogの3つのモード1.ステートメントレベルモード2. 行レベルモード3. 混合モー...

JavaScript でよく使われる 5 つのオブジェクト

目次1. JavaScript オブジェクト1).配列オブジェクト2).ブールオブジェクト3).日付...

クロスブラウザの問題に対する 5 つの解決策 (要約)

簡単なレビュー: ブラウザの互換性の問題は、しばしば頭痛の種となります。ここでは、これらの問題を回避...

MySQL ジョイントテーブルクエリの簡単な例

MySql は結合テーブルクエリを使用しますが、初心者には理解しにくい場合があります。以下の記事では...

Linux のファイル権限とグループ変更コマンドの詳細な説明

Linux では、すべてがファイルであり (ディレクトリもファイルです)、各ファイルにはユーザーに対...

Vue Element フロントエンドアプリケーション開発の動的メニューとルーティングの関連付け処理

目次概要1. メニューとルーティング処理2. メニューとルートリスト3. ログインプロセスの処理概要...

シームレスなトークンリフレッシュを実現する方法

目次1. 需要方法1方法2方法3 2. 実装3. 問題解決質問1: トークンの複数回の更新を防ぐ方法...

ウェブデザインの経験とスキルの概要

■ ウェブサイトのテーマ計画 ウェブサイトのテーマが断片化しすぎないように注意してください。一般的に...

CSS3はウェブサイトの製品表示効果図を実現します

この記事では、CSS3 を使用した Web サイトの商品表示の効果を紹介し、皆さんと共有します。詳細...

ジョセフリング問題を解決する 3 つの JavaScript メソッド

目次概要問題の説明循環リンクリスト順序付き配列数学的再帰要約する概要ジョセフ・リング問題は、ジョセフ...

DCL を使用して MySQL でユーザーを管理し、権限を制御する方法

DCL (データ制御言語): データベースのアクセス権とセキュリティ レベルを定義し、ユーザーを作成...