张惠国 發表於 2022-12-14 13:58:00

uni-app 动态修改主题色

<p class="md-end-block md-p md-focus"><span class="md-tab"> <span class="md-plain">老是碰到初版制作完成没多久,就整一出说什么要更改整个项目的色彩体系。真的是宝宝心里苦啊!</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">起初都是通过uni项目自带的uni.scss中定义,在替换页面上对应的css。以便于达到一次性修改整体布局的样式。</span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">一.uni.scss 使用方式</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在该文件里定义: $名字 :颜色值;</span></p>
<p class="md-end-block md-p"><span class="md-plain"><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214134507384-1261779450.png" alt=""></span></p>
<p>使用时需要在 style 节点上加上 lang=“scss”</p>
<div class="cnblogs_code">
<pre>&lt;style lang="scss" scoped&gt;<span style="color: rgba(0, 0, 0, 1)">
    .bg {
      height: 120px;
      width: </span>100%<span style="color: rgba(0, 0, 0, 1)">;
      background</span>-color: $uni-color-<span style="color: rgba(0, 0, 0, 1)">primary;
    }
</span>&lt;/style&gt;</pre>
</div>
<p>该方法使用,适合单一颜色修改,一次修改全局统一。</p>
<h2 class="md-end-block md-heading"><span class="md-plain">二.暗黑主题</span></h2>
<p class="md-end-block md-p"><span class="md-plain">暗黑模式(Dark Mode),也被称为夜间模式或深色模式,是一种高对比度,或者反色模式的显示模式。是一种有利于在黑暗环境下观看手机的高对比度的模式。uni-app的暗黑模式,是帮助开发者完成自己应用的暗黑模式的一批配置和API。开发者可以参考本文实现自己应用的暗黑模式。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong>注:HBuilder X 3.6.9+ 支持 目前只支持深色和浅色</strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">具体介绍看官网地址:<span class="md-link md-pair-s">https://uniapp.dcloud.net.cn/tutorial/darkmode.html</span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">三.自定义主题配置</span></h2>
<p class="md-end-block md-p"><span class="md-plain">可自行定义多种主题配色,通过js动态修改导航栏等色彩。缺点在于,页面加载缓慢时前期会显示出原有的色彩。整体上不影响使用。</span></p>
<p class="md-end-block md-p"><span class="md-plain">注:在APP 微信小程序 H5 都行</span></p>
<p class="md-end-block md-p"><span class="md-plain"><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214134558805-1568388512.png" alt=""></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">1.在根目录下新建 theme 文件夹</span></h3>
<p class="md-end-block md-p"><span class="md-pair-s"><code>css-theme.scss</code><span class="md-plain"> <span class="md-pair-s "><strong>主题适配主要css</strong></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>css-variate.scss</code><span class="md-plain"> <span class="md-pair-s"><strong>统一颜色值配置</strong></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>cue-theme.js</code><span class="md-plain"> <span class="md-pair-s"><strong>vue 混入js</strong></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>system-theme.js</code><span class="md-plain"> <span class="md-pair-s "><strong>自定义的相关配置</strong></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214134616162-815922249.png" alt=""></span></p>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain">css-theme </span></h4>
<p class="md-end-block md-p"><span class="md-plain">主要为使用sass切换主题,百度一下大部分都是按照以下配置,这里不过多介绍</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong>注:uni中使用时 建议这个scss 在 uni.scss 中 引入该scss</strong></span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_64df70fd-7faf-4df8-ae5b-92ebd4f09d37" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_64df70fd-7faf-4df8-ae5b-92ebd4f09d37" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_64df70fd-7faf-4df8-ae5b-92ebd4f09d37" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* @author: Jay
* @description: 通过监听 css 变量切换主题色
* @createTime: 2022-12-13 11:29:00
* @introduce: 需要在 uni.scss 中 引入该scss
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">

//统一配置色彩
@import "./css-variate.scss";

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">---------------------方法一 使用css 控制变量---------------------------</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    使用方法
    .css-theme {
      width: 100%;
      @include text-color();
      @include base-background();
      @include border-color();
      @include shadow-color();
    }
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 白天主题 颜色集合 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
$day-theme:(
    bg-color:$day-bg,
    text-color:$day-text,
    border-color: $day-border,
    shadow-color:$day-shadow
);

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 夜间主题 颜色集合 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
$night-theme:(
    bg-color:$night-bg,
    text-color:$night-text,
    border-color: $night-border,
    shadow-color: $night-shadow
);

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 玉红主题 颜色集合 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
$jade-theme:(
    bg-color:$jade-bg,
    text-color:$jade-text,
    border-color: $jade-border,
    shadow-color: $jade-shadow
);

//定义主题对象
$themes: (
day-theme: $day-theme,
night-theme: $night-theme,
jade-theme: $jade-theme
);

// 生成主题背景色样式
@mixin base-background()</span>{<span style="color: rgba(255, 0, 0, 1)">
    @each $themename , $theme in $themes {
      &amp;.#{$themename</span>} {<span style="color: rgba(255, 0, 0, 1)">
            background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> map-get($map: $theme, $key: bg-color)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
    }
}

// 生成主题字体色样式
@mixin text-color()</span>{<span style="color: rgba(255, 0, 0, 1)">
    @each $themename , $theme in $themes {
      &amp;.#{$themename</span>} {<span style="color: rgba(255, 0, 0, 1)">
            color</span>:<span style="color: rgba(0, 0, 255, 1)"> map-get($map: $theme, $key: text-color) !important</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
    }
}

// 生成主题边框色样式
@mixin border-color($opa: 1.0)</span>{<span style="color: rgba(255, 0, 0, 1)">
    @each $themename , $theme in $themes {
      &amp;.#{$themename</span>} {<span style="color: rgba(255, 0, 0, 1)">
            border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> rgba(map-get($map: $theme, $key: border-color), $opa) !important</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
    }
}

// 生成主题阴影
@mixin shadow-color()</span>{<span style="color: rgba(255, 0, 0, 1)">
    @each $themename , $theme in $themes {
      &amp;.#{$themename</span>} {<span style="color: rgba(255, 0, 0, 1)">
            box-shadow</span>:<span style="color: rgba(0, 0, 255, 1)"> 0 16rpx 32rpx rgba(map-get($map: $theme, $key: shadow-color), 0.4)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">---------------------方法二 使用css 属性选择器---------------------------</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    使用方法
      &lt;view class="padding-sm" :data-theme="cueTheme"&gt;
            暗黑模式-官方自带:(只支持 白天黑夜)
      &lt;/view&gt;
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 白天主题 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
</span>{<span style="color: rgba(255, 0, 0, 1)">
    background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $day-bg</span>;<span style="color: rgba(255, 0, 0, 1)">
    color</span>:<span style="color: rgba(0, 0, 255, 1)"> $day-text</span>;<span style="color: rgba(255, 0, 0, 1)">
    border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $day-border !important</span>;<span style="color: rgba(255, 0, 0, 1)">
    shadow-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $day-shadow</span>;
}

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 夜间主题 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
</span>{<span style="color: rgba(255, 0, 0, 1)">
    background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $night-bg</span>;<span style="color: rgba(255, 0, 0, 1)">
    color</span>:<span style="color: rgba(0, 0, 255, 1)"> $night-text</span>;<span style="color: rgba(255, 0, 0, 1)">
    border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $night-border !important</span>;<span style="color: rgba(255, 0, 0, 1)">
    shadow-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $night-shadow</span>;
}

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 玉红主题 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
</span>{<span style="color: rgba(255, 0, 0, 1)">
    background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $jade-bg</span>;<span style="color: rgba(255, 0, 0, 1)">
    color</span>:<span style="color: rgba(0, 0, 255, 1)"> $jade-text</span>;<span style="color: rgba(255, 0, 0, 1)">
    border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $jade-border !important</span>;<span style="color: rgba(255, 0, 0, 1)">
    shadow-color</span>:<span style="color: rgba(0, 0, 255, 1)"> $jade-shadow</span>;
}</pre>
</div>
<span class="cnblogs_code_collapse">css-theme </span></div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">uni.scss中引入</span></h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 主题相关颜色 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
@import './theme/css-theme.scss';</span></pre>
</div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain">css-variate</span></h4>
<p class="md-end-block md-p"><span class="md-plain">主要为配置主题所需css 颜色值,方便统一修改。</span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_0983347f-5da7-41bd-9c6e-9b1014911494" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_0983347f-5da7-41bd-9c6e-9b1014911494" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_0983347f-5da7-41bd-9c6e-9b1014911494" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    主题 统一配置色彩
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">

//页面背景色
$page-bg:var(--page-bg,#FFFFFF);

// 白天主题
$day-bg: #FFFFFF;
$day-text: #333333;
$day-border: #c8c7cc;
$day-shadow: #c8c7cc;

// 夜间主题
$night-bg: #292929;
$night-text: #FFFFFF;
$night-border: #c8c7cc;
$night-shadow: #FFFFFF;

// 玉红主题
$jade-bg: #c04851;
$jade-text: #FFFFFF;
$jade-border: #eea2a4;
$jade-shadow: #f1939c;

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    需要在js 中使用的css 导出
      APP 无法使用
      h5 微信小程序有值
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">

:export </span>{<span style="color: rgba(255, 0, 0, 1)">
    dayBg</span>:<span style="color: rgba(0, 0, 255, 1)"> $day-bg</span>;<span style="color: rgba(255, 0, 0, 1)">
    nightBg</span>:<span style="color: rgba(0, 0, 255, 1)"> $night-bg</span>;<span style="color: rgba(255, 0, 0, 1)">
    jadeBg</span>:<span style="color: rgba(0, 0, 255, 1)"> $jade-bg</span>;
}</pre>
</div>
<span class="cnblogs_code_collapse">css-variate</span></div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain">cue-theme</span></h4>
<p class="md-end-block md-p"><span class="md-plain">主要使用 混入 (mixin) ,方便与在页面中复用相同的功能。</span></p>
<p class="md-end-block md-p"><span class="md-plain">该方法主要调用vuex的数据 和 system-theme 中的方法</span></p>
<p class="md-end-block md-p"><span class="md-plain">注:需要在main.js 导入该js</span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_ed65b8b5-ddfd-4d40-a4c1-f303404b3013" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_ed65b8b5-ddfd-4d40-a4c1-f303404b3013" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_ed65b8b5-ddfd-4d40-a4c1-f303404b3013" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* @author: Jay
* @description: 监听主题变化
* @createTime: 2022-12-12 15:22:19
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
import system from </span>'../theme/system-theme'<span style="color: rgba(0, 0, 0, 1)">
import {
    mapMutations,
    mapGetters
} from </span>'vuex'<span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
    install(Vue) {
      Vue.mixin({
            onShow() {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">修改导航栏 底部 tab</span>
                system.setSystemTheme(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.cueTheme)
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取缓存 背景色</span>
                let bgColor = uni.getStorageSync('pageColor') || ''<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (bgColor) {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getSystemBg(bgColor)
                }
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取缓存 主题名字</span>
                let themeType = uni.getStorageSync('themeType') || ''<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (themeType) {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.cueGetTheme(themeType)
                }
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 监听主题状态变化</span>
                uni.onThemeChange((res) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log("监听主题状态变化", res.theme);</span>
                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">黑夜</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (res.theme == 'dark'<span style="color: rgba(0, 0, 0, 1)">) {
                        </span><span style="color: rgba(0, 0, 255, 1)">this</span>.cueGetTheme('night-theme'<span style="color: rgba(0, 0, 0, 1)">)
                  }
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">白天</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (res.theme == 'light'<span style="color: rgba(0, 0, 0, 1)">) {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 有多个主题时 判断 缓存是否为白色主题</span>
                        let type = uni.getStorageSync('themeType'<span style="color: rgba(0, 0, 0, 1)">);
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (type != 'day-theme'<span style="color: rgba(0, 0, 0, 1)">) {
                            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.cueGetTheme(type)
                        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.cueGetTheme('day-theme'<span style="color: rgba(0, 0, 0, 1)">)
                        }
                  }
                });
            },
            computed: {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取vuex 主题参数</span>
<span style="color: rgba(0, 0, 0, 1)">                ...mapGetters({
                  cueTheme: </span>'theme/theme'<span style="color: rgba(0, 0, 0, 1)">,
                  pageBg: </span>'theme/pageColor'<span style="color: rgba(0, 0, 0, 1)">,
                }),
            },
            methods: {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改主题</span>
<span style="color: rgba(0, 0, 0, 1)">                ...mapMutations({
                  cueGetTheme: </span>'theme/GET_THEME'<span style="color: rgba(0, 0, 0, 1)">,
                  themeCache: </span>'theme/SET_THEME_CACHE'<span style="color: rgba(0, 0, 0, 1)">,
                  pageColorCache: </span>'theme/SET_PAGE_COLOR'<span style="color: rgba(0, 0, 0, 1)">
                }),
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置 全局背景色</span>
<span style="color: rgba(0, 0, 0, 1)">                getSystemBg() {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从 主题列表 获取 页面颜色</span>
                  let bgColor = system.systemThemeBg(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.cueTheme)
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(bgColor);</span>
                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">缓存 已设置 背景色</span>
                  <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.pageColorCache(bgColor)
                }
            }
      })
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">cue-theme</span></div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">main.js 导入</span></h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监听主题变化</span>
import theme from './theme/cue-theme.js'<span style="color: rgba(0, 0, 0, 1)">
Vue.use(theme)</span></pre>
</div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain">system-theme</span></h4>
<p class="md-end-block md-p"><span class="md-plain">主要用来放置一些需要重复使用的js。可根据需求自行添加</span></p>
<p class="md-end-block md-p"><span class="md-plain">注: themeList 为系统主题列表参数相关配置,用于全局设置系统导航栏,底部tab颜色值的存放。</span></p>
<p class="md-end-block md-p"><span class="md-plain">注:其中导入 css-variate.scss 在app 没有相关数据返回,h5,微信小程序则有数据返回。其他平台自行测试。</span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_7a4dae3b-69f4-489f-84c5-4b8693817f7d" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_7a4dae3b-69f4-489f-84c5-4b8693817f7d" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7a4dae3b-69f4-489f-84c5-4b8693817f7d" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* @author: Jay
* @description: 主题相关配置
* @createTime: 2022-12-12 17:45:09
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    variables APP 拿不到值
    h5 微信小程序有值返回
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
import variables from </span>'./css-variate.scss'<span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
      系统主题列表
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    themeList() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [{
            title: </span>"白天"<span style="color: rgba(0, 0, 0, 1)">,
            name: </span>"day-theme"<span style="color: rgba(0, 0, 0, 1)">,
            navBg: variables.dayBg,
            navBgApp: </span>"#FFFFFF"<span style="color: rgba(0, 0, 0, 1)">,
            tabBg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabSeleText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
      }, {
            title: </span>"黑夜"<span style="color: rgba(0, 0, 0, 1)">,
            name: </span>"night-theme"<span style="color: rgba(0, 0, 0, 1)">,
            navBg: variables.nightBg,
            navBgApp: </span>"#292929"<span style="color: rgba(0, 0, 0, 1)">,
            tabBg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabSeleText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
      }, {
            title: </span>"玉红"<span style="color: rgba(0, 0, 0, 1)">,
            name: </span>"jade-theme"<span style="color: rgba(0, 0, 0, 1)">,
            navBg: variables.jadeBg,
            navBgApp: </span>"#c04851"<span style="color: rgba(0, 0, 0, 1)">,
            tabBg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabSeleText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
            tabText: </span>""<span style="color: rgba(0, 0, 0, 1)">,
      }]
    },
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据主题 返回背景色</span>
<span style="color: rgba(0, 0, 0, 1)">    systemThemeBg(name) {
      let color </span>= ''
      <span style="color: rgba(0, 0, 255, 1)">this</span>.themeList().map((item, index) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.name ===<span style="color: rgba(0, 0, 0, 1)"> name) {
                color </span>=<span style="color: rgba(0, 0, 0, 1)"> item.navBgApp
            }
      })
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> color
    },
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据主题 修改系统 导航栏 底部 tab</span>
<span style="color: rgba(0, 0, 0, 1)">    setSystemTheme(name) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.themeList().map((item, index) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.name ===<span style="color: rgba(0, 0, 0, 1)"> name) {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置页面导航条颜色</span>
                <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setNavigationColor(item.name, item.navBgApp)
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置 tabBar 样式</span>
                <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setTabBarColor(item.tabBg, item.tabSeleText, item.tabText)
            }
      })
    },
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
      设置页面导航条颜色
      name 主题名字该颜色值只支持2种 故判断对于白天 为 #000 其他均为 #FFF
      bgClor 背景色可以随意修改
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    setNavigationColor(name, bgClor) {
      let navigationBar </span>=<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 前景颜色值 仅支持 #ffffff 和 #000000</span>
            frontColor: name == 'day-theme' ? "#000000" : "#ffffff"<span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 背景颜色值</span>
            backgroundColor: bgClor || "#FFFFFF"<span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> fail(err) {</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   console.error(err)</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> }</span>
<span style="color: rgba(0, 0, 0, 1)">      }
      uni.setNavigationBarColor(navigationBar)
    },

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
      动态 设置 tabBar 样式
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    setTabBarColor(bgColor, seleColor, color) {
      let tabBar </span>=<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 背景色</span>
            backgroundColor: bgColor || '#ffffff'<span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文字选中时的颜色</span>
            selectedColor: seleColor || '#3cc51f'<span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文字默认颜色</span>
            color: color || '#7A7E83'<span style="color: rgba(0, 0, 0, 1)">,
      }
      uni.setTabBarStyle(tabBar)
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">system-theme</span></div>
<h3 class="md-end-block md-heading"><span class="md-plain">2.vuex 配置</span></h3>
<p class="md-end-block md-p"><span class="md-plain">使用vuex模块化开发(module)用于区分主题相关设置 与其他需求。</span></p>
<p class="md-end-block md-p"><span class="md-plain"><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214134926878-1141666419.png" alt=""></span></p>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain">theme.js 模块</span></h4>
<p class="md-end-block md-p"><span class="md-plain">注:<span class="md-pair-s"><code>namespaced: true</code><span class="md-plain"> 主要为 cue-theme 用于模块化调用。缺少这个,在调用cue-theme中的方法时,拿不到所需参数</span></span></span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_57d9c0ff-a639-455c-b119-db7683227b7c" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_57d9c0ff-a639-455c-b119-db7683227b7c" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_57d9c0ff-a639-455c-b119-db7683227b7c" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主题相关配置</span>
import system from '../../theme/system-theme'<span style="color: rgba(0, 0, 0, 1)">

const theme </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    namespaced: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
    state: {
      theme: </span>"day-theme"<span style="color: rgba(0, 0, 0, 1)">,
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主题列表</span>
<span style="color: rgba(0, 0, 0, 1)">      theme: system.themeList(),
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">页面背景色</span>
      pageColor: ""<span style="color: rgba(0, 0, 0, 1)">,
    },
    mutations: {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置主题色</span>
<span style="color: rgba(0, 0, 0, 1)">      GET_THEME(state, provider) {
            state.theme </span>=<span style="color: rgba(0, 0, 0, 1)"> provider
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">修改导航栏 底部 tab</span>
<span style="color: rgba(0, 0, 0, 1)">            system.setSystemTheme(state.theme)
      },
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置主题缓存</span>
<span style="color: rgba(0, 0, 0, 1)">      SET_THEME_CACHE(state, provider) {
            uni.setStorage({
                key: </span>'themeType'<span style="color: rgba(0, 0, 0, 1)">,
                data: provider
            });
      },
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置主题缓存</span>
<span style="color: rgba(0, 0, 0, 1)">      SET_PAGE_COLOR(state, provider) {
            state.pageColor </span>=<span style="color: rgba(0, 0, 0, 1)"> provider
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">缓存</span>
<span style="color: rgba(0, 0, 0, 1)">            uni.setStorage({
                key: </span>'pageColor'<span style="color: rgba(0, 0, 0, 1)">,
                data: provider
            });
      },
    },
    getters: {
      theme: state </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> state.theme,
      pageColor: state </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> state.pageColor
    },
    actions: {

    }
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> theme</pre>
</div>
<span class="cnblogs_code_collapse">theme.js</span></div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">index.js 全局导出</span></h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_7349b6a6-7918-45e8-9eed-1fc3529781c7" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_7349b6a6-7918-45e8-9eed-1fc3529781c7" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7349b6a6-7918-45e8-9eed-1fc3529781c7" class="cnblogs_code_hide">
<pre>import Vue from "vue"<span style="color: rgba(0, 0, 0, 1)">
import Vuex from </span>"vuex"
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">登录</span>
import logIn from "./modules/login.js"
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主题切换</span>
import theme from "./modules/theme.js"<span style="color: rgba(0, 0, 0, 1)">

Vue.use(Vuex)
const store </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vuex.Store({
    modules: {
      theme,
      logIn
    }
})

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> store</pre>
</div>
<span class="cnblogs_code_collapse">index.js</span></div>
<h4 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">main.js中导入</span></h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入store</span>
import store from 'store/index.js'<span style="color: rgba(0, 0, 0, 1)">
Vue.prototype.$store </span>= store</pre>
</div>
<h3 class="md-end-block md-heading md-focus"><span class="md-plain">3.页面中使用</span></h3>
<p class="md-end-block md-p"><span class="md-pair-s"><code>class="conter" :style="{'--page-bg':pageBg}"</code><span class="md-plain"> 为该页面单独设置背景色 ,需要配合 page 设置页面高度使用</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>:data-theme="cueTheme"</code><span class="md-plain"> 给view设置data-theme属性,根据名字匹配对应颜色</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>:class=""</code><span class="md-plain"> 设置对应的名字, css 中使用 <span class="md-pair-s"><code>@include text-color();</code></span></span></span></p>
<p class="md-end-block md-p"><strong><span class="md-plain">案例地址: <span class="md-link md-pair-s">https://gitee.com/jielov/uni-app-tabbar</span></span></strong></p>
<p class="md-end-block md-p"><strong><span class="md-plain"><span class="md-link md-pair-s">插件市场地址:https://ext.dcloud.net.cn/plugin?id=10498</span></span></strong></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_d6d2002f-4945-4f77-bce6-f74f9394a015" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_d6d2002f-4945-4f77-bce6-f74f9394a015" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d6d2002f-4945-4f77-bce6-f74f9394a015" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">
* @author: Jay
* @description: 动态修改主题色
* @createTime: 2022-12-12 14:55:31
</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="conter"</span><span style="color: rgba(255, 0, 0, 1)"> :style</span><span style="color: rgba(0, 0, 255, 1)">="{'--page-bg':pageBg}"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="padding margin-bottom-xl css-theme"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="text-lg text-center text-bold"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                暗黑模式
            </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="margin-top-sm"</span><span style="color: rgba(255, 0, 0, 1)"> @click</span><span style="color: rgba(0, 0, 255, 1)">="openDoc"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                uni-app的暗黑模式。</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">text </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="text-blue"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>点击查看官方文档<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="css-theme padding"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="text-center text-bold text-lg"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                通过判断css 名字修改主题!!!
            </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="margin-tb-sm text-lg text-center"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                当前主题:{{cueTheme}}
            </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="margin-tb-sm text-lg text-center"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                当前页面背景色:{{pageBg}}
            </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="flex align-center justify-around"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="cu-btn round"</span><span style="color: rgba(255, 0, 0, 1)"> @click</span><span style="color: rgba(0, 0, 255, 1)">="cssEditThemeBut('day-theme')"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>白天<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="cu-btn round"</span><span style="color: rgba(255, 0, 0, 1)"> @click</span><span style="color: rgba(0, 0, 255, 1)">="cssEditThemeBut('night-theme')"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>黑夜<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="cu-btn round"</span><span style="color: rgba(255, 0, 0, 1)"> @click</span><span style="color: rgba(0, 0, 255, 1)">="cssEditThemeBut('jade-theme')"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>玉红<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="padding margin-top-xl"</span><span style="color: rgba(255, 0, 0, 1)"> :data-theme</span><span style="color: rgba(0, 0, 255, 1)">="cueTheme"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="text-center text-bold text-lg"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
                通过 data-theme 判断 名字修改主题!!!
            </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
    export </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">default</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
      data() {
            </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
                url: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">https://uniapp.dcloud.net.cn/tutorial/darkmode.html#open-darkmode</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
            };
      },
      onLoad() {
            console.log(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">当前主题:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.cueTheme);
      },
      onShow() {},
      methods: {
            cssEditThemeBut(e) {
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">修改主题</span>
                <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.cueGetTheme(e)
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">设置主题缓存</span>
                <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.themeCache(e)
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">设置 全局背景色</span>
                <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.getSystemBg()
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> js自改变量值h5 可用</span>
                <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> document.getElementsByTagName('body').style.setProperty('--page-bg', 'red');</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">            },
            openDoc() {
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> #ifdef APP</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">                plus.runtime.openWeb(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.url);
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> #endif</span>
                <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> #ifdef H5</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">                let a </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.createElement(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">a</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
                a.href </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.url;
                a.target </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">__blank</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
                a.click();
                a </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">null</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> #endif</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">            }
      }
    }
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">/*</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> 全局背景色 </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">*/</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
    page </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span>
    <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="scss"</span><span style="color: rgba(255, 0, 0, 1)"> scoped</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
    // 全局背景色
    .conter </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      background-color</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> $page-bg</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span>
    <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">

    .css-theme </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      // border</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 2px solid</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      @include text-color();
      @include base-background();
      @include border-color();
      @include shadow-color();
    </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<span class="cnblogs_code_collapse">页面代码</span></div>
<h2>四.黑夜 白天主题展示</h2>
<p><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214135154123-2042313512.png" alt="" loading="lazy"><img src="https://img2023.cnblogs.com/blog/2237618/202212/2237618-20221214135209631-313876479.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:虚乄,转载请注明原文链接:https://www.cnblogs.com/lovejielive/p/16981875.html</p><br><br>
来源:https://www.cnblogs.com/lovejielive/p/16981875.html
頁: [1]
查看完整版本: uni-app 动态修改主题色