sass 封装媒体查询工具

背景

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

.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.mzph.cn/news/140176.shtml

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

相关文章

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

Spark Job优化

1 Map端优化 1.1 Map端聚合 map-side预聚合&#xff0c;就是在每个节点本地对相同的key进行一次聚合操作&#xff0c;类似于MapReduce中的本地combiner。map-side预聚合之后&#xff0c;每个节点本地就只会有一条相同的key&#xff0c;因为多条相同的key都被聚合起来了。其他节…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

Mathtype公式自动转Word自带公式

Mathtype公式自动转Word自带公式 前言/word技巧探索过程参考资料&#xff08;有效与无效&#xff09;全自动方案/代码/教程 前言/word技巧 word公式 用ALT号可以输入简单latex显示公式&#xff1b;复杂度&#xff0c;需要引入latex包的不行&#xff1b;显示不出来的话按一下en…

CentOS指令学习

目录 一、常用命令 1、ls 2、cd_pwd 3、touch_mkdir_rmdir_rm 4、cp_mv 5、whereis_which_PATH 6、find 7、grep 8、man_help 9、关机与重启 二、压缩解压 1、zip_unzip 2、gzip_gunzip 3、tar 三、其他指令 1、查看用户登录信息 2、磁盘使用情况 3、查看文件…

74HC165 并入串出

/******************************************************** 程序名&#xff1a;main.C 版 本&#xff1a;Ver1.0 芯 片&#xff1a;AT89C51或STC89C51 晶 体&#xff1a;片外12MHz 编 程: Joey 日 期&#xff1a;2023-11-13 描 述&#xff1a;通过 74HC165 对 16 按键…

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

Codeforces Round 788 (Div. 2) E. Hemose on the Tree(树上构造)

题目 t(t<5e4)组样例&#xff0c;每次给定一个数p&#xff0c; 表示一棵节点数为的树&#xff0c; 以下n-1条边&#xff0c;读入树边 对于n个点和n-1条边&#xff0c;每个点需要赋权&#xff0c;每条边需要赋权&#xff0c; 权值需要恰好构成[1,2n-1]的排列 并且当你赋…

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…

【数据结构初阶】顺序表SeqList

描述 顺序表我们可以把它想象成在一个表格里面填数据&#xff0c;并对数据做调整&#xff1b; 那我们的第一个问题是&#xff1a;怎么样在创建出足够的空间呢&#xff1f; 我们可以去堆上申请&#xff0c;用一个指针指向一块空间&#xff0c;如果申请的空间不够&#xff0c;我…

Linux 部署Sentinel控制台

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 1.版本选择 SpringCloudAlibaba SpringClo…

已解决:java.net.BindException: 地址已在使用

解决zookeeper报错&#xff1a;java.net.BindException: 地址已在使用&#xff0c;是因为端口被占用。显示Starting zookeeper ... STARTED&#xff0c;jps没有QuorumPeerMain进程。 问题截图&#xff1a; 看似Starting zookeeper ... STARTED&#xff0c;实则集群并没有启动…

2023.11.9 IDEA 配置 Lombok

目录 什么是 Lombok 如何使用 Lombok Lombok 的 Data 注解 什么是 Lombok Lombok 是一个 Java 库&#xff0c;能自动插入编译器并构建工具&#xff0c;简化 Java 开发它通过注解实现这一目的&#xff0c;可用来帮助开发人员消除 Java 的冗长代码&#xff0c;尤其是对于简单…

终端安全/SOC安全/汽车信息安全大课来袭-共计204节课

在近两年的时间里&#xff0c;我投入了大量的心血和精力&#xff0c;不仅创作了数千篇精美的图片&#xff0c;还编写了超过1000篇文章&#xff0c;以及数百篇内容丰富的PPT。经过这番努力我终于成功地构建出两套系统化的学习课程&#xff0c;它们分别是“Trustzone/TEE/安全从入…

什么是 CASB,在网络安全中的作用

数字化转型正在稳步攀升&#xff0c;组织现在越来越关注在线生产力系统和协作平台&#xff0c;各行各业的企业都采用了不同的云基础设施服务模式。云基础架构提供按需服务&#xff0c;可提高易用性、访问控制、内容协作和减少内部存储资源&#xff0c;以及许多其他好处。迁移到…

go学习之接口知识

文章目录 接口1.接口案例代码展示2.基本介绍3.基本语法4.应用场景介绍5.注意事项和细节6.接口编程经典案例7.接口与继承之间的比较8.面向对象编程--多态1&#xff09;基本介绍2&#xff09;快速入门3&#xff09;接口体现多态的两种形式 9.类型断言1&#xff09;先看一个需求2&…

登顶request模块

华子目录 Requests介绍安装requests模块常用方法常用属性实例引入各种请求方式基于get请求带参数的get请求推荐写法 基于post请求添加headers信息content获取二进制数据bytes类型获取json数据第一种方式第二种方式 response响应状态码判断 高级操作会话维持通过cookie维持会话通…

【Vue3】scoped 和样式穿透

我们使用很多 vue 的组件库&#xff08;element-plus、vant&#xff09;&#xff0c;在修改样式的时候需要进行其他操作才能成功更改样式&#xff0c;此时就用到了样式穿透。 而不能正常更改样式的原因就是 scoped 标记。 scoped 的渲染规则&#xff1a; <template>&l…

U-Mail邮件中继,让海外邮件沟通更顺畅

在海外&#xff0c;电子邮件是人们主要的通信工具&#xff0c;尤其是商务往来沟通&#xff0c;企业邮箱是标配。这主要是因为西方国家互联网发展较早&#xff0c;在互联网早期&#xff0c;电子邮件技术较为成熟&#xff0c;大家都用电子邮件交流&#xff0c;于是这成了一种潮流…