我写CSS的常用套路(附demo的效果实现与源码)

2023-11-08

作者:alphardex

https://juejin.im/post/5e070cd9f265da33f8653f0

前言

本文是笔者写CSS时常用的套路。不论效果再怎么华丽,万变不离其宗。

1、交错动画

有时候,我们需要给多个元素添加同一个动画,播放后,不难发现它们会一起运动,一起结束,这样就会显得很平淡无奇。

那么如何将动画变得稍微有趣一点呢?很简单,既然它们都是同一时刻开始运动的,那么让它们不在同一时刻运动不就可以了吗。如何让它们不在同一时刻运动呢?注意到CSS动画有延迟(delay)这一属性。

举个栗子,比如有十个元素播放十个动画,将第二个元素的动画播放时间设定为比第一个元素晚0.5秒(也就是将延迟设为0.5秒),其他元素以此类推,这样它们就会错开来,形成一种独特的视觉效果。

这就是所谓的交错动画:通过设置不同的延迟时间,达到动画交错播放的效果。

本demo地址:https://codepen.io/alphardex/pen/XWWWBmQ

2、用JS分割文本

还有一种经常用到的玩法:用JS将句子或单词分割成字母,并给每个字母加上不同延时的动画,同样也很华丽。

本demo地址:https://codepen.io/alphardex/full/KKwvKGY

一般我们都是从第一个元素开始交错的。但如果要从中间元素开始交错的话,就要给当前元素的延时各加上一个值,这个值就是中间元素的下标到当前元素的下标的距离(也就是下标之差的绝对值)与步长的乘积,即:delay + Math.abs(i - middle) * step,其中中间元素的下标middle = letters.filter(e => e !== "").length / 2

本demo地址:https://codepen.io/alphardex/full/eYYMYXJ

所有有交错特性的动画都在这儿

3、随机粒子动画

说到随机性,我们可以实现一种更疯狂的效果:给几百个粒子添加交错动画,并且交错时间随机,位置大小也都是随机。如此一来我们就能用纯CSS模拟出下雪的效果。

又到了白色相簿的季节呢~为什么你写CSS这么熟练啊?

本demo地址:https://codepen.io/alphardex/full/dyPorwJ

伪类和伪元素

4、伪类

HTML元素的状态是可以动态变化的。举个栗子,当你的鼠标悬浮到一个按钮上时,按钮就会变成“悬浮”状态,这时我们就可以利用伪类:hover来选中这一状态的按钮,并对其样式进行改变。

:hover是笔者最最常用的一个伪类。还有一个很常用的伪类是:nth-child,用于选中元素的某一个子元素。其他的类似:focus:focus-within等也有一定的使用。

本demo地址:https://codepen.io/alphardex/pen/pooYKVa

5、绝对定位实现多重边框

谁规定按钮只能有一套边框的?利用绝对定位和padding,我们可以给按钮做出3套大小不一的边框来,这样效果更炫了。

本demo地址:https://codepen.io/alphardex/full/ZEYXomW

6、伪元素

简而言之,伪元素就是在原先的元素基础上插入额外的元素,而且这个元素不充当HTML的标签,这样就能保持HTML结构的整洁。

我们知道每个元素都有::before::after这两个伪元素,也就是说每个元素都提供了3个矩形(元素本身1个,伪元素2个)来供我们进行形状的绘制。现在又有了clip-path这个属性,几乎任意的形状都可以被绘制出来,全凭你的想象力

上面的动图是条子划过文本的动画,条子就是每个文本所对应的伪元素,对每个文本和其伪元素应用动画,就能达到上图的效果了

本demo地址:https://codepen.io/alphardex/pen/jOEOEzZ

7、attr()生成文本内容

元素可以有自定义的属性值,它的命名格式通常为data-*

attr()用于获取元素的这种自定义属性值,并赋值给其伪元素的content作为其生成的内容

利用这个函数,我们可以用伪元素在原先文本的基础上“复制”出另一个文本,如下图所示。

看上去有点乱糟糟的对吧?没事,给它加上overflow: hidden,把多余的文本遮住。通过JS分割文本并应用交错动画,就得到了如下的效果,这也是接下来本文要讲的overflow障眼法。

本demo地址:https://codepen.io/alphardex/full/wvBeXjd

8、overflow障眼法

之前有做过闪光按钮的效果:鼠标悬浮按钮上时一道光从左到右划过去。

笔者就用渐变来模拟那道光,通过transform: translateX()将其平移至右边。

但这样明显不对啊,这光为啥能被看见呢?不应该把它给“挡”起来吗?

于是乎,给按钮加上overflow: hidden,光在按钮外的位置时就被隐藏起来了。

这就是障眼法的力量:)

本demo地址:https://codepen.io/alphardex/pen/eYYzXBZ

更多障眼法可以看看这个作品,一次性看个够XD

9、兄弟选择符定制表单元素

提示:这里最好将input作为label的子元素,这样用户点击label时就能传到input

默认的input太丑怎么办?那就把它先抹掉,用appearance: noneopacity: 0都可以

然后,利用兄弟选择符~来定制和input相邻的所有元素(+号也行,只不过只能选中最近的元素),例如可以用伪元素生成一个新的方框代替原先的input,利用伪类:checked和动画来表示它被勾选后的状态,本质上还是障眼法哦~

本demo地址:https://codepen.io/alphardex/full/rNNPQwa

CSS特性

善用某些CSS特性,也可以为你的作品增色不少哦

10、animation

此处包括transitiontransform

CSS动画可以说是利用CSS设计炫酷特效的最强法器,它几乎贯穿了我的所有作品

有人问我为什么我能想出这么多的动画?笔者阅番百部,对常用的动画技巧了如指掌,同样那些酷炫的网站只要细心观察,也会给笔者带来很多设计上的灵感。

一言以蔽之:只有多欣赏动画,才能写出好的动画。

11、border-radius

为盒子添加圆角,经常用来美化按钮等组件

如果设定为50%则是圆形,也很常用

不规则的曲边形状

调整多个顶点的border-radius可以做出不规则的曲边形状

本demo地址:https://codepen.io/alphardex/full/abbWOPR

12、box-shadow

为盒子添加阴影,增加盒子的立体感,可以多层叠加,并且会使阴影更加丝滑

本demo地址:https://codepen.io/alphardex/full/QWwwwpp

13、遮罩

如果给box-shadow的扩张半径设定足够大的值,可以用它来遮住背景,而无需额外的div元素

本demo地址:https://codepen.io/alphardex/full/BaaKvVZ

14、内发光

注意到box-shadow还有个inset,用于盒子内部发光

利用这个特性我们可以在盒子内部的某个范围内设定颜色,做出一个新月形

再加点动画和滤镜效果,“猩红之月”闪亮登场!

本demo地址:https://codepen.io/alphardex/full/eYmGEGp

text-shadow

文本阴影,本质上和box-shadow相同,只不过是相对于文本而言,常用于文本发光,也可通过多层叠加来制作霓虹文本和伪3D文本等效果

15、发光文本

本demo地址:https://codepen.io/alphardex/full/Exxodoq

16、霓虹文本

本demo地址:https://codepen.io/alphardex/full/rNNwmZz

17、伪3D文本

本demo地址:https://codepen.io/alphardex/full/QWWavvx

18、background-clip:text

能将背景裁剪成文字的前景色,常用来和color: transparent配合生成渐变文本

本demo地址:https://codepen.io/alphardex/full/QWwveZG

gradient

渐变可以作为背景图片的一种,具有很强的色彩效果,甚至可以用来模拟光

19、linear-gradient

线性渐变是笔者最常用的渐变

这个作品用到了HTML的dialog标签,渐变背景,动画以及overflow障眼法,细心的你看出来了吗:)

本demo地址:https://codepen.io/alphardex/full/eYYxzBm

20、radial-gradient

径向渐变常用于生成圆形背景,上面例子中Snow的背景就是一个椭圆形的径向渐变

此外,由于背景可以叠加,我们可以叠加多个不同位置大小的径向渐变来生成圆点群,再加上动画就产生了一种微粒效果,无需多余的div元素。

本demo地址:https://codepen.io/alphardex/full/OJPvMGx

21、conic-gradient

圆锥渐变可以用于制作饼图

用一个伪元素叠在饼图上面,并将content设为某个值(这个值通过CSS变量计算出来),就能制作出度量计的效果,障眼法又一次完成了它的使命。

本demo地址:https://codepen.io/alphardex/full/BaydVvQ

filter

PS里的滤镜,玩过的都懂,blur最常用

22、backdrop-filter

对背景应用滤镜,产生毛玻璃的效果

本demo地址:https://codepen.io/alphardex/full/pooQMVp

23、mix-blend-mode

PS里的混合模式,常用于文本在背景下的特殊效果

以下利用滤色模式(screen)实现文本视频蒙版效果本demo地址:https://codepen.io/alphardex/full/wvvLYpV

24、clip-path

PS里的裁切,可以制作各种不规则形状。如果和动画结合也会相当有意思。

本demo地址:https://codepen.io/alphardex/full/ZEEBRrq

25、-webkit-box-reflect

投影效果,不怎么常用,适合立体感强的作品。

本demo地址:https://codepen.io/alphardex/full/ExaZgxp

26、web animations

虽然这并不是一个CSS特性,但是它经常用于完成那些CSS所做不到的事情

那么何时用它呢?当CSS动画中有属性无法从CSS中获取时,自然就会使用到它了

跟踪鼠标的位置

目前CSS还尚未有获取鼠标位置的API,因此考虑用JS来进行

通过查阅相关的DOM API,发现在监听鼠标事件的API中,可通过e.clientXe.clientY来获得鼠标当前的位置

既然能够获取鼠标的位置,那么跟踪鼠标的位置也就不是什么难事了:通过监听mouseentermouseleave事件,来获取鼠标出入一个元素时的位置,并用此坐标来当作鼠标的位移距离,监听mousemove事件,来获取鼠标在元素上移动时的位置,同样地用此坐标来当作鼠标的位移距离,这样一个跟踪鼠标的效果就实现了。

本demo地址:https://codepen.io/alphardex/full/OJPmQGz

CSS Houdini

CSS Houdini是CSS的底层API,它使我们能够通过这套接口来扩展CSS的功能

让渐变动起来

目前来说,我们无法直接给渐变添加动画,因为浏览器不理解要改变的值是什么类型

这时,我们就可以利用CSS.registerProperty()来注册我们的自定义变量,并声明其语法类型(syntax)为颜色类型<color>,这样浏览器就能理解并对颜色应用插值方法来进行动画

还记得上文提到的圆锥渐变conic-gradient()吗?既然它可以用来制作饼图,那么我们能不能让饼图动起来呢?答案是肯定的,定义三个变量:--color1--color2--pos,其中--pos的语法类型为长度百分比<length-percentage>,将其从0变为100%,饼图就会顺时针旋转出现。

利用绝对定位和层叠上下文,我们可以叠加多个从小到大的饼图,再给它们设置不同的颜色,应用交错动画,就有了下面这个炫丽的效果。

本demo地址:https://codepen.io/alphardex/full/RwNxpXQ

27、彩蛋

将交错动画和伪类伪元素结合起来写出来的慎重勇者风格的菜单

本demo地址:https://codepen.io/alphardex/full/ExavZdV

最后:

恭喜你将本文读完了。不论是过了一场视觉盛宴也好,还是学到了不少东西也好,还是直接从书签那导航到这里也好(笑),CSS的力量始终超乎你的想象。只要敢于创作,你就是这个世界的神。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我写CSS的常用套路(附demo的效果实现与源码) 的相关文章

  • go操作数据库Null类型转换失败问题

    sql NullString 解决数据库中null值的问题 go操作DB需要注意的
  • 向MySQL数据库表内导入txt和csv文件数据

    本文总结了在CentOS7上使用 LOAD DATA
  • iOS开发时如何使用 Launch Screen Storyboard

    原文 http useyourloaf com blog using a launch screen storyboard 静态启动图片 启动图片是iOS加载App的时候系统响应的直观呈现 近几年 随着屏幕尺寸的增多 制作相应的静态图片就变
  • Netty消息接收类故障案例分析

    Netty 进阶之路 分布式服务框架原理与实践 作者李林锋深入剖析Netty消息接收类故障案例 李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿 感兴趣的同学可以持续关注 1 背景 1 1 消息接收类故障 尽管Netty应用广
  • 13-ESP8266连接MQTT服务器发送数据

    Author teacherXue 一 什么是MQTT 定义 MQTT是一个基于客户端 服务器的消息发布 订阅传输协议 MQTT协议是轻量 简单 开放和易于实现的 这些特点使它适用范围非常广泛 在很多情况下 包括受限的环境中 如 机器与机器
  • HTML 列表

    HTML 列表和 CSS 列表属性 在 HTML 中 列表主要有两种类型 无序列表 ul 列表项用的是项目符号标记 有序列表 ol 列表项用的是数字或字母标记 CSS 列表属性使您可以 为有序列表设置不同的列表项标记 为无序列表设置不同的列
  • 产品经理工作积累(3)

    按职业经理的层次模型产品经理又可分工匠型 元帅型和老师型 1 工匠型 工匠型产品经理主要的价值在于 在某个专业领域里其技能的娴熟程度 2 元帅型 元帅型产品经理 能够在一个领域中带领一帮人来完成一个特定的项目 他的能力体现在全局范围的组织
  • JQuery Tab 滑动们导航菜单效果

    这种效果目前互联网上用的很多希望可以给大家提供帮助 图片是采用css sprites实现的 在tab例子的基础上尽行了扩展 符合web标准 兼容多浏览器 效果01预览 http www yuyadong com test JQuery Ta
  • 云主机-生产环境下离线安装Docker部署应用

    离线安装Docker 配置Docker以及使用Docker 作为生产环境下离线部署Docker 以及使用Docker部署应用系统 下面的记录做出非常详细的操作步骤 下载Docker离线安装包 Linux版本下载地址 Index of lin
  • SERDES关键技术

    目录 一 SERDES介绍 二 SERDES关键技术 2 1 多重相位技术 2 2 线路编解码技术 2 2 1 8B 10B编解码 2 2 2 控制字符 Control Characters 2 2 3 Comma检测 2 2 4 扰码 S
  • SpringBoot项目使用通用Mapper

    SpringBoot项目使用通用Mapper 前言 后端业务开发 每个表都要用到单表的增删改查等通用方法 而配置了通用Mapper可以极大的方便使用Mybatis单表的增删改查操作 通用mapper配置 1 添加maven
  • 三种交换值的方式

    1 使用临时变量temp作为一个中转站交换 int a 4 b 9 temp temp a a b b temp 缺点 占用内存 效率最低 2 利用加减法实现两个变量之间的交换 int a 1 b 2
  • centos中 系统自带python2 无法使用pip命令

    centos中 系统自带python2 无法使用pip命令 yum y install epel release yum install python pip 升级pip 可选 pip install upgrade pip pip无法安装
  • chart.js使用用法

    下面的链接是不同的图的实例 请先看本文了解大概 再看不同的统计图的实现 使用chart js画折线图 甜甜圈图和饼状图 chart js使用用法 定义画布
  • 【Android取证篇】华为手机助手支持备份的数据类型-支持第三方应用

    Android取证篇 华为手机助手支持备份的数据类型 支持第三方应用 数据备份至电脑端 使用数据线或WLAN连接 取证注意断网操作 suy 文章目录 Android取证篇 华为手机助手支持备份的数据类型 支持第三方应用 一 支持备份的数据

随机推荐

  • 这个小程序厉害了!一键生成花式昵称,让你的微信从此与众不同!

    微信作为互联网时代的主要通讯工具 已经有10亿人在使用了 看朋友圈好友的微信昵称也是千奇百怪 如何才能制作专属于自己的昵称呢 今天小编给大家分享一款有意思的微信小程序 能够帮助我们制作出不一样的微信昵称 一起来看看吧 第一步 在微信中搜索
  • Makefile篇卷首语

    2023年5月24日 周三下午 今天我决定开始学习Makefile 一是因为很多开源软件都有Makefile 不会Makefile真的不行 我不知道怎么用Makefile来生成软件 也无法通过Makefile来查看我缺了什么依赖 因为我看不
  • Linux工具——gcc

    目录 一 gcc简介 二 C语言源文件的编译过程 1 预处理 2 编译 3 汇编 4 链接 5 动静态库 一 gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio 其实这个gcc这个编译器实现的功能便是
  • 进制转换(C++实现)

    写在前面 小学期作业中碰到一题进制转换 自己写的过程很是坎坷 想到没有系统学习过进制转换的知识 于是搜索资料进行一个查漏补缺 本文仅作为学习记录 参考资料 C 手把手编程实现进制转换 哔哩哔哩 bilibili 模版学习自咸鱼君 http
  • TDBC回顾

    2023年7月5日上午 由中国通信标准化协会和中国信息通信研究院主办 大数据技术标准推进委员会承办 InfoQ联合主办的 2023可信数据库发展大会 电信行业数据库应用创新分论坛在北京国际会议中心隆重召开 会上 湖南亚信安慧科技有限公司副总
  • LoadRunner时提示“安装程序已确定挂起重新启动”解决方案

    在安装QTP或LoadRunner时 可能会遇到 安装程序已确定挂起重新启动 是否要立即退出安装以重新启动系统 的提示 但是重启电脑后再次启动安装程序 仍然有此错误提示 以下是我安装QTP时遇到的一个提示 如下图所示 这里给出问题产生原因以
  • 第一次AIGC主题线上交流

    2023年6月4日6点至8点 由 见睿思齐 发起和组织的第一次AIGC主题交流 愉快结束 在此非常感谢大家参与 同时也希望每位参与讨论的朋友 都有所收获 并且目标感满满地期待下一次交流 话说前段时间 见睿思齐 抛出了一个招募 AICG内容联
  • Java多维数组

    Java 中没有多维数组的概念 从数组底层的运行机制上来看 Java 没有多维数组 但是 Java 提供了支持多维数组的语法 可以实现多维数组的功能 Java 语言里的数组类型是引用类型 因此数组变量其实是一个引用 这个引用指向真实的数组内
  • 自动化测试:获取用户登录token信息,实现绕过登录跳转页面

    1 之前在网上看到 一些配置cookie来实现绕过登录的文章 但是 对于现在的网站 有些采用Local Storage来缓存当前加密的登录信息 这样的话 是无法通过cookie来操作的 所以我们需要得到缓存的已登录信息来实现绕过登录跳转到需
  • 安装Windows子系统(WSL2)-Ubuntu

    参考资料 https docs microsoft com zh cn windows wsl install manual https blog csdn net qq 28412779 article details 113565257
  • type-aliases-package不生效问题记录

    项目场景 在练习springboot集成mybatis时发现了这个问题 问题描述 这是我的yml文件中的type aliases package配置 但在mapper xml文件中还是不会生效 原因分析 配置地址书写错误 插件和idea冲突
  • HTML静态网页设计作业_胡歌明星主题7个页面_附源码(HTML+CSS+JavaScript)

    一 网页介绍 1 作品介绍 本作品的主题是明星blog 当前素材是胡歌 整体界面干净简约 符合当下的审美 大家可以根据自己的需求进行素材调整替换 该实例包含的HTML CSS和js 非常适合初学HTML的同学来学习 2 网页编辑 网页代码非
  • 哈尔滨工业大学21年计算机考研情况 学硕复录比超2:1?复试竞争激烈!

    https mp weixin qq com s U0LpgUuUHnYyt7bf 6eCCg
  • 支付系统就该这么设计(万能通用),稳的一批!

    作者 PetterLiu 来源 www cnblogs com wintersun 支付永远是一个公司的核心领域 因为这是一个有交易属性公司的命脉 那么 支付系统到底长什么样 又是怎么运行交互的呢 抛开带有支付牌照的金融公司的支付架构 下述
  • Can't connect to activity manager; is the system running 问题探究及解决

    一 文档概述 本文旨在记录错误信息Error type 2 android util AndroidException Can t connect to activity manager is the system running 问题分析
  • 学习ORACLE-物化视图(MATERIALIZED VIEW)总结

    数据仓库项目中使用物化视图推送数据 现记录一下相关方面的知识 物化视图需要有基表 基表可以在本地库 也可以在远程库 可以在本地通过数据库链接访问远程库的基表 基表 hr departments orcl 物化视图 scott departm
  • google可视化编程工具blockly介绍

    1 什么是blockly blockly是google发布的可视化编程工具 是一个可用于Web Android iOS的可视化代码编辑器库 blockly有几个特点 它是纯粹的javascript库 它是100 面对客户端的 没有任何服务端
  • Cesium中文教程-空间数据可视化Visualizing Spatial Data(一)

    目录 3 空间数据可视化 Visualizing Spatial Data 1 实体API What is the Entity API 2 第一个实体 Our First Entity 3 图形和容器 Shapes and Volumes
  • 30. PyQuery: 基于HTML的CSS选择器

    目录 前言 导包 基本用法 按标签选择 标签链式操作 简便链式 后代选择器 类选择器 id 选择器 属性 文本选择器 重点 改进多标签拿属性方法 快速总结 PyQuery的强大功能 修改源代码 添加代码块 修改 添加属性 删除属性 标签等
  • 我写CSS的常用套路(附demo的效果实现与源码)

    作者 alphardex https juejin im post 5e070cd9f265da33f8653f0 前言 本文是笔者写CSS时常用的套路 不论效果再怎么华丽 万变不离其宗 1 交错动画 有时候 我们需要给多个元素添加同一个动