从特效入手,深入了解CSS(一):动态加载特效

2023-05-16

不建议跳跃阅读!
这篇文章将从头开始介绍如何实现一个特效
中间偶尔会穿插一些css3或平时接触不多的css属性

首先看一看这一期的特效:

ezgif-3-a4c04cbba6

HTML部分

<div class="loader"></div>

CSS 部分

既然是一个加载特效,那么我们可以将loader垂直居中的放在页面上,这里采用的是grid布局的方法:

body {
    height:100vh;
    display:grid;
    place-content:center;
}

也许你曾经没有接触过grid布局,所以这里介绍一些常见的grid用法

grid布局

它可以将容器划分为行和列,产生单元格,然后操作项目所在的单元格,可以将grid布局看作是二维布局(平时使用的可能更为广泛的flex布局则是针对items的轴线来判定,可以看作是一维布局)

image-20220416153208113

grid-template-*

既然是二维布局,那么肯定也存在行列的设置:

  • grid-template-columns:表示列
  • grid-template-rows:表示行

以上面的图片为例,我们需要一个三行四列的布局,因此可以这样做:

grid-template-columns:100px 100px 100px;
grid-template-rows:100px 100px 100px 100px;

/* 简写 */
grid-template-columns:repeat(3,100px);
grid-template-rows:repeat(4,100px);

/* 简写 */
/* 图片中实际上是三等分列,所以可以通过repeat中的 fr 表示等分的比例关系*/
/* 比如 grid-template-columns: 1fr 2fr 3fr; 可以将列宽分成6份,三个item的长度之比为1 : 2 : 3 */
/* eg: 宽度平均分为三列等分 */
grid-template-columns:repeat(3,1fr);

grid-gap

除了可以设置行列的条数,还可以设置每个item之间的距离gap

看到这里你可能会想:“那就通过`grid-column-gap和grid-row-gap设置间隔大小就可以了”

这在以前是正确的,可是注意:根据最新标准,gap相关的grid-前缀已经删除, grid-column-gap和grid-row-gap写成column-gaprow-gap,他俩的简写grid-gap写成gap,比如:

row-gap:20px;
column-gap:20px;
/* 简写 */
gap:20px 20px;

垂直和水平布局方式

grid中控制垂直和水平布局方式的属性名称和flex布局类似:

  • 通过justify-items控制水平方向上,二维数组的每一个item中元素的对齐格式
  • 通过align-items控制垂直方向上,二维数组的每一个item中元素的对齐格式
  • 简写:place-items:xx, xx

比如:

/* 水平方向上每个item中元素左对齐 */
justify-items: start;

image-20220416155205022

  • 通过justify-content将每一列看作是一个整体,控制水平方向上,二维数组的每一列元素的对齐格式

  • 通过align-content将每一列看作是一个整体,控制垂直方向上,二维数组的每一行元素的对齐格式

  • 简写:place-content:xx, xx

    比如:

/* 水平方向上每列元素分散对齐 */
justify-content: space-around;

image-20220416155547155

好了,现在了解这些就可以了,现在再来看看之前的代码:

body {
    height:100vh;
    display:grid;
    place-content:center;
}

这段css的意思是设置body采用grid布局,并且让body中的元素在水平和垂直方向上都处于center的位置上

现在我们让loader垂直居中了,为他加一些样式:

.loader {
    width: 200px; 
    aspect-ratio: 1;
    display: grid;
    /* 为图像设置一个渐变色*/
    background: linear-gradient(135deg,#00A8C6,#8FBE00);
    /* 以向内的方式裁剪图片,消除图片的边缘*/
    clip-path: inset(10%);
}

aspect-ratio

在响应式网页设计中,保持一致的宽高比,即所谓的长宽比,对于防止布局累积偏移至关重要。在 Chromium 88、Firefox 87 和 Safari Technology Preview 版本中推出了 aspect-ratio 属性,我们有了更直接的方法来实现这一目标。

长宽比最常见的表示形式为:宽:高,摄影最常见的长宽比是 4:3 和 3:2 ,而视频和最近的消费类相机则倾向于16:9的长宽比。

随着响应式设计的出现,保持长宽比对于我们来说越来越重要。比如当我们改变显示区域大小时,div元素的长宽比也会保持不变,改变的只是长宽的数值。在一些场景下,维持长宽比显得非常的有用,比如:

/* 维持容器盒子长宽比为 16:9 */
.container {
  width: 100%;
  aspect-ratio: 16 / 9;
}

我们都知道在前端开发中经常遇到需要保持一个元素的长宽比的问题,最常见的就是我们的Img元素video元素这种本身就具有长宽比的元素。

使用auto属性,可替换元素(img、video这种本身就具有长宽比的元素)将继续保持它原本的长宽比,不会受css属性的影响。

如果希望在改变可视区域元素的长宽比时,让img元素维持原来的长宽比,可以这样做:

.container {
  width: 300px;
  /* auto元素让img元素保持原来的长宽比; 2 / 1让其他的盒子元素在大小放缩时,长宽比固定为2 / 1 */
  aspect-ratio: auto 2 / 1; 
}

好了,知道这些就够用了。这篇文章的介绍挺详细的,想要了解更多的话可以点进去看看。

我们为.loader标签设置aspect-ratio:1时可以有效地保证加载特效的1: 1展示。

回想之前的特效,正中心的.loader元素分开形成了四个小的圆圈,这些圆圈当然可以说是新增四个小的div来实现,但是这样就慢了。我们可以通过伪元素:before设置。

不过,按照以前的角度来想:“:before好像只能设置一个元素吧?“

这就错了,在css3中background属性可以设置多张背景!

css3 background特殊用法

MDN文档中的解释如下:

background 属性被指定多个背景层时,使用逗号分隔每个背景层。

每一层的语法如下:

  • 在每一层中,下列的值可以出现 0 次或 1 次:
    • <attachment>
    • <bg-image>
    • <position>
    • <bg-size>
    • <repeat-style>
  • <bg-size> 只能紧接着 <position> 出现,以"/"分割,如: “center/80%”.
  • <box> 可能出现 0 次、1 次或 2 次。如果出现 1 次,它同时设定 background-originbackground-clip。如果出现 2 次,第一次的出现设置 background-origin,第二次的出现设置 background-clip
  • <background-color> 只能被包含在最后一层。

因此,我们可以写出以下代码:

.loader:before {
    content: "";
    padding: 10%;
    /* 利用css变量的方式,将每个小圆的属性抽离出来 */
    /* 对于background来说,一定要设置no-repeat,不然就会自动复制填充了*/
    --_g: no-repeat content-box radial-gradient(50% 50%,#000 95%,#0000);
    /* 利用css3中background属性的特殊用法,设置四个圆圈 */
    background: var(--_g),var(--_g),var(--_g),var(--_g),#fff;
    /* 设置每个小圆的大小*/
    background-size: 20% 20%;
    /* 为元素添加模糊效果再增加对比度,可以实现柔和的水滴相融效果*/
    filter: blur(5px) contrast(20);
    /* 设置图片元素与父容器背景进行混合,图片会变暗 */
    /* 以韦恩图举例,这里设置的是韦恩图上的重叠部分*/
    mix-blend-mode: lighten;
}

好了,现在我们已经实现了最关键的一步:成功的创建了四个小圆,由于我们没有对它们进行定位,所以现在四个小圆的圆心重叠的位于左上角,由于采用的是padding: 10%;,可以让圆圈向下向右移动一些。

现在来实现动画效果:

@keyframes l {
  /* 0% 100%时,四个小圆分别位于上右下左 */
  0%,
  100%{background-position:top,right,bottom,left}
  /* 20% 时,上面的圆移动到中间 */
  20% {background-position:center,right ,bottom,left}
  /* 40% 时,右面的圆移动到中间 */
  40% {background-position:center,center,bottom,left}
  60% {background-position:center,center,center,left}
  80% {background-position:center,center,center,center}
}

光是小球的移动可能会有些单调,所以我们再加一些放大效果,看起来更炫酷:

@keyframes s{
  0%,
  25%,
  90% {background-size:20% 20%}
  40%,
  45%{background-size:30% 30%,20% 20%,20% 20%,20% 20%}
  60%,
  65%{background-size:40% 40%,20% 20%,20% 20%,20% 20%}
  80%{background-size:50% 50%,20% 20%,20% 20%,20% 20%}
}

最后在.loader:before中添加上动画效果:

.loader:before {
    content: "";
    padding: 10%;
    --_g: no-repeat content-box radial-gradient(50% 50%,#000 95%,#0000);
    background: var(--_g),var(--_g),var(--_g),var(--_g),#fff;
    background-size: 20% 20%;
    filter: blur(5px) contrast(20);
    mix-blend-mode: lighten;
    animation: l 3s infinite,s 3s infinite;
}

搞定,看看最终的效果吧:

ezgif-3-a4c04cbba6

完整代码

代码参考自codepen

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>黑猫几绛 |</title>
</head>
<style>

body {
    height:100vh;
    display:grid;
    place-content:center;
}

.loader {
    width: 200px; 
    aspect-ratio: 1;
    display: grid;
    background: linear-gradient(135deg,#00A8C6,#8FBE00);
    clip-path: inset(10%);
}
.loader:before {
    content: "";
    padding: 10%;
    --_g: no-repeat content-box radial-gradient(50% 50%,#000 95%,#0000);
    background: var(--_g),var(--_g),var(--_g),var(--_g),#fff;
    background-size: 20% 20%;
    filter: blur(5px) contrast(20);
    mix-blend-mode: lighten;
    animation: l 3s infinite,s 3s infinite;
}
@keyframes l {
    0%,
    100%{background-position:top,right,bottom,left}
    20% {background-position:center,right ,bottom,left}
    40% {background-position:center,center,bottom,left}
    60% {background-position:center,center,center,left}
    80% {background-position:center,center,center,center}
}
@keyframes s{
    0%,
    25%,
    90% {background-size:20% 20%}
    40%,
    45%{background-size:30% 30%,20% 20%,20% 20%,20% 20%}
    60%,
    65%{background-size:40% 40%,20% 20%,20% 20%,20% 20%}
    80%{background-size:50% 50%,20% 20%,20% 20%,20% 20%}
}

</style>
<body>
	<div class="loader"></div>
</body>
</html>

思考:现在假设有一个需求,需要实现八个小球在水平垂直的位置不停旋转,你会怎么做?

提示:用这篇文章介绍过的方法可以实现。

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

从特效入手,深入了解CSS(一):动态加载特效 的相关文章

  • PHP四大基本排序算法

    冒泡排序 思路分析 xff1a 在要排序的一组数中 xff0c 对当前还未排好的序列 xff0c 从前往后对相邻的两个数依次进行比较和调整 xff0c 让较大的数往下沉 xff0c 较小的往上冒 即 xff0c 每当两相邻的数比较后发现它们
  • 设置centos的YUM源为国内阿里云源

    阿里云Linux安装镜像源地址 xff1a http mirrors aliyun com http mirrors aliyun com repo CentOS系统更换软件安装源 第一步 xff1a 备份你的原镜像文件 xff0c 以免出
  • PHP八大设计模式

    PHP命名空间 可以更好地组织代码 xff0c 与Java中的包类似 Test1 php span class php span class hljs preprocessor lt php span span class hljs key
  • GitLab使用手册

    安装Git 安装环境 xff1a windows下载地址 xff1a git官方网站安装包 xff1a 64位安装过程 xff1a 傻瓜式安装至此安装完毕 生成私钥和公钥 ssh span class hljs attribute keyg
  • echarts使用心得

    前言 第一次参加工作 xff0c 公司使用图表很频繁 xff0c 我之前会highcharts xff0c 但是公司基本上都是使用的echarts xff0c 于是自己开始琢磨echarts xff0c 使用起来却颇费了一番工夫 所以就把使
  • JQuery插件之Masked Input

    Masked Input是一个字符输入格式化的jQuery插件 它可让你轻松的实现对各种数据的输入进行格式限制 xff0c 如日期 电话等 Masked Input在IE Firefox Safari和Chrome通过测试 Mask会自动为
  • 关于jQuery的九大使用误区

    jQuery是如此容易使用 xff0c 以至于我们有时候忘记了CSS的存在 我们在使用CSS时 xff0c 几乎不去考虑性能 xff0c 因为它已经是快得不值得再去做什么优化上 的努力 但现实世界中 xff0c JQuery会导致令开发人员
  • echarts主题属性设置

    theme 61 span class hljs comment 全图默认背景 span backgroundColor span class hljs string 39 rgba 0 0 0 0 39 span span class h
  • java keytool证书工具使用小结

    Keytool 是一个Java数据证书的管理工具 Keytool将密钥 xff08 key xff09 和证书 xff08 certificates xff09 存在一个称为keystore的文件中在keystore里 xff0c 包含两种
  • Another app is currently holding the yum lock; waiting for it to exit...

    Another app span class hljs keyword is span currently holding span class hljs keyword the span yum lock waiting span cla
  • Javascript网页打印大全

    目录 普通打印 xff08 整页打 xff09 打印去掉 添加页眉页脚 使用外部控件 方法实现多功能打印 打印背景 普通打印 xff08 整页打 xff09 span class hljs built in window span span
  • centos6.5启动nginx报错

    问题 xff1a nginx emerg socket 80 failed 97 Address family not supported by protocol 解决方案 vim etc nginx conf d default conf
  • echarts和highchart的区别

    echarts 先大体了解一下echarts的历史 xff1a echarts是百度公司前端开发的一个图表库 支持柱状图 饼状图 k线图 map图 热导向图 折线图 主要采用canvas画图 highchart highcharts是国外的
  • vi/vim常用配置和快捷键

    快捷键 命令名功能描述gg将光标移动到文档头部G将光标移动到文档尾部nyy全选文本 xff08 没有全选命令的 xff0c 我的做法就是复制n行 xff0c 只要n大于文本的行数就行 xff09 如何复制文本内容到另一个文件中 使用vim进
  • Cannot resolve module 'child_process'

    ERROR span class hljs keyword in span span class hljs regexp xmlhttprequest span lib XMLHttpRequest js Module not found
  • Cannot resolve module 'fs'

    可能很多人都会遇到这个问题 xff0c 反正我的话已经遇到两次了 xff0c 上一次解决的时候没有记录解决办法 xff0c 这次又遇到了 xff0c 而且国内搜索引擎是搜不到这个问题的解决办法的 xff0c 所以写个博客记录一下吧 xff0
  • 面试题13:机器人的运动范围

    题目描述 地上有一个m行和n列的方格 一个机器人从坐标0 0的格子开始移动 xff0c 每一次只能向左 xff0c 右 xff0c 上 xff0c 下四个方向移动一格 xff0c 但是不能进入行坐标和列坐标的数位之和大于k的格子 例如 xf
  • flex布局知识点Beta

    先看图 xff0c 实现下方列表中的效果 xff0c 名字在左 xff0c 数量在右 xff0c 相对条目居中 html代码 span class hljs tag lt span class hljs title view span sp
  • js如何一次循环删除数组中的多个元素

    思路 xff1a 数组遍历删除一个元素很容易 xff0c 通过splice方法删除对应索引的元素即可 xff0c 但是遍历删除多个元素就复杂了很多 xff0c 首先不能按索引从小到大的顺序删除 xff0c 这样可能会导致索引对应的元素发生变
  • git删除远程分支

    两步删除远程仓库 xff1a git branch r d origin dev 删除远程分支 git push origin dev然后提交到远程 注意 xff1a dev分支前的冒号 不能少

随机推荐

  • nodejs基础篇(一)

    我从2017年开始接触nodejs xff0c 到现在用了一年多了 xff0c 觉得我有必要写点东西出来 xff0c 记录自己的积累的知识体系 xff0c 以便更好的掌握nodejs nodejs专题不是按照严格的学习历程书写 xff0c
  • 滚动到顶部的实现方法

    span class token comment scrollTop animation span span class token keyword export span span class token keyword function
  • 浅谈ES6的Promise对象

    相信凡是写过javascript的童鞋也一定都写过回调方法 xff08 callback xff09 xff0c 简单说回调方法就是将一个方法func2作为参数传入另一个方法func1中 xff0c 当func1执行到某一步或者满足某种条件
  • node版本管理器——nvm

    nvm是管理node版本的一个工具 xff0c 具体介绍不再赘述 xff0c 请到GitHub xff08 https github com creationix nvm xff09 查看 安装 Linux Mac curl o https
  • centos下修改mysql默认端口

    mysql5 6安装 xff1a br wget http repo mysql com mysql community release el7 5 noarch rpm br rpm ivh mysql community release
  • nginx开启gzip压缩

    nginx安装 xff1a yum install y nginx 配置文件默认在 etc nginx nginx conf 打开nginx conf添加 gzip span class hljs function start span c
  • wordpress安装后问题汇总

    问题一 xff1a wordpress写文章界面点击 添加媒体 和 可视化 文本 无反应 解决方法 xff1a 在wp config php中追加 define 34 CONCATENATE SCRIPTS 34 false 问题二 xff
  • ucos ii是怎么实现多任务运行的?很通俗易懂的描述

    问题 xff1a ucos上建立一个任务 xff0c 格式如上图 xff0c 它是一个死循环 xff0c 但如果我建立了五个任务 xff0c 并且五个任务里面没有延时 xff0c 就只是像无操作系统那样写法 xff0c 用死循环让它们一直跑
  • 解决vim中文乱码

    执行 xff1a cd xff5e vim vimrc 将如下文本复制保存退出即可 set fileencodings 61 utf 8 ucs bom gb18030 gbk gb2312 cp936 set termencoding 6
  • nginx开启ssl证书

    修改listen为443 如果你又开启防火墙 xff0c 还需将443端口放开 在server中添加 ssl on ssl session timeout 5m ssl certificate cert 214050429370638 pe
  • 一键安装全局npm模块

    GitHub xff1a https github com flitrue npm install global 简介 当我们使用nvm管理node xff0c 切换node版本时 xff0c 安装在全局的npm包无法共用之前node版本中
  • vscode设置命令行启动

    方法一 xff1a 配置 启动 VS Code打开命令面板 shift 43 ctrl 43 P mac shift 43 cmmand 43 P xff0c 输入 shell command xff0c 找到 Install code c
  • Vue和React的生命周期

    最新的Vue和React生命周期 Vue 生命周期 vue生命周期主要有8个 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Re
  • js实现千位分隔符运算

    方法一 xff1a span class token keyword function span span class token function format span span class token punctuation span
  • 调整浏览器滚动条样式

    我们知道浏览器自带滚动条很丑 xff0c 有时影响整个页面到美观 xff0c 尤其在页面内嵌一个滚动列表 xff0c 显得奇丑无比 xff0c 下面我们根据如下代码调节滚动条样式 span class token punctuation s
  • 视觉SLAM理论入门——(7)视觉里程计之特征点法—对极几何

    提取ORB特征后 xff0c 需要根据点估计相机的运动 根据相机的原理 xff0c 可以分为下面几种情况 xff1a 1 当采用单目相机 xff0c 只知道2D像素坐标 xff0c 需要根据两组2D点估计运动 xff0c 这时用对极几何求解
  • 驱动程序之_1_字符设备_13_USB设备_3_鼠标驱动

    驱动程序之 1 字符设备 13 USB设备 3 鼠标驱动 从上一篇文章知道 xff0c 当我们接入一个USB设备 xff0c USB总线驱动会为我们构建一个device并注册 xff0c 编写驱动程序时只需要构造driver并注册到总线即可
  • 【转帖】驱动程序与应用程序之间的通信

    驱动程序必须与应用程序进行通信 xff0c 才能最终达到应用程序控制设备的目的 xff0c 不然驱动有QIU用 要通信就涉及到3个方面 1 应用程序与驱动程序通信 2 驱动程序与应用程序通信 3 数据传输 下面分别讨论 1 应用程序与驱动程
  • STM32最小系统硬件组成详解

    STM32最小系统硬件组成详解 0组成 xff1a 电源 复位 时钟 调试接口 启动 1 电源 xff1a 一般3 3V LDO供电 加多个0 01uf去耦电容 2 复位 xff1a 有三种复位方式 xff1a 上电复位 手动复位 程序自动
  • 从特效入手,深入了解CSS(一):动态加载特效

    不建议跳跃阅读 xff01 这篇文章将从头开始介绍如何实现一个特效 中间偶尔会穿插一些css3或平时接触不多的css属性 首先看一看这一期的特效 xff1a HTML部分 span class token tag span class to