uniapp主题切换功能的第二种实现方式(scss变量+require)

这篇具有很好参考价值的文章主要介绍了uniapp主题切换功能的第二种实现方式(scss变量+require)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇 “uniapp主题切换功能的第一种实现方式(scss变量+vuex)” 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接下我再给大家介绍另外一种切换主题的方法“scss变量+require”的方式

在介绍如何使用前,先看下最后的效果,以便大家能更好的理解,下面是效果图:

除了图上的这个页面切换了外,整体项目都有主题色的切换,具体效果可扫码自行查看。

接下来详细介绍下第二种实现方式

实现原理

定义两套主题色(多套再自己加)theme-dark.scss、theme-light.scss,每套主题色维护着自己的颜色,通过require动态引入scss的形式引入当前主题,从而达到切换主题的目的

第一步:创建不同主题色

创建白天与夜晚模式

创建白天模式

common/theme/theme-dark.scss

/* 切换主题主要切换的是  整体背景色、区块背景色、文字颜色等 */

// 页面主题
.theme-page{
	background-color: #333 !important;
	// 文字颜色
	.theme-color{
		color: #FFF !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #FFFFFF !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

// 如果想单独给个人中心设置一个主题色
.theme-user-page{
	background-color: #1a1a1a !important;
	// 文字颜色
	.theme-color{
		color: #FFF !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #FFFFFF !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

创建夜间模式

common/theme/theme-light.scss

/* 切换主题主要切换的是  整体背景色、区块背景色、文字颜色等 */

// 页面主题
.theme-page{
	background-color: #FFF !important;
	// 文字颜色
	.theme-color{
		color: #333 !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #999 !important;
		.theme-color{
			color: #333 !important;
		}
	}
}

// 如果想单独给个人中心设置一个主题色
.theme-user-page{
	background-color: #F2F2F2;
	// 文字颜色
	.theme-color{
		color: #666 !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #999 !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

东西多了的情况,例如有5套主题色,分开不是很好维护,所以

可以考虑把颜色值独立出去

改进:独立主题色

定义_theme.scss

$themes: (
	// 白天模式
    light:(
        page: (
            background-color: #fff,
            color: (
                color: #333,
            ),
            block: (
                background-color: #333,
                color: (
                    color: #fff,
                ),
            ),
        ),
        user-page: (
            background-color: #f2f2f2,
            color: (
                color: #666,
            ),
            block: (
                background-color: #999,
                color: (
                    color: #000,
                ),
            ),
        ),
    ),
	// 夜间模式
    dark:(
        page: (
            background-color: #333,
            color: (
                color: #fff,
            ),
            block: (
                background-color: #fff,
                color: (
                    color: #000,
                ),
            ),
        ),
        user-page: (
            background-color: #1a1a1a,
            color: (
                color: #fff,
            ),
            block: (
                background-color: #FFFFFF,
                color: (
                    color: #000,
                ),
            ),
        ),
    )
);

第二步:处理主题色

通过混入生成不同主题样式,代码如下

@mixin map-to-class($map, $divider: "-", $select: ".theme", $isRoot: false, $root-select: ".theme") {
    $select: if($select== "" and &, &, $select);
    @each $k, $v in $map {
        $currSelect: if($isRoot, #{$root-select}#{$divider}#{$k}, #{$select}#{$divider}#{$k});
        #{$currSelect} {
            @if type-of($v) ==map {
                @include map-to-class($v, $divider, "", true) {
                    @content;
                }
            } @else {
                @at-root #{$select} {
                    #{$k}: $v !important;
                }
            }
        }
    }
}

@each $key, $mode in $themes {
    @if $key== "light" {
        @include map-to-class($mode);
    }
}
// 或
@each $key, $mode in $themes {
    @if $key== "dark" {
        @include map-to-class($mode);
    }
}

大家可以用sass编辑器看一下最终的样式是什么样的

第三步:App.vue动态引入

在App.vue里面通过require动态引入主题,当前每次切换主题的时候要把当前主题数据进行保存。

onLaunch: function() {
    let theme = uni.getStorageSync('theme') || 'light';
    // import `@/common/theme/theme-${mode}.scss`;  //记住不能import哦
    require(`@/common/theme/theme-${theme}.scss`);
},
// ......

这样就实现了动态引入

以后只须要维护_theme.scss即可

最后测试

测试代码:

<template>
	<view class="tpf-page theme-page">
		<text class="theme-color">订单</text>
		<view class="theme-block block flex flex-align-center flex-pack-center">
			<text class="theme-color">板块里面的文本</text>	
		</view>
		<view class="flex flex-align-center flex-pack-justify change-theme">
			<text class="button" @tap="changeTheme('light')">白天模式</text>
			<text class="button dark" @tap="changeTheme('dark')">夜间模式</text>
		</view>	
	</view>
</template>

<script>
export default{
	data(){
		return {
			
		}
	},
	methods:{
		changeTheme(mode){
			uni.setStorageSync('theme',mode);
			setTimeout(()=>{
				location.reload();
			},200);
		}
	},
	onReady() {
		let theme = uni.getStorageSync('theme') || 'dark';
		if(theme == 'dark'){
			// 动态设置导航条颜色
			uni.setNavigationBarColor({
				frontColor:'#ffffff',
				backgroundColor:'#333333'
			});
			
			// 动态设置tabbar样式
			uni.setTabBarStyle({
				backgroundColor:'#333333',
				color: '#FFF',
				selectedColor: '#0BB640',
				borderStyle: 'white'
			});
		}else{
			// 动态设置导航条颜色
			uni.setNavigationBarColor({
				frontColor:'#000000',
				backgroundColor:'#FFFFFF'
			});
			
			// 动态设置tabbar样式
			uni.setTabBarStyle({
				backgroundColor:'#FFFFFF',
				color: '#333',
				selectedColor: '#0BB640',
				borderStyle: 'black'
			});
		}
	}
}
</script>

<style lang="scss" scoped>
.block{
	width: 710rpx;
	height: 300rpx;
	margin: 20rpx 0;
}
.change-theme{
	width: 400rpx;
}
.button{
	background-color:#FFF;
	color: #000;
	padding: 20rpx;
}
.dark{
		background-color: #000;
		color: #FFF;
}
</style>

在这里导航栏与tabbar都是通过手动设置的,因为必须是js操作,所以样式不能去读css,为了方便,我们也可以定义一个theme.js专门来维护导航栏与tabar样式

补充theme.js

theme.js定义主题案例代码:

const themes = {
	light:{
		navBar:{
			bgColor:'#000',
			color:'#FFF'
		},
		tabBar:{
			bgColor:'#000',
			color:'#FFF',
			borderStyle:'black'
		}	
	},
	dark:{
		navBar:{
			bgColor:'#FFF',
			color:'#000'
		},
		tabBar:{
			bgColor:'#f2f2f2',
			color:'#333',
			borderStyle:'white'
		}
	}
}

let mode = 'dark'

export default themes[mode];

页面就可以通过引入这个js,通过当前主题引入相关的配置即可。这样方便统一维护与管理 。

最后总结

scss变量+require的方式明显比第一种要好,减少了页面与主题的耦合度,维护起来也方便

但出于一些性能上的问题(官方回答),在某些平台或版本已经取消了require动态引入样式的功能,因此这个是有兼容问题的。

这就是我给大家介绍的第二种unippa主题切换的方式,有问题欢迎大家留言交流。https://www.cnblogs.com/top8/p/17460706.html文章来源地址https://www.toymoban.com/news/detail-474367.html

到了这里,关于uniapp主题切换功能的第二种实现方式(scss变量+require)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端实现动态切换主题色-使用 css/less 动态更换主题颜色(换肤功能)或通过单击更改背景颜色

    提示: 以下是本篇文章正文内容,主要描述 使用 css/less 动态更换主题色(换肤功能) 提示: 使用 css/less 动态更换主题色(换肤功能), 方法共通,不限制技术栈: 其实在日常项目开发中经常会遇到有些用户想要一些自定义的的主题色来满足不同的视觉需求,这时候就需

    2024年02月15日
    浏览(67)
  • Naive UI+Vue3来实现点击按钮一键切换明暗主题的功能

    记录一下如何使用Naive UI+Vue3代码来实现一键切换明暗主题的功能。 效果如下: 终端下输入: 起好项目的名称,然后一路回车即可。 至此Vue3的项目已经搭建完毕,打开http://127.0.0.1:5173/就可以看到项目的默认首页了。 安装Naive UI依赖库 然后我们根据官方出的配置对项目进行

    2024年02月12日
    浏览(42)
  • Verilog实现FPGA倍频:使用第二种方法

    Verilog实现FPGA倍频:使用第二种方法 在FPGA设计中,时钟频率的提高是一个重要的问题。为了解决这个问题,我们可以使用FPGA的PLL模块来实现倍频,将原本的低频时钟转换成更高的时钟频率。在Verilog语言中,有两种方法可以实现倍频,本篇文章将会介绍使用第二种方法实现倍

    2024年02月08日
    浏览(47)
  • kafka Consumer 消费者使用多线程并发执行,并保证顺序消费, 第一种使用纯线程方式、第二种使用Executors线程池

    网上搜索kafka消费者通过多线程进行顺序消费的内容都不太理想,或者太过复杂,所以自己写了几个demo,供大家参考指正。         单个消费者,每秒需要处理1000条数据,每条数据的处理时间为500ms,相同accNum(客户账号)的数据需要保证消费的顺序。 1、如果1秒钟生产

    2024年02月15日
    浏览(42)
  • uniapp切换主题颜色(后台管理系统)

    需求:在现有已经做好的后台管理系统添加一个切换主题颜色的功能 分析:该项目用了很多uniapp的组件,css样式没有统一,类名也没有统一 使用混合mixin.scss,并使用vuex 效果图 功能:按钮背景颜色、部分样式、字体图标、分页跟随主题颜色变化也变化 每一个用户喜欢的主题

    2024年02月10日
    浏览(45)
  • 从创建文件开始,使用git clone方式把代码上传到服务器上,并配置好环境(Pycharm远程连接服务器来跑代码第二种方式)

    本文是在这篇[关于git clone http://xxxxxxxxxxx报错的问题]基础上,扩展把代码放到服务器上运行 想知道为什么使用git clone报错的同学可以去瞅瞅 以下工作都是建立在创建好虚拟环境的基础上 创建虚拟环境直接使用 具体文章以前也写过了点我传送 首先要准备一个文件夹,专门用

    2024年02月03日
    浏览(72)
  • (详解)vue中实现主题切换的三种方式

    目录 一、背景 二、实现思路  方法1:定义全局的CSS变量  方法2:切换已定义好的css文件  方法3:切换顶级CSS类名 (需使用css处理器,如sass、less等) 在我们开发中我们会遇到像是需要切换程序风格、 主题切换 啦这种应用场景。 参考大佬博客!!! vue中实现 ‘换肤 / 切换样

    2024年02月08日
    浏览(41)
  • 记录uniapp切换主题色能在抖音小程序上无效问题

    东西很简单,就是一个data-theme=\\\"light\\\"这种,就可以换不同的主题色 但是运行到抖音小程序无效,但是改成 class=“theme-light” 就可以,但是仅限于页面层级的,组件的也不行 不知道现在怎么回事,也不知道该咋改了 css html

    2024年02月09日
    浏览(47)
  • Vue项目如何配置、切换主题颜色(mixin + scss方式,简单高效)

    但图多 基本样式: 红色主题: 蓝色主题: 看到这里,是不是有人已经开始安耐不住了 ?😏 一. 首先,引入scss依赖(node-sass, sass-loader) 二.项目样式文件目录介绍 1.此处我将项目中的公共样式文件放到了 src/style目录下,其中 index.scss是以供全局使用的一些基本样式,在main

    2024年02月04日
    浏览(43)
  • Mysql分组排序取每组第一条(二种实现方式)

    记录一下最近的一个需求,查不同产品排名第一的图片作为主图 其实一开始想用的是 mybatis的级联查询 ,结果说需要一次性全部查出来 那就没事了,改 sql 咯: 亲测实用 MySQL:8.0 Java:1.8 建表语句: 这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包