ホームページ  >  記事  >  ウェブフロントエンド  >  Vueでスキンを変更するにはどうすればよいですか?

Vueでスキンを変更するにはどうすればよいですか?

亚连
亚连オリジナル
2018-06-09 18:08:312050ブラウズ

この記事では主に Vue スキンの再形成の実践例を紹介しますので、参考にしてください。

最近、会社が行ったプロジェクトで、Webサイトのスキンのリスキン、つまりテーマの切り替えのリクエストを受けました。では、テーマカラーを切り替えるにはどうすればよいでしょうか?テーマカラーを切り替えるということは、実際にはCSSを切り替えることになりますが、プロジェクトではCSSだけでなくアイコンや画像もテーマに合わせて切り替える必要があります。ということで、Vueでスキン変更を実装する過程を記録する記事を書きましたので、まずはその効果を見てみましょう。

この記事は主にCSS切り替え、アイコン切り替え、画像切り替えの3つのパートに分かれています。

CSSの切り替え

CSSの色の切り替えについては、ElementUIソリューションを検索して参照しました。大まかに言うと、4つのステップに分かれています

静的ディレクトリにtheme.cssファイルを作成し、必要なCSSを追加します。このファイル

.side-bar {
 background: linear-gradient(#B7A3FF, #879FFF) !important;
}

.side-bar .account-info {
 background: #8981D8 !important;
}

ですべてのオプションのテーマを宣言します。各色は簡単に識別できるようにキーワードに対応しています

colors: [{
 themeId: 1,
 familyPrimary: '#B7A3FF',
 familySecondary: '#879FFF',
 sideBarTop: '#8981D8'
}, {
 themeId: 2,
 familyPrimary: '#FDC5C5',
 familySecondary: '#F070A0',
 sideBarTop: '#E7829F'
}, {
 themeId: 3,
 familyPrimary: '#414D6C',
 familySecondary: '#2D1E3C',
 sideBarTop: '#423C50'
}]

AJAX を介して theme.css を取得し、色の値をキーワードに置き換えます。

 getFile(`/static/theme.css`)
  .then(({data}) => {
   let style = getStyleTemplate(data)
  })

function getStyleTemplate (data) {
 const colorMap = {
  '#B7A3FF': 'familyPrimary',
  '#879FFF': 'familySecondary',
  '#8981D8': 'sideBarTop'
 }
 Object.keys(colorMap).forEach(key => {
  const value = colorMap[key]
  data = data.replace(new RegExp(key, 'ig'), value)
 })
 return data
}

キーワードを生成されたばかりの対応する色の値に置き換え、ページにスタイルタグを追加します

 getFile(`/static/theme.css`)
  .then(({data}) => {
   let style = getStyleTemplate(data)
   writeNewStyle(style, this.color)
  })

function writeNewStyle (originalStyle, colors) {
 let oldEl = document.getElementById('temp-style')
 let cssText = originalStyle
 Object.keys(colors).forEach(key => {
  cssText = cssText.replace(new RegExp(key, 'ig'), colors[key])
 })
 const style = document.createElement('style')
 style.innerText = cssText
 style.id = 'temp-style'
 oldEl ? document.head.replaceChild(style, oldEl) : document.head.appendChild(style)
}

アイコン切り替え

プロジェクトが最初に開始されたとき、スキンの変更の必要性は考慮されていなかったため、すべてのアイコンは img タグを使用して参照されます。これにより、アイコンの色を動的に切り替えることができなくなります。そのため、代わりにフォント ファイル内のアイコンを使用することにしました。画像を簡単にフォントファイルに変換できるおすすめサイト「icomoon」を紹介します。アイコンはフォントを使用して使用するのにも非常に適しており、アイコンのサイズと色をより便利に変更できます。

オンライン変換を通じて、ダウンロードしたフォントファイルをプロジェクトに配置し、すべてのアイコンを宣言するための新しいCSSファイルを作成します。

 <img src="../../assets/icon_edit.svg">

これで、CSS クラス名を介してアイコンを参照できるようになります。

@font-face {
 font-family: &#39;icomoon&#39;;
 src: url(&#39;../assets/fonts/icomoon.eot?vpkwno&#39;);
 src: url(&#39;../assets/fonts/icomoon.eot?vpkwno#iefix&#39;) format(&#39;embedded-opentype&#39;),
 url(&#39;../assets/fonts/icomoon.ttf?vpkwno&#39;) format(&#39;truetype&#39;),
 url(&#39;../assets/fonts/icomoon.woff?vpkwno&#39;) format(&#39;woff&#39;),
 url(&#39;../assets/fonts/icomoon.svg?vpkwno#icomoon&#39;) format(&#39;svg&#39;);
 font-weight: normal;
 font-style: normal;
}

[class^="icon-"], [class*=" icon-"] {
 /* use !important to prevent issues with browser extensions that change fonts */
 font-family: &#39;icomoon&#39; !important;
 speak: none;
 font-style: normal;
 font-weight: normal;
 font-variant: normal;
 text-transform: none;
 line-height: 1;
 vertical-align: sub;

 /* Better Font Rendering =========== */
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
}

.icon-edit:before {
 content: "\e900";
}

テーマを有効にするには、アイコンのCSSをtheme.cssファイルに書き込む必要もあります

 <span class="icon-edit"></span>

画像切り替え

プロジェクトには多くのプレースホルダー画像や他の画像もあります。テーマの変更に応じて変更されます。すべての画像を紹介し、ファイル名を使用して、さまざまなテーマに対応する画像を区別します。クリックしてテーマを切り替えると、テーマに対応したファイルに切り替わり、画像を切り替えることができます。これを行うために、ミックスインを作成し、そのミックスインをコンポーネントに導入しました。

.icon_edit:before {
 background-image: linear-gradient(-135deg, #879FFF 0%, #B7A3FF 100%);
}

placeholderMixin

<img :src="userImg || placeholderWoman">

クリックしてテーマを切り替えると、changeTheme イベントが発行され、各コンポーネントがchangeTheme イベントを受け取ると、画像の値が再割り当てされ、画像を切り替える効果が得られます。

let callback
const placeholderMixin = {
 data () {
  return {
   placeholderWoman: &#39;&#39;,
   placeHolderNoReply: &#39;&#39;,
   placeHolderNothing: &#39;&#39;
  }
 },
 created () {
  let themeId = localStorage.getItem(&#39;themeId&#39;)
  let theme = themeId2Name(themeId)
  this.setThemeValue(theme)
  callback = (theme) => {
   this.setThemeValue(theme)
  }
  bus.$on(&#39;changeTheme&#39;, callback)
 },
 destroyed () {
  bus.$off(&#39;changeTheme&#39;, callback)
 },
 methods: {
  setThemeValue (theme) {
   this.placeholderWoman = require(`@/assets/placeholder_woman_${theme}.svg`)
   this.placeHolderNoReply = require(`@/assets/icon_noreply_${theme}.svg`)
   this.placeHolderNothing = require(`@/assets/icon_nothing_${theme}.svg`)
  }
 }
}

これでもテーマを切り替える効果が得られますが、この方法ではほぼすべてのビジネスコンポーネントにミックスインを導入する必要があります。より良い方法があれば、お気軽にご連絡ください。

上記は私があなたのためにまとめたものです。

関連記事:

ブートストラップでテーブルサポートの高さのパーセンテージを実装する方法

Vue2.0でサブ兄弟コンポーネント間のデータインタラクションを実装する方法

vueでカスタムグローバルメソッドを実装する方法

以上がVueでスキンを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。