前端主题切换方案

标签: 前端 切换 | 发表时间:2023-03-17 15:13 | 作者:XinD
出处:https://juejin.cn/frontend

theme: smartblue

前端开发中,主题切换逐渐成为一种常见需求。用户可能希望根据自己的喜好、习惯或者场景需求进行主题切换,例如切换日间与夜间模式。本文主要介绍如何在前端实现主题切换,以及一些应用实例。

一、CSS变量

CSS变量是一种实现主题切换的便捷方法。通过在CSS中定义变量,可以方便地修改主题颜色,例如:

  :root {
  --primary-color: #42b983;
  --secondary-color: #35495e;
}

.button {
  background-color: var(--primary-color);
  color: var(--secondary-color);
}

在JavaScript中,可以通过修改CSS变量的值实现主题切换:

  function switchTheme(theme) {
  if (theme === 'dark') {
    document.documentElement.style.setProperty('--primary-color', '#1c2022');
    document.documentElement.style.setProperty('--secondary-color', '#ffffff');
  } else {
    document.documentElement.style.setProperty('--primary-color', '#42b983');
    document.documentElement.style.setProperty('--secondary-color', '#35495e');
  }
}

二、CSS类名切换

另一种实现主题切换的方法是使用不同的CSS类名。首先,需要在CSS中定义各个主题的样式:

  .light-theme {
  --primary-color: #42b983;
  --secondary-color: #35495e;
}

.dark-theme {
  --primary-color: #1c2022;
  --secondary-color: #ffffff;
}

.button {
  background-color: var(--primary-color);
  color: var(--secondary-color);
}

接下来,在JavaScript中通过切换元素的类名来实现主题切换:

  function switchTheme(theme) {
  const root = document.documentElement;

  if (theme === 'dark') {
    root.classList.add('dark-theme');
    root.classList.remove('light-theme');
  } else {
    root.classList.add('light-theme');
    root.classList.remove('dark-theme');
  }
}

三、CSS预处理器

CSS预处理器(如Sass、Less等)提供了更多灵活性,可以通过变量、混合(mixin)等特性实现主题切换。例如,使用Sass定义主题样式:

  $light-primary-color: #42b983;
$light-secondary-color: #35495e;

$dark-primary-color: #1c2022;
$dark-secondary-color: #ffffff;

@mixin theme($primary-color, $secondary-color) {
  .button {
    background-color: $primary-color;
    color: $secondary-color;
  }
}

.light-theme {
  @include theme($light-primary-color, $light-secondary-color);
}

.dark-theme {
  @include theme($dark-primary-color, $dark-secondary-color);
}

与CSS类名切换方法相似,在JavaScript中切换元素的类名即可实现主题切换。

四、应用示例

1. 本地存储

在实际应用中,用户可能希望浏览器记住他们的主题选择。这时,我们可以将用户的主题选择保存在 localStorage中。在页面加载时,检查 localStorage中是否有用户的主题选择,如果有,则应用相应的主题。以下是一个简单的示例:

  function saveThemeToLocalStorage(theme) {
  localStorage.setItem('theme', theme);
}

function getThemeFromLocalStorage() {
  return localStorage.getItem('theme');
}

function applyTheme(theme) {
  const root = document.documentElement;

  if (theme === 'dark') {
    root.classList.add('dark-theme');
    root.classList.remove('light-theme');
  } else {
    root.classList.add('light-theme');
    root.classList.remove('dark-theme');
  }
}

// 页面加载时,应用主题
document.addEventListener('DOMContentLoaded', () => {
  const savedTheme = getThemeFromLocalStorage();
  if (savedTheme) {
    applyTheme(savedTheme);
  } else {
    // 如果没有保存的主题,可以应用默认主题
    applyTheme('light');
  }
});

// 主题切换按钮
document.getElementById('switch-theme').addEventListener('click', () => {
  const currentTheme = getThemeFromLocalStorage();

  if (currentTheme === 'dark') {
    applyTheme('light');
    saveThemeToLocalStorage('light');
  } else {
    applyTheme('dark');
    saveThemeToLocalStorage('dark');
  }
});

2. 自定义主题

除了提供预定义的主题外,还可以允许用户自定义主题。例如,通过输入框获取用户自定义颜色,并实时应用主题。以下是一个简单的示例:

  <label for="primary-color">Primary color:</label>
<input type="color" id="primary-color" value="#42b983">

<label for="secondary-color">Secondary color:</label>
<input type="color" id="secondary-color" value="#35495e">

<button id="apply-custom-theme">Apply custom theme</button>
  function applyCustomTheme(primaryColor, secondaryColor) {
  document.documentElement.style.setProperty('--primary-color', primaryColor);
  document.documentElement.style.setProperty('--secondary-color', secondaryColor);
}

document.getElementById('apply-custom-theme').addEventListener('click', () => {
  const primaryColor = document.getElementById('primary-color').value;
  const secondaryColor = document.getElementById('secondary-color').value;

  applyCustomTheme(primaryColor, secondaryColor);
});

五、总结

本文介绍了三种前端主题切换方案:CSS变量、CSS类名切换和CSS预处理器。同时,也探讨了如何在实际应用中实现主题切换的功能,例如本地存储用户的主题选择和允许用户自定义主题。

在实践中,可以根据项目的具体需求选择合适的主题切换方案。例如,如果项目中已经使用了CSS预处理器,那么可以考虑使用相应的预处理器特性来实现主题切换。如果项目对浏览器兼容性要求较高,可以选择CSS类名切换方案。而如果希望实现更简洁的代码和更好的性能,CSS变量是一个不错的选择。

相关 [前端 切换] 推荐:

前端主题切换方案

- - 掘金 前端
前端开发中,主题切换逐渐成为一种常见需求. 用户可能希望根据自己的喜好、习惯或者场景需求进行主题切换,例如切换日间与夜间模式. 本文主要介绍如何在前端实现主题切换,以及一些应用实例. CSS变量是一种实现主题切换的便捷方法. 通过在CSS中定义变量,可以方便地修改主题颜色,例如:. 在JavaScript中,可以通过修改CSS变量的值实现主题切换:.

javascript图片切换

- Haipeng - 博客园-首页原创精华区
闲来无事,练习js,参照网上的一些源码写了一个图片切换程序,刚来博客园,不懂怎么发布js程序,懂的朋友可以留言告之. 1.图片切换效果有以下几种:随机切换   4格纵向百叶窗  16格横向百叶窗  由里至外逐渐放大   中间向左右两边逐渐放大   中间向上下两边逐渐放大   由上至下落幕   由左至右   由左上至右下   由右下至左上              8格纵向百叶窗    8格纵向百叶窗2   8格万花筒  24格万花筒  4格滑行左上至右下  4格滑行左上至右下  4格滑行落幕   4格滑行延伸.

Kubernetes 切换到 Containerd

- - bleem
由于 Kubernetes 新版本 Service 实现切换到 IPVS,所以需要确保内核加载了 IPVS modules;以下命令将设置系统启动自动加载 IPVS 相关模块,执行完成后需要重启. 重启完成后务必检查相关 module 加载以及内核参数设置:. 1.2、安装 Containerd. Containerd 在 Ubuntu 20 中已经在默认官方仓库中包含,所以只需要 apt 安装即可:.

从 screen 切换到 tmux

- iworm - LinuxTOY
在我的 Linux 生活中,我曾做过几次重要的切换. 我先是从 Archlinux 切换到 Gentoo,后来又从 bash 切换到了 zsh. 现在,我又从 screen 切换到 tmux. 对于各个终端控来说,screen 是几乎每天都会使用的好工具,抛开确实不易. 但有了更加好用的 tmux,我为什么不切换.

前端技术

- - CSDN博客综合推荐文章
随着互联网产业的爆炸式增长,与之伴生的Web前端技术也在历经洗礼和蜕变. 尤其是近几年随着移动终端的发展,越来越多的人开始投身或转行至新领域,这更为当今的IT产业注入了新的活力. 尽管Web前端技术诞生至今时日并不长,但随着Web技术的逐渐深入,今后将会在以下几方面发力. JavaScript的兄弟们.

Public DNS Tool-DNS切换工具

- - 无名小卒
Public DNS Tool v9.1下载: dbank| kuaipan| 官方. 无名小卒(Digital Fingerprint: b98c67913fef00419d415179421ab42f) Related Posts. Webluker-免费CDN、DNS解析和网站监控服务.

redis+Keepalived主从热备秒级切换

- - 开源软件 - ITeye博客
安装使用centos 5.10 . 编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel. 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;. 当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;.

spring数据源动态切换

- - 企业架构 - ITeye博客
     原文->http://exceptioneye.iteye.com/blog/1698064.       在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource上.

Web前端优化

- - JavaScript - Web前端 - ITeye博客
优点:直接使用浏览器内存的缓存数据,减少网站后台压力,用户体验(速度)好. 缺点:对于时时变化的动态页面,这种情况就不能容忍了,因为每次访问的都是第一次访问的内容,这样即使所请求的页面已经变化了,用户也不可能知道,所以此场景必须要消除这种缓存的影响. 延迟加载,将资源延迟到需要的时候的加载,例如detail页面,相关产品推荐,当用户浏览更多的信息往下拉动滚动时,才进行加载,异步加载可以大幅减少对后端资源的使用,在需要的时候加载,是资源合理使用常用的方式,但是也带来一个问题,当往下拉才去加载,如果性能不够好,用户的体验其实是不好的,“菊花”转动的时间会比较长,同时异步加载对前端性能的作用也是非常明显的,渲染的节点数量大幅减少.

Web 前端测试

- - Web前端 - ITeye博客
Web 网站测试流程和方法(转载). 进行正式测试之前,应先确定如何开展测试,不可盲目的测试. 一般网站的测试,应按以下流程来进行:. 1)使用HTML Link Validator将网站中的错误链接找出来;. 2)测试的顺序为:自顶向下、从左到右;. 3)查看页面title是否正确. (不只首页,所有页面都要查看);.