• 结合scss实现黑白主题切换


    是看了袁老师的视频后,自己做了一下练习。原视频地址:

    b站地址icon-default.png?t=N7T8https://www.bilibili.com/video/BV15z4y1N7jB/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=c6cf63302f28d94ebc02cbedcecc57ea首先创建一个全局的scss文件。我这里放在了assets文件夹中,创建了一个theme的文件夹,里面放置了一个theme.scss

    1. // 主题
    2. $themes: (
    3. // 白亮
    4. light: (
    5. background: #fff,
    6. color: #000,
    7. textColor: #000
    8. ),
    9. // 暗黑
    10. dark: (
    11. background: #121212,
    12. color: #fff,
    13. textColor: #fff
    14. )
    15. );
    16. // 当前主题
    17. $curTheme: light;
    18. // 混合
    19. // @mixin useTheme() {
    20. // html[data-theme='light'] & {
    21. // background-color: #fff;
    22. // color: #000;
    23. // }
    24. // html[data-theme='dark'] & {
    25. // background-color: #121212;
    26. // color: #fff;
    27. // }
    28. // }
    29. // 混合优化(遍历上面的主题)
    30. @mixin useTheme() {
    31. @each $key, $value in $themes {
    32. $curTheme: $key !global; // 当前的主题
    33. html[data-theme = #{$key}] & { // & 表示传入什么选择器就是什么选择器
    34. @content; // 类似于插槽,样式可以进行传入
    35. }
    36. }
    37. }
    38. // 生成对应主题的变量
    39. @function getVar($key) {
    40. $themeMap: map-get($themes, $curTheme);
    41. @return map-get($themeMap, $key);
    42. }

    然后通过vite进行这个scss文件的全局配置,这样就不用多次引入了。修改vite.config.ts文件。修改之后记得重新npm run dev,重新启动一下

    1. import { fileURLToPath, URL } from 'node:url'
    2. import { defineConfig } from 'vite'
    3. import vue from '@vitejs/plugin-vue'
    4. // https://vitejs.dev/config/
    5. export default defineConfig({
    6. plugins: [vue()],
    7. resolve: {
    8. alias: {
    9. '@': fileURLToPath(new URL('./src', import.meta.url))
    10. }
    11. },
    12. // 上面的是默认的
    13. css: { // 引入全局的scss文件
    14. // css预处理器
    15. preprocessorOptions: {
    16. scss: {
    17. // 引入 theme.scss 这样就可以在全局中使用 theme.scss中预定义的变量和方法了
    18. // 给导入的路径最后加上 ;
    19. additionalData: '@import "./src/assets/theme/theme.scss";'
    20. }
    21. }
    22. }
    23. })

    然后就可以进行测试了

    1. <script setup lang="ts">
    2. import { ref } from 'vue'
    3. // 这里从本地取是为了保持刷新以后也能一致
    4. const flag = ref(localStorage.getItem('theme') === 'dark' ? true : false)
    5. const change = (flag: boolean) => {
    6. localStorage.setItem('theme', flag ? 'dark' : 'light') // 存本地,刷新的时候会用
    7. // 控制html标签,给自定义属性data-theme添加对应的值,这样对应的样式就会生效
    8. document.querySelector('html')?.setAttribute('data-theme', flag ? 'dark' : 'light')
    9. }
    10. script>
    11. <style lang="scss">
    12. // 由于vite已经配置过了,所以不需要引入了。如果引入失败,那就老老实实在使用的文件中都引入
    13. // @import '../assets/theme/theme.scss';
    14. // 使用测试
    15. .test {
    16. // 共有样式部分
    17. width: 100px;
    18. height: 100px;
    19. // 黑白主题特有部分样式
    20. @include useTheme() {
    21. background-color: getVar('background');
    22. color: getVar('color');
    23. }
    24. }
    25. style>

    白亮的

    暗黑的

    但是会有一个问题,就是刷新的时候,发现html标签的data-theme自定义属性丢失了。所以就需要在App.vue文件中,重新再给html标签设置一下data-theme自定义属性,值就是我们存本地的值

    1. <template>
    2. <RouterView />
    3. template>
    4. <style lang="scss">
    5. * {
    6. padding: 0;
    7. margin: 0;
    8. box-sizing: border-box;
    9. }
    10. html,body,#app {
    11. width: 100%;
    12. height: 100%;
    13. }
    14. style>

    这样刷新的话也不会受到影响了

  • 相关阅读:
    Unity 2D项目中关于Sprite的一些性能方面的问题
    RT-Thread系列09——ETH网口设备
    DownloadingImages 下载缓存图片,显示图片文字列表
    机器学习常识(二):7 个最常见的机器学习损失函数
    融360|简普科技Q2量增质升,三大战略支撑韧性
    【简单讲解Perl语言】
    信息系统项目管理师必背核心考点(七十四)软件生存周期模型
    博客主题美化第二弹
    从零开始学Spring Boot系列-集成Kafka
    Vue中的.sync修饰符
  • 原文地址:https://blog.csdn.net/qq_52845451/article/details/134440561