前端工程化_CSS 工具链_学习笔记

news/2024/12/16 10:52:34/文章来源:https://www.cnblogs.com/goicandoit/p/18608815

CSS 工具链

css 呢,有以下两个缺点

1.语法缺失(循环、判断、拼接)

2.功能缺失(颜色函数、数学函数、自定义函数)

虽然 CSS 支持几个函数,比如:

url('') 用于引入外部资源

calc() 计算函数,计算尺寸、间距等

linear-gradient 渐变函数

但还是太少了

这时候有人就创造了新语言

新语言是 CSS 的超集

新语言 -编译器-> CSS语言

本文讲一讲 sass

sass/less/stylus -CSS预编译器-> CSS语言

预处理器

body{background-color: #f40;
}

写了一个纯粹的 CSS 代码

然后需要用到预编译器

使用命令下载

npm i -g sass

然后就可以使用 sass 这个命令了,这里需要注意 node 版本不能太低,需要12以上,我这里用的是18

image-20241214203333782

使用命令转换

sass 1.scss 1.css
image-20241214203501601

生成了两个,一个是 CSS,一个是源码地图,是用于调试的,下一篇博文也会提到

使用命令

sass 1.scss 1.css --no-source-map

就会生成源码地图了

image-20241214203710804

目前左右没用区别

下面可以使用变量

sass 1.scss 1.css --no-source-map -w

watch 表示监听文件的变化

image-20241214204044368 重新编译之后就变成绿色了

下面来用 sass 写一个星空背景

sass index.scss index.css -w --no-source-map

其中 html 代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
</head>
<body><div class="layer1"></div><div class="layer2"></div><div class="layer3"></div><div class="title">星空</div>
</body>
</html>

当前效果

image-20241215200111937

设置阴影

html {height: 100%;background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);overflow: hidden;
}.title {position: absolute;top: 50%;left: 0;right: 0;color: #fff;text-align: center;font-family: "lato", sans-serif;font-weight: 300;font-size: 50px;letter-spacing: 10px;margin-top: -60px;padding-left: 10px;background: linear-gradient(white, #38495a);background-clip: text;-webkit-background-clip: text;color: transparent;
}.layer1 {$size: 100px;position: fixed;width: $size;height: $size;border-radius: 50%;left: 0;right: 0;background-color: #fff;box-shadow: 10vw 10vh #fff;
}
image-20241215200714782

阴影是可以设置多个的

box-shadow: 10vw 10vh #fff, 20vw 20vh #fff, 30vw 30vh #fff, 40vw 40vh #fff;
image-20241215200846781

那这样就有一个思路了,能不能做成一个循环,循环的生成这些阴影,像 js 就一个 for 搞定,可是 css 没有循环

但是 scss 里面有循环,可以自定义函数

这个函数要做的无非是字符串的拼接

js 中用的是 $,这里是 #

@function createShadow($n){$shadow:'10vw 10vh #fff';@for $i from 2 through $n {$shadow: '#{$shadow}, 10vw 10vh #fff';}@return $shadow;
}

因为拼接的是字符串,所以返回带了“”,用 sass 里面的 unquote 去掉双引号

image-20241215202226191

可以看到现在都是偏移同一个量

@function createShadow($n) {$shadow: '#{random(100)}vw #{random(100)}vh #fff';@for $i from 2 through $n {$shadow: '#{$shadow}, #{random(100)}vw #{random(100)}vh #fff';}@return unquote($shadow);
}

改成这样,生成0-100随机数

image-20241215203024151

然后把星星改成一个像素即可

image-20241215203120503

有那味了

那么接下来就是星星的往上移动

.layer1 {$size: 4px;position: fixed;width: $size;height: $size;border-radius: 50%;left: 0;right: 0;background-color: #fff;box-shadow: createShadow(200);animation: moveUp 5s linear infinite;
}@keyframes moveUp{100%{transform: translateY(-100vh);}
}

现在的问题就是星星只移动一半,星星底移动到视口顶之后再回到原来位置

image-20241215204825296

这样处理就可以了,复制一份星星

可以把下面的星星作为上面的子元素

    &::after {content: '';position: fixed;left: 0;top: 100vh;width: inherit;height: inherit;border-radius: inherit;box-shadow: inherit;}
image-20241215205206198

这样添加

image-20241215205326843

稳稳的,没有问题了

搞定了一个层之后,我们要搞定多个层

那么就希望循环生成选择器

@for $i from 1 through 3 {.layer#{$i} {$size: 1px;position: fixed;width: $size;height: $size;border-radius: 50%;left: 0;right: 0;box-shadow: createShadow(200);animation: moveUp 5s linear infinite;&::after {content: '';position: fixed;left: 0;top: 100vh;width: inherit;height: inherit;border-radius: inherit;box-shadow: inherit;}}
}

这下可以 layer1、2、3了

image-20241215205751038

然后是处理星星个数和星星大小

$count: 1000;@for $i from 1 through 3 {$count: floor(calc($count/2));@debug $count;.layer#{$i} {$size: #{$i}px;position: fixed;width: $size;height: $size;border-radius: 50%;left: 0;right: 0;box-shadow: createShadow($count);animation: moveUp 5s linear infinite;&::after {content: '';position: fixed;left: 0;top: 100vh;width: inherit;height: inherit;border-radius: inherit;box-shadow: inherit;}}
}

这样处理,越大的星星就越少

再改一下时间

$count: 1000;
$duration:400s;
@for $i from 1 through 3 {$count: floor(calc($count/2));$duration:floor(calc($duration/2));@debug 'count: #{$count}';@debug 'duration: #{$duration}';.layer#{$i} {$size: #{$i}px;position: fixed;width: $size;height: $size;border-radius: 50%;left: 0;right: 0;box-shadow: createShadow($count);animation: moveUp $duration linear infinite;&::after {content: '';position: fixed;left: 0;top: 100vh;width: inherit;height: inherit;border-radius: inherit;box-shadow: inherit;}}
}

啪的一下,像模像样了

image-20241215213820544 image-20241215213227147

显然 css 的代码比 scss 代码多了很多,这就是工程化的意义

SCSS 的出现让我们可以使用到很多的新语法和新功能,从而增强 CSS 目的,提升我们的开发效率

后处理器

image-20241214215239678

后处理器:

  • 厂商前缀:autoprefixer
  • 代码压缩:cssnano
  • 代码剪枝:purgecss
  • 类名冲突:css module

不管是预处理器还是后处理器,做的都是转换

转换就是这些东西的共同逻辑

比如说日期选择的组件,其实就是在做抽象

对于日期选择进一步抽象就是下拉选择/下拉框+日期选择

抽象下拉框就不仅适用于日期选择了,也可以下拉列表等等

做出通用的下拉框就是更高级别的抽象

再抽象,触发+弹出

image-20241214220228168

这其实和 JS 里面的 babel 逻辑是一样的

使用命令

npm install --save-dev postcss postcss-cli
image-20241215214441549

来了,postcss、postcss-cli 其实和 babel-core、babel-cli 是可以类比的

npm install --save-dev postcss postcss-cli postcss-modules postcss-preset-env tailwindcss autoprefixer

package.json 加上内容

{"name": "basic","version": "1.0.0","description": "","main": "index.js","scripts": {"compile": "postcss src/**/*.css -d dist -w --no-map"},"keywords": [],"author": "","license": "ISC","devDependencies": {"autoprefixer": "^10.4.20","postcss": "^8.4.49","postcss-cli": "^11.0.0","postcss-modules": "^6.0.1","postcss-preset-env": "^10.1.2","tailwindcss": "^3.4.16"}
}

tailwind.config.js 也配置一下

module.exports = {content: ["./src/**/*.{html,js,jsx,ts,tsx,css}", // 扫描 src 目录下的所有文件"./public/index.html",                 // 包括 HTML 文件],theme: {extend: {},},plugins: [],
};

postcss.config.js 也配置一下

module.exports = {plugins: {'postcss-preset-env': { stage: 1 }, // 支持最新的 CSS 特性'tailwindcss': {},                 // TailwindCSS 支持'autoprefixer': {},                // 添加浏览器前缀'postcss-modules': {               // 启用 CSS ModulesgenerateScopedName: '[name]__[local]___[hash:base64:5]',},},};

我的结构是这样的

image-20241215220707927

可以看到编译后类名变了

image-20241215220012337

同时还会出来 json 做类名映射

image-20241215220056198

这个又有加厂商前缀

image-20241215220223547

这就是 postcss

tailwind

tailwind:称为原子化 CSS,是基于 postcss 的一个插件

image-20241215220344995

这三行编译完就是这么多内容

这就是插件能力

END

本文主要介绍了 CSS 工具链,可以看出工具链的出现都是为了解决语言的问题,文中就介绍了预处理器和后处理器,预处理器主要介绍了 sass,并举了星空这个例子,sass 是通过与预编译器编译成 css 后给 html 使用;后处理器则介绍了 postcss,其中 postcss 和 babel 类似,都有很多插件,简单介绍了一下 tailwind 这个原子化 CSS,它也是 postcss 的一个插件

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

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

相关文章

车载以太网TSN设计及测试解决方案

智能汽车电子电气架构全面向中央+区域式发展,车载通信新技术是新架构技术栈的重要组成部分。车载以太网时间敏感网络TSN技术凭借其低延时、高可靠的特点获得多家OEM的认可。依赖多年技术研发及数十个项目的实践积累,经纬恒润可为客户提供全面、专业且本土化的TSN设计与测试解…

看板软件:跨境电商圣诞营销加速器

看板软件在跨境电商中发挥着多重作用,特别是在圣诞节这一关键销售时期。通过清晰有序的任务管理、灵活适配的自定义功能、高效的信息整合与数据分析、以及精准有效的营销策略应用,看板软件显著提升了跨境电商团队的协作效率和销售能力。圣诞节作为全球最重要的购物节日之一,…

LameUI:轻量级嵌入式图形用户界面的绝佳选择

在信息技术迅猛发展的今天,嵌入式系统逐渐成为各种智能设备的核心。这些系统往往面临资源有限的挑战,因此在开发用户界面时,使用轻量级、易于实现的库显得尤为重要。在这种背景下,LameUI 应运而生。作为一个轻量级且平台无关的图形用户界面库,LameUI 旨在为开发者提供简便…

分享图片

测试图片分享

LT1121IST-5#TRPBF 规格书 数据手册具有关断功能的微功率低压差稳压器芯片

LT1121/LT1121-3.3/LT1121-5是具有关断功能的微功率低压差稳压器。这些设备能够以0.4V的压降提供150mA的输出电流。这些设备设计用于电池供电系统,低静态电流(30A运行,16A关断)使其成为理想的选择。静态电流得到良好控制,不会像许多其他低压差PNP稳压器那样在压降时上升。…

OPA828IDR OPA2828 数据手册一款低失调电压、低温漂、低噪声输入运算放大器芯片

OPA828 和 OPA2828 (OPAx828) JFET 输入运算放大器是 OPA627 和 OPA827 的下一代产品,兼具高速度、高直流精度和高交流性能。这些运算放大器可提供低失调电压、低温漂、低偏置电流和低噪声,噪声仅为60nVRMS 0.1Hz 至 10Hz。OPAx828 在 4V 至 18V的宽电源电压范围内工作,每通…

vue2 脚手架安装及使用

1.安装npm install -g @vue/cli 2.查看版本vue -V 3.使用3.1 命令形式vue create my-project 3.2可视化操作

.NET8升级.NET9,CodeFirst模式迁移Add-Migration执行Update-DataBase报错

在做netcore开发时,如果net8一直是正常的,只升级了一下框架net9,在使用Entity Framework Core的Code First模式进行迁移时,执行Add-Migration后尝试使用Update-DataBase时出现了如下错误。Unhandled exception. System.InvalidOperationException: An error was generated …

响应式圆形js轮播图插件

jcircle.js是一款响应式圆形js轮播图插件。该轮播图插件能够将图片或文字以圆形轮播图的方式进行展示。并且该轮播图以响应式设计,可以自动进行圆形轮播。在线演示 下载使用方法 在页面中引入jCircle.css和jCircle.min.js文件<link href="jCircle.css" rel=&quo…

阿里云联合中国信通院等单位发布首个云计算智能化可观测性能力成熟度模型标准

随着云计算技术与现代企业技术架构的飞速发展,IT 运维场景愈发多元与复杂,需要观测的对象、观测数据类型、数据规模、数据结构复杂度相较于传统监控发生了翻天覆地的变化。这给企业可观测性的准确、实时、高效与智能化发展带来了巨大挑战。如何借助大模型等智能化技术成为应对…

交易系统:应用层、领域层分层架构设计

大家好,我是汤师爷~ 线上线下交易系统的应用架构包括终端、应用层、领域层和关联系统。应用层能力 应用层定义软件的应用功能,负责接收用户请求、协调领域层执行任务并返回结果。主要包括以下模块: 1)C端服务模块 为消费者提供完整的交易链路功能,包括加购、下单、支付、结…

卖点

什么是埋点? 埋点是一种用于跟踪用户在网站或应用中行为的数据采集技术,通过记录点击、浏览等操作,帮助团队进行用户行为分析、AB 实验、错误监听,指导优化方向和资源分配 监控类型 基于要监控的内容,可以分为:数据监控、性能监控、异常监控 上报方式 手动上报在用户点击…