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

这篇具有很好参考价值的文章主要介绍了前端实现动态切换主题色-使用 css/less 动态更换主题颜色(换肤功能)或通过单击更改背景颜色。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:以下是本篇文章正文内容,主要描述使用 css/less 动态更换主题色(换肤功能)


前言

提示:使用 css/less 动态更换主题色(换肤功能),方法共通,不限制技术栈:

其实在日常项目开发中经常会遇到有些用户想要一些自定义的的主题色来满足不同的视觉需求,这时候就需要通过动态更改主题色来实现预期的效果;

一、CSS中原生变量“--”和var()

示例:开始之前先稍微了解一下变量“--”和var(),在动态改变主题色中会经常用到这两个变量

@表示我们定义的的变量名称

css中原生的变量定义语法是:--@

例如定义一个边框颜色变量: --border-color: #D9EEE2;

css中变量使用语法是:var(--@)

例如使用定义的边框颜色变量:border: 0.1rem solid var(--border-color);

二、使用步骤

1、自定义样式变量,定义css方法(可以定义多个css样式)

要注意的是不管定义了几个主题色,都要确保定义的变量名保持一致。

// theme.less

/*
 *这里为我们自定义主题色,可以根据自己的需求定义多组样式
 *
*/

// 主题类型定义
:root {
  // 背景色
  --bg-color: #D9EEE2;
  --border-color: #D9EEE2;
  // 很多图标、border都用这个颜色
  --icon-color: #108372;
  // 按钮背景色
  --button-bg-color: var(--dominant-color);
  // 选中字体和图表颜色
  --active-font-color: #037181;
  // hover字体和图表颜色
  --hover-font-color: var(--dominant-color);
  // logo
  --logo: url('你的图片路径')  no-repeat center center;

 ...
 ...
 ...
}


/* 这里假设为我们自定义的主题  */
:root[theme = 'defined'] {
  // 背景色
  --bg-color: pink;
  --border-color: pink;
  // 很多图标、border都用这个颜色
  --icon-color: pink;
  // 按钮背景色
  --button-bg-color: pink;
  // 选中字体和图表颜色
  --active-font-color: pink;
  // hover字体和图表颜色
  --hover-font-color: var(--dominant-color);
  // logo
  --logo: url('你的图片路径')  no-repeat center center;

 ...
 ...
 ...
}

2、使用已定义的变量

使用其实很简单,只要根据主题色动态改变的地方通过var()引用已经定义的样式变量就可以;

/*
 *  这里举个简单的例子 child.less(这里就是项目中引用的css文件)
 */

.root{

  .main{
    background:var(--bg-color);
    border:1px solid var(--border-color);
    
    ...
    
  }

    ...
}

3、用户操作,切换对应的主题

通过设置属性自动匹配选择颜色主题,会修改对应的样式;

1)、首先你跟据需求在特定位置定义好主题切换功能键;

这里是定义的结构体,仅作参考(你可以根据自己项目的框架使用对应的组件都是ok的,没啥特殊要求)

    <div className={styles.root}>
      <Dropdown overlay={menu} placement="bottomCenter">
        <div>
          <i className="iconfont icon-them" />
          <span>主题</span>
        </div>
      </Dropdown>
    </div>

这里是菜单的主题曲部分,切换全靠它了;

// 这里的items就是你要定义的主题的种类,没有key代表一个主题色标识

  const menu = (
    <Menu
      selectable
      selectedKeys={theme}
      onClick={setThemeFun}
      items={[
        {
          label: '默认色',
          key: 'default',
        },
        {
          label: '自定义',
          key: 'defined',
        },
      ]}
    />
  );

2)、然后通过对应的方法设置对应的的主题色;


/*主题色选择后的回调*/
const setThemeFun =(e)=>{
// 这里其实就是将主题表示存在state里,在menu中展示,  默认 const [theme, setTheme] = useState(['default']);
 setTheme([e.key]); 
 //通过修改属性,会用对应的样式
 document.documentElement.setAttribute('theme', e.key);
}

这里建议把切换主题色封装到一个单独的组件,便于维护处理
切记:初始化时要个给一个默认值,这里就不做过多赘述了

4、特殊处理
1)本地存取主题色

其实用户没有的要求的话,一般都是主题的存储本地,可以通过localStorage实现

// 在你需要的时候存在来
localStorage.setItem('theme', e.key);

//特定情况取出来使用就可以了
const defaultTheme = localStorage.getItem('theme');
 if (defaultTheme) {
      setTheme([defaultTheme]);
      document.documentElement.setAttribute('theme', defaultTheme);
 } 

注:本地存储小科普

生存期

localStorage理论上来说是永久有效的,即不主动清空的话就不会消失,即使保存的数据超出了浏览器所规定的大小,也不会把旧数据清空而只会报错。但需要注意的是,在移动设备上的浏览器或各Native App用到的WebView里,localStorage都是不可靠的,可能会因为各种原因(比如说退出App、网络切换、内存不足等原因)被清空。
sessionStorage的生存期顾名思义,类似于session,只要关闭浏览器(也包括浏览器的标签页),就会被清空。由于sessionStorage的生存期太短,因此应用场景很有限,但从另一方面来看,不容易出现异常情况,比较可靠。


2)接口存取主题色

这个就需要跟产品和后端确认好方案,是否绑定用户或者设备,通过对应的接口实现主题色存取,原理和上述本地存储大差不差,具体根据需求走就行了


总结

以上是使用纯CSS控件切换主题颜色或通过单击更改背景颜色,这个个人感觉可能前期样式定义稍微繁琐一点,其他都还可,相对来说易上手方便操作,关键是简单,不过要注意以下几点:
1、需求确定好是否需要主题色切换;
2、需要的话对一些字体图标的定义要跟ui和pd沟通好,构建好对应的iconfont工程,方便使用,因为你要清楚如果单纯使用图片,那切换主题色,变量定义就会很繁琐,一句话怎么方便怎么好维护就怎么来;
3、一定要确保主题的定义的变量保持一致……
……

暂且就这么多,有什么好的方法后期再更新上来,希望对你有所帮助文章来源地址https://www.toymoban.com/news/detail-552786.html

到了这里,关于前端实现动态切换主题色-使用 css/less 动态更换主题颜色(换肤功能)或通过单击更改背景颜色的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 前端实现界面切换主题

    常用的主题切换实现方式之一,就是通过 link 标签的 rel 属性来实现的 当 rel 标签的值是 alternate ,就代表该样式是可以替换的 title 属性要加就全加上或者全不加,因为 title 会导致系统直接识别成样式文件,意思就是如果两个样式文件,第一个没有加该属性,第二个加了该属

    2024年02月08日
    浏览(40)
  • Visual Studio Code(中文英切换,主题更换,等一些常用命令)

    目录 切换成中文界面 切换回英文界面 主题更换 常用命令 安装Visual Studio Code后,界面默认以英语显示。 VS Code支持将界面语言更改为其他语言。以下介绍如何将界面语言更改为中/英文。 点击左侧最下面的一个  在输入框中搜索 Chinese 点击 Install 安装 然后它会让重启下就好了

    2024年02月08日
    浏览(47)
  • 【前端面经】CSS-less/sass/scss的区别和基本使用

    随着Web开发的不断发展,CSS预处理器变得越来越流行。它们为Web开发者提供了一种更高效、更简便的CSS编写方式。Less、Sass以及SCSS作为最受欢迎的三种CSS预处理器,它们都为CSS编写提供了不同的特点和功能。 在本篇博客中,我们将会探讨这三种预处理器之间的区别以及它们的

    2024年02月06日
    浏览(58)
  • 前端使用scale属性结合CSS动态样式实现动态的图片缩放效果

    废话不多说,直接上代码: 示例一,使用css动态样式结合scale进行src图片的缩放。 示例二,使用css动态样式结合scale进行background背景图图片的缩放。

    2024年01月15日
    浏览(63)
  • IOS课程笔记[4-5] 计算器实现与更换主题 的使用

    设置键盘格式为NumberPad 字符串与数字转换方法 NSInteger num2 =[str2 integerValue]; UIAlertController 新版本弹窗 UIAlertView IOS9之前版本 UISwitch 开关组件 UISegmentedControl多选框 -addTarget绑定点击或者切换事件 ##效果展示

    2024年02月07日
    浏览(33)
  • Vue + Element UI 前端篇(六):更换皮肤主题

    命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。 2.安装chalk主题 安装白垩主题,可以从 npm 安装或者从 GitHub 拉取最新代码,这里从 npm 安装。 3.初始化变量

    2024年02月09日
    浏览(55)
  • 前端三大Css处理器之Less

    Less是Css预处理器之一,分别有Sass、Less、Stylus这三个。         Less https://lesscss.org/         Less 是用JavaScript编写的,事实上,Less是一个JavaScript库,他通过混合、变量、嵌套和规则设置循环扩展了原生普通Css的功能。 Less的少数缺点之一是它 不支持函数 。 Less的语法与Scss十

    2024年02月10日
    浏览(48)
  • Vue3 + Vite + Css3切换主题

    1、css3中变量的作用 一个系统或者说一个项目中,往往涉及到很多颜色,但是如果系统看起来样式规整统一的话可能在色值方面偏靠一个色系,字体,颜色,背景颜色,图标颜色等等。 所有可以在css中定义统一的变量,就不用到处去改防止在修改的时候遗漏。 2、css3中如何声

    2024年01月21日
    浏览(53)
  • ElementUI主题颜色动态切换并缓存

    今天给大家分享一下在Vue中使用ElementUI时,想切换主题颜色的两种方式。 第一种:静态改变项目中的主题颜色 比较简单,稍微带过: 项目中创建 element-variables.scss 文件,编写内容: 之后,在项目的入口文件中,直接引入以上样式文件即可(无需引入 Element 编译好的 CSS 文件

    2024年02月14日
    浏览(39)
  • 前端:css less语法 /deep/ 深度影响的用法

    css中通常会在 style 标签内添加 scoped 来避免父组件对子组件的影响,添加了之后只能修改当前组件的样式。 这样做的原理是通过在打包的时候给每个样式都添加一个独一无二的hash值,从而避免父组件对子组件的样式的影响。 添加后控制台显示的样式就会像这样:     设置

    2024年02月12日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包