プロジェクトのテーマがすべての人の美的感覚を満足できないこともあります。このとき、スキン変更機能は非常に便利です。このプロジェクトは、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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Docker+K8S クラスタ環境構築と分散アプリケーション展開
>>: VS2019 が mysql8.0 データベースに接続する方法 (画像とテキスト付き)
環境: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-glibc2.5...
Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...
公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...
目次プロセスデモミニプログラムバックエンドインターフェースプロセス各リクエストインターフェースは検証...
最近、スタック コンテキストについて学習しています。学習の過程で、z-index が 0 の場合と ...
HTML 入力属性値属性value 属性は、入力フィールドの初期値を指定します。 <フォーム...
目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....
目次1. 関数パラメータのデフォルト値1.1 関数パラメータのデフォルト値の指定1.2 分離割り当て...
Ubuntu 18.04、その他のバージョンのUbuntu質問: sudo apt-get ins...
RFC793 ドキュメントの SYN フラグを持つプロセス パケットはデータを伝送できません。つま...
目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...
以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...
この記事では、Ubuntu 環境で PHP と Nginx をコンパイルしてインストールする方法につ...
目次序文1. カプセル化の重要性2. どのようにカプセル化しますか? 1. 準備2. 梱包を開始する...
el-dialogをコンポーネントとしてカプセル化するelement-ui を使用する場合、ポップア...