当前位置: 首页 > news >正文

PostCss

什么是 PostCss

如果把 CSS 单独拎出来看,光是样式本身,就有很多事情要处理。

既然有这么多事情要处理,何不把这些事情集中到一起统一处理呢?

PostCss 就是基于这样的理念出现的。

PostCss 类似于一个编译器,可以将样式源码编译成最终的 CSS 代码

在这里插入图片描述

看上去是不是和 LESS、SASS 一样呢?

但 PostCss 和 LESS、SASS 的思路不同,它其实只做一些代码分析之类的事情,将分析的结果交给插件,具体的代码转换操作是插件去完成的。

在这里插入图片描述

官方的一张图更能说明 postcss 的处理流程:

在这里插入图片描述

这一点有点像 webpack,webpack 本身仅做依赖分析、抽象语法树分析,其他的操作是靠插件和加载器完成的。

官网地址:https://postcss.org/
github 地址:https://github.com/postcss/postcss

安装

PostCss 是基于 node 编写的,因此可以使用 npm 安装

npm i -D postcss

postcss 库提供了对应的 js api 用于转换代码,如果你想使用 postcss 的一些高级功能,或者想开发 postcss 插件,就要 api 使用postcss,api 的文档地址是:http://api.postcss.org/

不过绝大部分时候,我们都是使用者,并不希望使用代码的方式来使用 PostCss

因此,我们可以再安装一个 postcss-cli,通过命令行来完成编译

npm i -D postcss-cli

postcss-cli 提供一个命令,它调用 postcss 中的api来完成编译

命令的使用方式为:

postcss 源码文件 -o 输出文件

配置文件

和 webpack 类似,postcss 有自己的配置文件,该配置文件会影响 postcss 的某些编译行为。

配置文件的默认名称是:postcss.config.js

例如:

module.exports = {map: false, //关闭source-map
}

插件

光使用 postcss 是没有多少意义的,要让它真正的发挥作用,需要使用各种插件,postcss 的插件市场:https://www.postcss.parts/ 。

postcss-preset-env

过去使用 postcss 的时候,往往会使用大量的插件,它们各自解决一些问题,这样导致的结果是安装插件、配置插件都特别的繁琐。

于是出现了这么一个插件 postcss-preset-env,它称之为 postcss预设环境,大意就是它整合了很多的常用插件到一起,并帮你完成了基本的配置,你只需要安装它一个插件,就相当于安装了很多插件了。

安装好该插件后,在 postcss 配置中加入下面的配置:

module.exports = {plugins: {"postcss-preset-env": {} // {} 中可以填写插件的配置}
}

该插件的功能很多,下面一一介绍。

自动的厂商前缀

某些新的 css 样式需要在旧版本浏览器中使用厂商前缀方可实现

::placeholder {color: red;
}

该功能在不同的旧版本浏览器中需要书写为

::-webkit-input-placeholder {color: red;
}
::-moz-placeholder {color: red;
}
:-ms-input-placeholder {color: red;
}
::-ms-input-placeholder {color: red;
}
::placeholder {color: red;
}

要完成这件事情,需要使用 autoprefixer 库,而 postcss-preset-env 内部包含了该库,自动有了该功能。

如果需要调整兼容的浏览器范围,可以通过下面的方式进行配置

方式1:在 postcss-preset-env 的配置中加入 browsers

module.exports = {plugins: {"postcss-preset-env": {browsers: ["last 2 version","> 1%"]} }
}

方式2【推荐】:添加 .browserslistrc 文件

创建文件 .browserslistrc,填写配置内容

last 2 version
> 1%

方式3【推荐】:在 package.json 的配置中加入 browserslist

"browserslist": ["last 2 version","> 1%"
]

browserslist 是一个多行的(数组形式的)标准字符串。

它的书写规范多而繁琐,详情见:https://github.com/browserslist/browserslist

一般情况下,大部分网站都使用下面的格式进行书写

last 2 version
> 1% in CN
not ie <= 8
  • last 2 version: 浏览器的兼容最近期的两个版本
  • > 1% in CN: 匹配中国大于1%的人使用的浏览器, in CN可省略
  • not ie <= 8: 排除掉版本号小于等于8的IE浏览器

默认情况下,匹配的结果求的是并集

你可以通过网站:https://browserl.ist/ 对配置结果覆盖的浏览器进行查询,查询时,多行之间使用英文逗号分割

browserlist的数据来自于 CanIUse 网站,由于数据并非实时的,所以不会特别准确

未来的 CSS 语法

CSS 的某些前沿语法正在制定过程中,没有形成真正的标准,如果希望使用这部分语法,为了浏览器兼容性,需要进行编译

过去,完成该语法编译的是 cssnext 库,不过有了 postcss-preset-env 后,它自动包含了该功能。

你可以通过 postcss-preset-envstage 配置,告知 postcss-preset-env 需要对哪个阶段的css语法进行兼容处理,它的默认值为2

"postcss-preset-env": {stage: 0
}

一共有5个阶段可配置:

  • Stage 0:Aspirational —— 只是一个早期草案,极其不稳定
  • Stage 1:Experimental —— 仍然极其不稳定,但是提议已被 W3C 公认
  • Stage 2:Allowable —— 虽然还是不稳定,但已经可以使用了
  • Stage 3:Embraced —— 比较稳定,可能将来会发生一些小的变化,它即将成为最终的标准
  • Stage 4:Standardized —— 所有主流浏览器都应该支持的 W3C 标准

了解了以上知识后,接下来了解一下未来的 css 语法,尽管某些语法仍处于非常早期的阶段,但是有该插件存在,编译后仍然可以被浏览器识别

变量

未来的 css 语法是天然支持变量的

:root{} 中定义常用变量,使用 -- 前缀命名变量

:root{--lightColor: #ddd;--darkColor: #333;
}a{color: var(--lightColor);background: var(--darkColor);
}

编译后,仍然可以看到原语法,因为某些新语法的存在并不会影响浏览器的渲染,尽管浏览器可能不认识
如果不希望在结果中看到新语法,可以配置 postcss-preset-envpreservefalse

自定义选择器
@custom-selector :--heading h1, h2, h3, h4, h5, h6;
@custom-selector :--enter :focus,:hover;a:--enter{color: #f40;
}:--heading{font-weight:bold;
}:--heading.active{font-weight:bold;
}

编译后

a:focus,a:hover{color: #f40;
}h1,h2,h3,h4,h5,h6{font-weight:bold;
}h1.active,h2.active,h3.active,h4.active,h5.active,h6.active{font-weight:bold;
}
嵌套

与 LESS 相同,只不过嵌套的选择器前必须使用符号 &

.a {color: red;& .b {color: green;}& > .b {color: blue;}&:hover {color: #000;}
}

编译后

.a {color: red
}.a .b {color: green;
}.a>.b {color: blue;
}.a:hover {color: #000;
}

postcss-apply

该插件可以支持在 css 中书写属性集

类似于 LESS 中的混入,可以利用 CSS 的新语法定义一个 CSS 代码片段,然后在需要的时候应用它

:root {--center: {position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);};
}.item{@apply --center;
}

编译后

.item{position: absolute;left: 50%;top: 50%;-webkit-transform: translate(-50%, -50%);transform: translate(-50%, -50%);
}

实际上,该功能也属于 cssnext,不知为何 postcss-preset-env 没有支持

postcss-color-function

该插件支持在源码中使用一些颜色函数

body {/* 使用颜色#aabbcc,不做任何处理,等同于直接书写 #aabbcc */color: color(#aabbcc);/* 将颜色#aabbcc透明度设置为90% */color: color(#aabbcc a(90%));/* 将颜色#aabbcc的红色部分设置为90% */color: color(#aabbcc red(90%));/* 将颜色#aabbcc调亮50%(更加趋近于白色),类似于less中的lighten函数 */color: color(#aabbcc tint(50%));/* 将颜色#aabbcc调暗50%(更加趋近于黑色),类似于less中的darken函数 */color: color(#aabbcc shade(50%));
}

编译后

body {/* 使用颜色#aabbcc,不做任何处理,等同于直接书写 #aabbcc */color: rgb(170, 187, 204);/* 将颜色#aabbcc透明度设置为90% */color: rgba(170, 187, 204, 0.9);/* 将颜色#aabbcc的红色部分设置为90% */color: rgb(230, 187, 204);/* 将颜色#aabbcc调亮50%(更加趋近于白色),类似于less中的lighten函数 */color: rgb(213, 221, 230);/* 将颜色#aabbcc调暗50%(更加趋近于黑色),类似于less中的darken函数 */color: rgb(85, 94, 102);
}

[扩展]postcss-import

该插件可以让你在 postcss 文件中导入其他样式代码,通过该插件可以将它们合并

由于后续的课程中,会将 postcss 加入到 webpack 中,而 webpack 本身具有依赖分析的功能,所以该插件的实际意义不大

stylelint

官网:https://stylelint.io/

在实际的开发中,我们可能会错误的或不规范的书写一些 css 代码,stylelint 插件会即时的发现错误

由于不同的公司可能使用不同的 CSS 书写规范,stylelint 为了保持灵活,它本身并没有提供具体的规则验证

你需要安装或自行编写规则验证方案

通常,我们会安装 stylelint-config-standard 库来提供标准的 CSS 规则判定

安装好后,我们需要告诉 stylelint 使用该库来进行规则验证

告知的方式有多种,比较常见的是使用文件 .stylelintrc

//.styleintrc
{"extends": "stylelint-config-standard"
}

此时,如果你的代码出现不规范的地方,编译时将会报出错误

body {background: #f4;
}

在这里插入图片描述

发生了两处错误:

  1. 缩进应该只有两个空格
  2. 十六进制的颜色值不正确

如果某些规则并非你所期望的,可以在配置中进行设置

{"extends": "stylelint-config-standard","rules": {"indentation": null}
}

设置为 null 可以禁用该规则,或者设置为 4,表示一个缩进有 4 个空格。具体的设置需要参见 stylelint 文档:https://stylelint.io/

但是这种错误报告需要在编译时才会发生,如果我希望在编写代码时就自动在编辑器里报错呢?

既然想在编辑器里达到该功能,那么就要在编辑器里做文章

安装 vscode 的插件 stylelint 即可,它会读取你工程中的配置文件,按照配置进行实时报错

实际上,如果你拥有了 stylelint 插件,可以不需要在 postcss 中使用该插件了

制的颜色值不正确

如果某些规则并非你所期望的,可以在配置中进行设置

{"extends": "stylelint-config-standard","rules": {"indentation": null}
}

设置为 null 可以禁用该规则,或者设置为 4,表示一个缩进有 4 个空格。具体的设置需要参见 stylelint 文档:https://stylelint.io/

但是这种错误报告需要在编译时才会发生,如果我希望在编写代码时就自动在编辑器里报错呢?

既然想在编辑器里达到该功能,那么就要在编辑器里做文章

安装 vscode 的插件 stylelint 即可,它会读取你工程中的配置文件,按照配置进行实时报错

实际上,如果你拥有了 stylelint 插件,可以不需要在 postcss 中使用该插件了

相关文章:

PostCss

什么是 PostCss 如果把 CSS 单独拎出来看&#xff0c;光是样式本身&#xff0c;就有很多事情要处理。 既然有这么多事情要处理&#xff0c;何不把这些事情集中到一起统一处理呢&#xff1f; PostCss 就是基于这样的理念出现的。 PostCss 类似于一个编译器&#xff0c;可以将…...

Linux 系统上安装 Docker 并进行配置

Docker 是一种开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;类似 iPh…...

DeepSeek 等 AI 技术能否推动股市的繁荣?

在科技浪潮汹涌澎湃的当下&#xff0c;DeepSeek 等 AI 技术宛如闪耀在天际的耀眼星辰&#xff0c;吸引着全球各界的高度关注。面对这些前沿技术&#xff0c;投资者和市场参与者心中不禁泛起疑问&#xff1a;它们是否能成为推动股市繁荣的强劲动力&#xff1f;这一问题不仅左右着…...

【网络】应用层协议http

文章目录 1. 关于http协议2. 认识URL3. http协议请求与响应格式3.1 请求3.2 响应 3. http的常见方法4. 状态码4.1 常见状态码4.2 重定向 5. Cookie与Session5.1 Cookie5.1.1 认识Cookie5.1.2 设置Cookie5.1.3 Cookie的生命周期 5.2 Session 6. HTTP版本&#xff08;了解&#x…...

大数据数仓实战项目(离线数仓+实时数仓)2

1.课程目标和课程内容介绍 2.数仓维度建模设计 3.数仓为什么要分层 4.数仓分层思想和作用 下面是阿里的一种分层方式 5.数仓中表的种类和同步策略 6.数仓中表字段介绍以及表关系梳理 订单表itcast_orders 订单明细表 itcast_order_goods 商品信息表 itcast_goods 店铺表 itcast…...

测试csdn图片发布

测试csdn图片发布 ​​...

站在JavaScript的视角去看,HTML的DOM和GLTF的Json数据。

很多前端小伙伴没有见过、操作过gltf文件&#xff0c;对非常懵逼&#xff0c;本文从前端小伙伴最熟悉的dom模型为切入口&#xff0c;以类别的方式来学习一下gltf文件。 一、结构与组织形式 HTML DOM&#xff08;文档对象模型&#xff09;&#xff1a; 树形结构&#xff1a;HT…...

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…...

VSCode源码分析参考资料

VSCode Architecture Analysis - Electron Project Cross-Platform Best Practices 中文版 VSCode 架构分析 - Electron 项目跨平台最佳实践 Sihan Li博客上的vscode源码分析系列&#xff1a;分析了微服务架构、事件体系、资源管理、配置系统等 文召博客上的vscode 源码解析…...

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…...

ROS-激光雷达-消息包格式-获取激光雷达数据-激光雷达避障

文章目录 激光雷达原理 消息包格式获取激光雷达数据激光雷达避障 激光雷达 原理 激光雷达&#xff08;LiDAR&#xff09; 是一种利用激光进行距离测量和环境感知的传感器。它通过发射激光束并接收反射光来测量物体的距离&#xff0c;生成点云数据&#xff0c;用于构建环境的三…...

c++之模板进阶

在前面的文章中&#xff0c;我们已经简单的了解了模板的使用&#xff0c;在这篇文章中&#xff0c;我们将继续深入探讨模板 1.模板的特化 1.1 概念 通常情况下&#xff0c;使用模板可以实现一些与类型无关的代码&#xff0c;但对于一些特殊类型的可能会得到一些错误的结果&a…...

关于Internet Download Manager(IDM)强制下载合并相关二次开发

目录 前言 强制下载视频 强制合并 迁移下载列表 免责声明 附录 前言 那个下载工具IDM不说了&#xff0c;确实有很多便捷的功能&#xff0c;不过也有一些限制 常见的包括但不限于&#xff1a; 1.无法下载有版权保护的视频&#xff08;不管真假&#xff09; 2.有时候下载…...

鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache

OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库&#xff0c;旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍&#xff1a; 1. 核心功能 边播放边缓存&#xff1a;将音视频URL传递给 OhosVideoCache 处理后…...

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…...

程序代码篇---项目目录结构HSV掩膜Opencv图像处理

文章目录 前言第一部分&#xff1a;项目目录结构第二部分&#xff1a;HSV提取HSV色调&#xff08;Hue&#xff09;含义取值范围 饱和度&#xff08;Saturation&#xff09;含义取值范围 亮度&#xff08;Value&#xff09;含义取值范围 第三部分&#xff1a;Opencv图像处理1. 读…...

注解与反射基础

注解 概述 注解&#xff08;Annotation&#xff09;&#xff0c;从jdk5.0引入。 作用 不是程序本身&#xff0c;可以对程序作出解释&#xff08;这一点和注释没什么区别&#xff09;可以被其他程序读取 格式 注释是以“注释名”在代码中存在的&#xff0c;还可以添加一些…...

Vue指令v-html

目录 一、Vue中的v-html指令是什么&#xff1f;二、v-html指令与v-text指令的区别&#xff1f; 一、Vue中的v-html指令是什么&#xff1f; v-html指令的作用是&#xff1a;设置元素的innerHTML&#xff0c;内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…...

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…...

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov&#xff0c;并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...