Vue 使用 sass 完成 主題切換

一、項目中創(chuàng)建 themes.scss 用來定義全局的顏色?

$themes:?(

??// 日間默認(rèn) 如 font_color1,font_color2 一套主題設(shè)置兩種顏色,項目需要集中顏色就定義這個主題下有多少顏色

??light:?(

????font_color1:?rgb(196,?193,?193),

????font_color2:?rgb(110,?109,?109),

????background_color1:?rgb(255,?0,?21),

????background_color2:?rgb(87,?87,?226),

????border_color1:?rgb(231,?181,?181),

????border_color2:?rgb(9,?255,?0),

????content_color1:rgb(0,?0,?0),

????content_color2:rgb(255,?255,?250),

??),

??//?夜間暗黑

??dark:?(

????font_color1:?rgb(226,?222,?222),

????font_color2:?rgb(255,?255,?255),

????background_color1:?rgb(87,?87,?226),

????background_color2:?rgb(255,?0,?21),

????border_color1:?rgb(9,?255,?0),

????border_color2:?rgb(231,?181,?181),

????content_color1:rgb(255,?255,?250),

????content_color2:rgb(0,?0,?0),

??)

);



二、新建?handle.scss 用于 遍歷主題

@import?"./themes.scss";? // 引入上面定義的themes.scss 日間和夜間主題

//遍歷主題map

@mixin?themeify?{

??@each?$theme-name,?$theme-map?in?$themes?{

????$theme-map:?$theme-map?!global;

????//這步是判斷html的 自定義屬性 data-theme的值??#{}是sass的插值表達(dá)式

????//&?sass嵌套里的父容器標(biāo)識???@content是混合器插槽,像vue的插槽一樣

????[data-theme="#{$theme-name}"]?&?{

??????@content;

????}

??}

}

//聲明一個根據(jù)Key獲取顏色的function

@function?themed($key)?{

??@return?map-get($theme-map,?$key);

}

//獲取背景顏色

@mixin?background_color($color)?{

??@include?themeify?{

????background-color:?themed($color);

??}

}

//獲取字體顏色

@mixin?font_color($color)?{

??@include?themeify?{

????color:?themed($color);

??}

}

//獲取邊框顏色

@mixin?border_color($color)?{

??@include?themeify?{

????border-color:?themed($color);

??}

}

//?獲取內(nèi)容容器的顏色、

@mixin?content_color($color)?{

??@include?themeify?{

????//?內(nèi)容的背景色

????background-color:?themed($color);

????//?還可以接著寫代碼、 比如透明度什么的

??}

}



三、在根目錄下 的vue.config.js 中(如果沒有 vue.config.js? 自己新建一個)

module.exports?=?{

??publicPath:?'./',

??css:?{

????loaderOptions:?{

??????sass:?{

? ? ? ? ? ? // 這里路徑 記得自己改一下

????????data:?` @import?"@/../src/assets/scss/handle.scss"; `?

? ? ?}

????}

??},

}

寫好之后 重新運(yùn)行一下項目



四、項目中使用

<template>

??<div>

????<p>這里是頁面</p>

????<button?@click="toggleTheme(1)">默認(rèn)主題</button>

????<button?@click="toggleTheme(0)">暗黑主題</button>

??</div>

</template>


<script>

export?default?{

??methods:?{

????toggleTheme(index)?{

??????window.document.documentElement.setAttribute(

????????"data-theme",

????????index???"dark"?:?"light"

??????);

????},

??},

};

</script>

<style?lang="scss"?scoped>

// 舉個例子 P標(biāo)簽 文字顏色 邊框顏色 和背景顏色

p?{

??@include?font_color("font_color1");

??@include?border_color("border_color1");

??@include?content_color("content_color1");

}

</style>


成功解決問題記得點(diǎn)個贊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容