sass 封装媒体查询工具

news/2024/12/29 2:22:58/

背景

以往写媒体查询可能是这样的:

.header {display: flex;width: 100%;
}@media (width >= 320px) and (width <= 480px) {.header {height: 50px;}
}@media (width > 480px) and (width <= 768px) {.header {height: 60px;}
}@media (width > 768px) and (width <= 1024px) {.header {height: 70px;}
}@media (width > 1024px) and (width <= 1200) {.header {height: 80px;}
}@media (width > 1200) {.header {height: 100px;}
}

以上写法可以看到写起来非常不方便,可读性也很差。因此希望用 sass 优化一下写法。

目标

希望可以这样写媒体查询:

.header {display: flex;width: 100%;手机: {height: 50px;}平板: {height: 60px;}...
}

sass 混合功能

sass/scss 快速入门

/* 定义混合函数 */
@mixin flexCenter($jus_c: center, $ali_i: center) {display: flex;justify-content: $jus_c;align-items: $ali_i;
}/* 使用混合函数 */
.header {width: 100%;@include flexCenter(space-between, flex-end);
}

sass if判断和插槽

混合函数中使用 @if判断区分不同设备,@content类似于 vue 插槽接收使用者在方法体中插入的内容。

@mixin respond-to($breakpoint) {@if $breakpoint == mobile {@media screen and (width <= 767px) {@content;}} @else if $breakpoint == tablet {@media screen and (width >= 768px) and (width <= 1023px) {@content;}} @else if $breakpoint == desktop {@media screen and (width >= 1024px) {@content;}} @else if $breakpoint == wide {@media screen and (width >= 1200px) {@content;}}
}

使用:

.header {width: 100%;height: 100vh;@include respond-to(mobile) {height: 100px;}@include respond-to(tablet) {height: 200px;}...background-color: rgb(139 133 133);
}

上面代码已经基本达到书写媒体查询的目标。但是 if else 太多了,不好看。还可以用策略模式优化一下。

进阶:sass 定义对象优化代码结构

用 hash 映射优化 if,也就是定义一个对象。sass 中可以定义对象。
注意:sass 中()括号就代表 js 的花括号{}和方括号[]

以下就是一个对象,这 5 个属性设置 5 个断点,除最后一个大屏外,其他断点属性值为数组。
之前的代码设置了 4 个断点,区别不大。

/* 定义断点对象 */
$breakpoints: (phone: (320px,480px),pad: (481px,768px),notebook: (769px,1024px),desktop: (1025px,1280px),tv: 1281px
);

sass 读取对象中的值:

  • map-get(obj, prop):获取对象的属性值

sass 判断数据类型:

  • type-of($var)
    • 数组类型:list
    • 数值类型:number
@mixin respond-to($breakname) {/* 1. 读取断点对象属性值 */$bp: map-get($breakpoints, $breakname);/* 2. 类型判断是否为数组 */@if type-of($bp) == "list" {/* 3. 取出数组中的数据 */$min: nth($bp, 1);$max: nth($bp, 2);@media screen and (min-width: $min) and (max-width: $max) {@content;}/* 4. tv 大屏 */} @else if type-of($bp) == "number" {@media screen and (min-width: $bp) {@content;}} @else {@warn "`$breakname` is not a valid breakpoint name.";}
}

vite 配置全局使用

直接在组件中 @include 使用混合函数,可能会报错:

  • [vite] Internal server error: [sass] Undefined mixin.

image.png

这是因为 minix 需要预编译,在 vite 中配置:
Vite

export default defineConfig({css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: `@use "@/styles/minix.scss" as *;`}}}
});

组件中使用:

.header {width: 100%;height: 100vh;@include respond-to(phone) {height: 100px;}@include respond-to(tv) {height: 200px;}background-color: rgb(139 133 133);
}

完整代码

$breakpoints: (phone: (320px,480px),pad: (481px,768px),notebook: (769px,1024px),desktop: (1025px,1280px),tv: 1281px
);@mixin respond-to($breakname) {/* 1. 读取断点对象属性值 */$bp: map-get($breakpoints, $breakname);/* 2. 类型判断是否为数组 */@if type-of($bp) == "list" {/* 3. 取出数组中的数据 */$min: nth($bp, 1);$max: nth($bp, 2);@media screen and (min-width: $min) and (max-width: $max) {@content;}/* 4. tv 大屏 */} @else if type-of($bp) == "number" {@media screen and (min-width: $bp) {@content;}} @else {@warn "`$breakname` is not a valid breakpoint name.";}
}

http://www.ppmy.cn/news/1213645.html

相关文章

第一百七十回 Material3中的IconButton

文章目录 1. 概念介绍2. 使用方法2.1 filled风格2.2 filledTonal风格2.3 outlined风格 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改NavigationBar组件的形状"相关的内容&#xff0c;本章回中将 介绍IconButtion组件.闲话休…

​软考-高级-系统架构设计师教程(清华第2版)【第3章 信息系统基础知识(p120~159)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第3章 信息系统基础知识(p120~159)-思维导图】 课本里章节里所有蓝色字体的思维导图

Day28力扣打卡

打卡记录 给小朋友们分糖果 II&#xff08;容斥原理&#xff09; 链接 大佬的题解 def c2(n: int) -> int:return n * (n - 1) // 2 if n > 1 else 0class Solution:def distributeCandies(self, n: int, limit: int) -> int:return c2(n 2) - 3 * c2(n - limit …

代码随想录第五十一天 | 动态规划 买卖股票:含冷冻期 的多状态 买卖股票问题(309);包含手续费 的买卖股票问题(贪心,动态规划)(714)

1、含冷冻期 的多状态 买卖股票问题 1.1 leetcode 309&#xff1a;最佳买卖股票时机含冷冻期 第一遍代码 运用之前二维dp数组的方法&#xff0c;第二个维度大小为2&#xff0c;对应持有&#xff0c;不持有 dp[1][0] max(dp[0][0], -prices[1]);注意要考虑只有一天的情况 dp[…

STL简介+浅浅了解string——“C++”

各位CSDN的uu们好呀&#xff0c;终于到小雅兰的STL的学习了&#xff0c;下面&#xff0c;让我们进入CSTL的世界吧&#xff01;&#xff01;&#xff01; 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的缺陷 7.为什么要学习string类 …

javaEE进阶

Cookie 是可以伪造的,比如说学生证是可以伪造的 Session 是不可以伪造的,这是学校系统记录在册的 如何获取 Cookie 我们先用 Servlet 原生的获取 cookie 的方式 我们在浏览器进行访问 但是实际上目前是没有 cookie 的,我们按 F12 进行添加 然后再重新访问,就能在 idea 看到 …

深度探究深度学习常见数据类型INT8 FP32 FP16的区别即优缺点

定点和浮点都是数值的表示&#xff08;representation&#xff09;&#xff0c;它们区别在于&#xff0c;将整数&#xff08;integer&#xff09;部分和小数&#xff08;fractional&#xff09;部分分开的点&#xff0c;点在哪里。定点保留特定位数整数和小数&#xff0c;而浮点…

Linux socket编程(1):套接字、字节序和地址结构体

套接字(socket)是一种使用标准Unix文件描述符与其他程序进行通信的方式&#xff0c;它在实际的应用中都十分常用。所以从这一篇文章开始&#xff0c;我将详细介绍一下Linux环境下的socket的用法。本篇文章将介绍套接字、字节序和地址结构体的相关知识。 文章目录 1 什么是套接字…