Sass实现网页背景主题切换

news2024/11/13 18:19:24

Sass 实现网页背景主题切换

  • 前言
  • 准备工作
  • 一、 简单的两种主题黑白切换
    • 1.定义主题
    • 2. 添加主题切换功能
    • 3. 修改 data-theme 属性
  • 二、多种主题切换
    • 1. 定义主题
    • 2. 动态生成 CSS 变量
      • 1.遍历列表
      • 2.遍历映射
      • 3.高级用法
    • 3. 设置默认主题
    • 4. 切换功能HTML
  • 三、多种主题多种样式切换
    • 1. 定义主题
    • 2. 动态生成 CSS 变量
    • 3. 设置默认主题
    • 4. HTML代码
  • ending

前言

网页实现主题切换一般有两种主流的解决办法,一种是css变量,另外一种是使用预编译器(less、sass),这里考虑到兼容性使用的是sass来实现的
原理:修改网页中html标签内的自定义属性data-theme的样式。

准备工作

  1. 如果是工程项目则需使用下面代码进行安装
 npm install sass --save-dev
 npm install sass-loader --save-dev
  1. 如果是html,则需要下载这个插件
    在这里插入图片描述
    使用方法也很简单在scss文件中点击这个就自动编译为css文件
    在这里插入图片描述
    这里的demo采用的是第二种

一、 简单的两种主题黑白切换

先看效果
请添加图片描述

1.定义主题

创建一个 index.scss 文件,用于定义不同的主题。
使用 Sass 的 map 和 mixin 功能来管理主题变量。

// index.scss
$themes: (
  light: (
    background-color: #ffffff,
    color: #000000),
  dark: (
    background-color: #000000,
    color: #ffffff)
);

@mixin theme($name) {
  $theme: map-get($themes, $name);

  :root {
    background-color: map-get($theme, background-color);
    color: map-get($theme, color);
  }
}

// 默认主题
@include theme(light);

map-get 方法语法:

map.get(map,key): $map: 要操作的map变量, $key: 要获取值的键。如果map中不存在该键,则该方法会返回null。

2. 添加主题切换功能

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sass实现主题切换</title>
    <link rel="stylesheet" href="index.css"> 
</head>

<body>
    <button id="theme-toggle">切换主题</button>
    <script>
        const button = document.getElementById('theme-toggle');
        let currentTheme = 'light';

        button.addEventListener('click', () => {
            currentTheme = currentTheme === 'light' ? 'dark' : 'light';
            document.documentElement.setAttribute('data-theme', currentTheme);
        });
    </script>
</body>

</html>

3. 修改 data-theme 属性

// index.scss
:root[data-theme='light'] {
  background-color: #ffffff;
  color: #000000;
}

:root[data-theme='dark'] {
  background-color: #000000;
  color: #ffffff;
}

二、多种主题切换

假如主题不止一套…
先看效果
请添加图片描述
具体实现跟方法一差不多,只是多用了@each这个方法

1. 定义主题

每个主题都有相应的背景色和文字色。

// index.scss
$themes: (
  light: (
    background-color: #ffffff,
    color: #000000,
  ),
  dark: (
    background-color: #000000,
    color: #ffffff,
  ),
  ocean: (
    background-color: #00aaff,
    color: #ffffff,
  ),
  forest: (
    background-color: #228b22,
    color: #ffffff,
  ),
);

2. 动态生成 CSS 变量

使用 @each 循环遍历 Sass map,为每个主题生成 CSS 变量。这里使用 的是映射

// index.scss
@mixin theme($name) {
  $theme: map-get($themes, $name);

  :root[data-theme='#{$name}'] {
    background-color: map-get($theme, background-color);
    color: map-get($theme, color);
  }
} 

@each $name, $properties in $themes {
  @include theme($name);
}

关于@each 的使用方法

1.遍历列表

需要遍历一个列表(数组)时,可以使用 @each。每次迭代都会将当前项分配给一个指定的变量。

$colors: red, blue, green;

@each $color in $colors {
  .text-#{$color} {
    color: $color;
  }
}

2.遍历映射

需要遍历一个映射(键值对)时,@each 可以用来遍历每个键值对。每次迭代都会将键和值分别分配给指定的变量。

$themes: (
  light: #ffffff,
  dark: #000000,
  ocean: #00aaff,
  forest: #228b22
);

@each $name, $color in $themes {
  .theme-#{$name} {
    background-color: $color;
  }
}

3.高级用法

也可以使用 @each 来处理复杂的嵌套数据结构

$themes: (
  light: (
    background-color: #ffffff,
    text-color: #000000
  ),
  dark: (
    background-color: #000000,
    text-color: #ffffff
  )
);

@each $name, $properties in $themes {
  :root[data-theme="#{$name}"] {
    @each $property, $value in $properties {
      --#{$property}: #{$value};
    }
  }
}

3. 设置默认主题

// index.scss
@include theme(light);

4. 切换功能HTML

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sass实现主题切换</title>
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <button onclick="changeThemes('light')">切换白色</button>
    <button onclick="changeThemes('dark')">切换黑色</button>
    <button onclick="changeThemes('ocean')">切换蓝色</button>
    <button onclick="changeThemes('forest')">切换绿色</button>
    <script>
        function changeThemes(theme) {
            document.documentElement.setAttribute('data-theme', theme);
        }
        //页面初始化的时候加载,当然也可以使用其他方法
        changeThemes('light')
    </script>
</body>
</html>

三、多种主题多种样式切换

现在主题里面的变量不仅仅只有background-color,color 这两种,还可能会有其他变量,但是不可能又在root里面去加新增的代码,这样造成了冗余,维护起来也麻烦,于是有了新的思路代码…
先看效果
请添加图片描述

1. 定义主题

在这里每个主题里面自定义的css样式都是不一样的,这里只是举例

// index.scss
$themes: (
  light: (
    background-color: #ffffff,
    color: #000000,
    font-size:18px,
    font-weight: bold,
  ),
  dark: (
    background-color: #000000,
    color: #ffffff,
    font-size:22px,
    border: 1px solid #9d11b9,
  ),
  ocean: (
    background-color: #00aaff,
    color: red,
    font-size:26px,
    font-weight: bold,
    border: 1px solid #318b97,
  ),
  forest: (
    background-color: #228b22,
    color: yellow,
    font-size:30px,
    border: 1px solid #c2557b,
  ),
);

2. 动态生成 CSS 变量

这里使用的是@each的高级用法来处理复杂的嵌套数据结构

@each $name, $properties in $themes {
  :root[data-theme="#{$name}"] {
    @each $property, $value in $properties {
      #{$property}: #{$value};
    }
  }
}

3. 设置默认主题

@mixin theme($name) {
  :root[data-theme="#{$name}"] {
    @each $property, $value in map-get($themes, $name) {
      #{$property}: #{$value};
    }
  }
}

// // 例如,应用默认主题白色
@include theme(light);

4. HTML代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sass实现主题切换</title>
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <button onclick="changeThemes('light')">切换白色</button>
    <button onclick="changeThemes('dark')"> 切换黑色 </button>
    <button onclick="changeThemes('ocean')">切换蓝色</button>
    <button onclick="changeThemes('forest')">切换绿色</button>
    <div>我是主题切换字体</div>
    <script>
        function changeThemes (theme) {
            document.documentElement.setAttribute('data-theme', theme);
        }

        //页面初始化的时候加载,当然也可以使用其他方法
        changeThemes('light')
    </script>
</body>

</html>

ending

Sass中文网地址Sass中文网
Less中文网地址Less中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Fedora 上安装 LAMP(Linux、Apache、MySQL、PHP)的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 LAMP LAMP 栈是一组用于启动和运行 Web 服务器的开源软件。该缩写代表 Linux、Apache、MySQL 和 PHP。由于服务器已经在运行 Fedo…

高性能web服务器1

基础 Web 服务简介 Web 服务是互联网的核心组成部分之一&#xff0c;它允许用户通过浏览器访问信息和应用程序。一个基础的 Web 服务通常由 Web 服务器软件、静态网页内容、以及可选的动态内容生成程序组成。 Web 服务器软件 Web 服务器软件是运行在服务器上的程序&#xff…

【Java 数据结构】PriorityQueue介绍

优先级队列 回顾二叉树堆堆是什么堆的实现初始化堆的创建向下调整建堆复杂度插入向上调整建堆复杂度删除 PriorityQueue类介绍PriorityQueue是什么PriorityQueue使用构造方法常用方法 PriorityQueue源码介绍Top-K问题 回顾二叉树 上一次我们简单的了解了二叉树这个数据结构, 但…

每天五分钟深度学习框架pytorch:神经网络工具箱nn的介绍

本文重点 我们前面一章学习了自动求导,这很有用,但是在实际使用中我们基本不会使用,因为这个技术过于底层,我们接下来将学习pytorch中的nn模块,它是构建于autograd之上的神经网络模块,也就是说我们使用pytorch封装好的神经网络层,它自动会具有求导的功能,也就是说这部…

夏晖WMS是什么?夏晖WMS怎么与金蝶云星空进行集成?

在数字化浪潮席卷全球的今天&#xff0c;企业对于业务流程的高效管理和数据集成的需求愈发迫切。夏晖WMS作为一款领先的仓库管理系统&#xff0c;与金蝶云星空ERP的集成成为了众多企业提升管理效率的关键环节。 夏晖WMS是什么? 夏晖WMS是一款由夏晖物流&#xff08;上海&…

Golang | Leetcode Golang题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; type Twitter struct {Tweets []intUserTweets map[int][]intFollows map[int][]intIsFollowMy map[int]bool }/** Initialize your data structure here. */ func Constructor() Twitter {// 每一次实例化的时候&#xff0c;都重新分配一次…

C语言 | Leetcode C语言题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; int cmp(int** a, int** b) {return (*a)[0] (*b)[0] ? (*b)[1] - (*a)[1] : (*a)[0] - (*b)[0]; }int maxEnvelopes(int** envelopes, int envelopesSize, int* envelopesColSize) {if (envelopesSize 0) {return 0;}qsort(envelopes, …

宜佰丰超市进销存管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JavaMysql 工具&#xff1a; IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能模块…

接口测试及常用接口测试工具(postman/jmeter)详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#x…

【Alibaba Cola 状态机】重点解析以及实践案例

【Alibaba Cola 状态机】重点解析以及实践案例 1. 状态模式 状态模式是一种行为型设计模式&#xff0c;允许对象在内部状态改变时改变其行为&#xff0c;简单地讲就是&#xff0c;一个拥有状态的context对象&#xff0c;在不同状态下&#xff0c;其行为会发生改变。看起来是改…

Spring项目:文字花园(四)

一.实现登录 传统思路: • 登陆⻚⾯把⽤⼾名密码提交给服务器. • 服务器端验证⽤⼾名密码是否正确, 并返回校验结果给后端 • 如果密码正确, 则在服务器端创建 Session . 通过 Cookie 把 sessionId 返回给浏览器. 问题: 集群环境下⽆法直接使⽤Session. 原因分析: 我们开…

渐变纹理的使用

1、渐变纹理的使用 通过单张纹理和凹凸纹理相&#xff0c;我们知道图片中存储的数据不仅仅可以是颜色数据&#xff0c;还可以是高度、法线数据。 理论上来说&#xff0c;图片中存储的数据我们可以自定义规则&#xff0c;我们可以往图片中存储任何满足 我们需求的数据用于渲染。…

原神4.8版本抽到角色和重点培养数据表

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本抽到角色和重点培养数据表</title…

vue-element-admin——<keep-alive>不符合预期缓存的原因

vue-element-admin——<keep-alive>不符合预期缓存的原因 本文章&#xff0c;以现在中后台开发用的非常多的开源项目vue-element-admin为案例。首先&#xff0c;列出官方文档与缓存<keep-alive>相关的链接&#xff08;请认真阅读&#xff0c;出现缓存<keep-ali…

MSR配置

公钥私钥 网页上提供的脚本安装客户端??去掉跳板机 history | grep azcopy 44 azcopy 47 azcopy cp --recursive --log-level NONE --overwrite true https://singularitywor9084471172.blob.core.windows.net/yifanyang/thinking.py\?sv\2023-01-03\&st\2024-…

机器学习:逻辑回归实现下采样和过采样

1、概述 逻辑回归本身是一种分类算法&#xff0c;它并不涉及下采样或过采样操作。然而&#xff0c;在处理不平衡数据集时&#xff0c;这些技术经常被用来改善模型的性能。下采样和过采样是两种常用的处理不平衡数据集的方法。 2、下采样 1、概念 下采样是通过减少数量较多的类…

【学习笔记】Day 19

一、进度概述 1、机器学习常识1-11&#xff0c;以及相关代码复现 二、详情 1、不确定性 所谓不确定性, 是指我们在进行预测的时候, 不能够保证 100% 的准确。而机器学习&#xff0c;比的就是谁 “猜的更准”。 不确定性&#xff0c;可能由信息不足、信息模糊等原因产…

编写开放接口与思考

编写开放接口与思考 一、情景描述&#xff1a; 当一个项目开发一定程度时&#xff0c;会有跟合作厂商对接共同开发的情况&#xff0c;那么如果合作厂商想要使用你项目中的某个接口&#xff0c;你该如何把接口暴露给他们&#xff1f; 二、实现方式分析 1、因为现在接口大部分…

超融合/分布式 IT 架构有哪些常见故障类型?如何针对性解决和预防?

本文刊于《中国金融电脑》2024 年第 7 期。 作者&#xff1a;SmartX 金融团队 以超融合为代表的分布式 IT 基础架构凭借其高性能、高可靠和灵活的扩展能力&#xff0c;在满足大规模、高并发、低延迟业务需求等方面展现出显著优势&#xff0c;成为众多金融机构构建 IT 基础设施…

Nginx: 体系化知识点梳理

概述 我们需要对 Nginx 要有体系化的一个认识对 Nginx 自身来说&#xff0c;它是作为一个中间件的&#xff0c;只要是中间件&#xff0c;它必然会涉及到前端和后端对于 Nginx 来说&#xff0c;它是需要协调整个前后端的一个组件那对于中间件来&#xff0c;我们要理解整个外部系…