CSS 实现祥云纹理背景

news2024/9/24 7:21:36

🪴 背景

最近掘金出来一个中秋创意活动,我准备参加一下。作品方向选择用纯css做一个中秋贺卡,其中有一些中秋的元素和一些简单的动画,而贺卡背景的实现就是本文要讲的内容

中秋贺卡成果图(生成gif有点失真😵‍💫)如下:有兴趣的可以看我的另一篇文章:中秋贺卡传送门

tutieshi_640x277_5s.gif

贺卡背景是我用css,仿照从网上搜到的祥云纹理背景图实现的,搜到的图如下:

Alt

那么本文我就来讲讲如何用 css 实现这个祥云纹理背景~

🗝 核心知识点

  • css变量
  • linear-gradient
  • background-blend-mode、mix-blend-mode 混合模式

浏览本文之前,我默认你已经掌握了css的基本知识,这里只对这三个知识点做个大概的解释:

css变量

在css中,可以声明自定义属性(也叫css变量),格式为: 两个连字符 – 加变量名,如下:

 --w: 100px;

然后就可以用 var() 函数来使用这个css变量,这样做可以大大提高css的复用性。本文实现祥云背景时,将一些关键参数抽离成了css变量,方便调整细节。

 div {
   --w: 100px;
   width: var(--w);
 }

radial-gradient、linear-gradient 渐变背景

css中的 linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片,如下:

Alt

radial-gradient函数用径向渐变来创建 “图像”。径向渐变由中心点定义,为了创建径向渐变你必须设置两个终止色。如下:

Alt

background-blend-mode、mix-blend-mode 混合模式

css 的 blend-mode 混合模式的这两个属性是设置两个叠加的图层的混合效果的,不设置的情况下(即默认值),上层图像会完全覆盖下层图像,只能通过修改上层图像的透明度才能看到下层图像。

但是设置了不同的混合模式后,就可以让两张图有各种混合效果,如下图我设置了几种常用的混合模式:

Alt

🥷 实现过程

初步分析

经过我对以下祥云图的观察,得到以下结论:

Alt

Alt

  1. 每个图元其实都是个环状波纹,环状波纹可以利用radial-gradient实现,只要以两个颜色,从 0% 到 100% 设置不同的渐变区间即可;
  2. 然后将 background-size 设置为到一个图元的大小,我这里设置为宽100px,长50px。这样就可以让图元铺满整个div;
  3. 因为每个波纹只显示了一部分,所以需要将径向渐变的中心设置到底边中点,这样只会显示半圆的波纹了;
  4. 实现环状波纹我打算先用 repeating-radial-gradient 试一试,毕竟这样更简单,不需要设置每个区间的颜色变化,效果如下:

Alt

波纹改进

很明显,用 repeating-radial-gradient 实现的波纹不能满足我们的要求,因为:

  • 样图波纹线条宽度是越来越宽的,而用 repeating-radial-gradient 实现的波纹线条都是均匀等宽的;
  • 样图波纹靠近边缘的弧度是完整的,而用 repeating-radial-gradient 实现的波纹很明显边缘有被切割的效果;

所以,放弃repeating-radial-gradient实现波纹,改用 radial-gradient 单独设置每个渐变区间,如下:

:root{
  --bg: radial-gradient(  at center bottom
  ,var(--color2) 0%,var(--color1) 2%
  ,var(--color1) 2%,var(--color1) 6%
  ,var(--color2) 6%,var(--color2) 8%
  ,var(--color1) 8%,var(--color1) 12%
  ,var(--color2) 12%,var(--color2) 15%
  ,var(--color1) 15%,var(--color1) 19%
  ,var(--color2) 19%,var(--color2) 23%
  ,var(--color1) 23%,var(--color1) 28%
  ,var(--color2) 28%,var(--color2) 32%
  ,var(--color1) 32%,var(--color1) 37%
  ,var(--color2) 37%,var(--color2) 42%
  ,var(--color1) 42%,var(--color1) 48%
  ,var(--color2) 48%,var(--color2) 54%
  ,var(--color1) 54%,var(--color1) 61%
  ,var(--color2) 61%,var(--color2) 70%
  ,var(--color1) 70%,var(--color1) 100%);
}

body{
  background: var(--bg);
  background-size: 100px 50px;
}

image.png

扇形波纹

观察样图可以得知,每个波纹并不是半圆,而是一个钝角的扇形,那怎么实现一个扇形的径向渐变呢?要知道css的 radial-gradient是不支持设置角度的。

有了!底部两个各画个三角形遮盖住一部分波纹不就好了,因为要和背景融合,三角形背景色设置为波纹的缝隙颜色,即图里的浅蓝色。

Alt

三角形用 linear-gradien 线性渐变实现,注意设置background-image的顺序,三角形要写在前面,才能覆盖住波纹。(其实如果三角形写在最后,也可以通过设置混合模式呈现扇形波纹的效果,例如在我的例子中可以谁lighten变亮混合模式)

//写法一:推荐
:root{
  --bg: linear-gradient(30deg,var(--color1) 0,var(--color1) 30%,transparent 30%)
  ,linear-gradient(-30deg,var(--color1) 0,var(--color1) 30%,transparent 30%)
  ,radial-gradient(  at center bottom
  ,var(--color2) 0%,var(--color1) 2%
  ,var(--color1) 2%,var(--color1) 6%
  ,var(--color2) 6%,var(--color2) 8%
  ,var(--color1) 8%,var(--color1) 12%
  ,var(--color2) 12%,var(--color2) 15%
  ,var(--color1) 15%,var(--color1) 19%
  ,var(--color2) 19%,var(--color2) 23%
  ,var(--color1) 23%,var(--color1) 28%
  ,var(--color2) 28%,var(--color2) 32%
  ,var(--color1) 32%,var(--color1) 37%
  ,var(--color2) 37%,var(--color2) 42%
  ,var(--color1) 42%,var(--color1) 48%
  ,var(--color2) 48%,var(--color2) 54%
  ,var(--color1) 54%,var(--color1) 61%
  ,var(--color2) 61%,var(--color2) 70%
  ,var(--color1) 70%,var(--color1) 100%);
}

body{
  background: var(--bg);
  background-size: 100px 50px;
}

//写法二
:root{
  --bg: radial-gradient(  at center bottom
  ,var(--color2) 0%,var(--color1) 2%
  ,var(--color1) 2%,var(--color1) 6%
  ,var(--color2) 6%,var(--color2) 8%
  ,var(--color1) 8%,var(--color1) 12%
  ,var(--color2) 12%,var(--color2) 15%
  ,var(--color1) 15%,var(--color1) 19%
  ,var(--color2) 19%,var(--color2) 23%
  ,var(--color1) 23%,var(--color1) 28%
  ,var(--color2) 28%,var(--color2) 32%
  ,var(--color1) 32%,var(--color1) 37%
  ,var(--color2) 37%,var(--color2) 42%
  ,var(--color1) 42%,var(--color1) 48%
  ,var(--color2) 48%,var(--color2) 54%
  ,var(--color1) 54%,var(--color1) 61%
  ,var(--color2) 61%,var(--color2) 70%
  ,var(--color1) 70%,var(--color1) 100%)
  ,linear-gradient(30deg,var(--color1) 0,var(--color1) 30%,transparent 30%)
  ,linear-gradient(-30deg,var(--color1) 0,var(--color1) 30%,transparent 30%);
}

body{
  background: var(--bg);
  background-size: 100px 50px;
  background-blend-mode: lighten;
}

Alt

构图分析

实现一组扇形波纹后,观察样图可以得知:

只需要两组扇形波纹错误叠加,即可实现祥云纹理的效果

image.png

:before 伪元素 给原来的图像上再覆盖一层相同的图案,并设置背景位置 background-position 为 “一个扇形波纹的宽/2,一个扇形波纹的高/2”,

我们把一些关键参数抽离成css变量,例如每个图元的宽高,波纹渐变的两个颜色,背景图层。

:root{
      --w: 100px;
      --h: 50px;
      --color1: #707dda;
      --color2: #09135e;
      --bg: 同上;
}
    
body{      
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background: var(--bg);
  background-size: var(--w) var(--h);
}
body::before{
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100vh;
  --color1: #707dda;
  --color2: #09135e;
  width: 100%;
  height: 100vh;
  background: var(--bg);
  background-size: var(--w) var(--h);
  background-position: calc(var(--w) / 2) calc(var(--h) / 2);
}

效果如下:

Alt

最终实现

在上一步用两组扇形波纹层叠后,你发现怎么没有效果,因为这时候图像的混合模式是默认的覆盖,伪元素的图层把body的背景给覆盖了,所以看不到下面的图层。

这时候最关键的一步来了,我们要利用混合模式将body的背景和伪元素的背景融合。那选用哪个混合模式呢?

思考一下即可得出答案:因为波纹的主体线条颜色是深蓝色,背景色是浅蓝色,混合后需要将下层图层(即body背景)中的波纹线条显示出来,所以要保留深色,答案就是可以选用darken变暗混合模式或者multiply正片叠底

设置darken变暗混合模式的效果:

image.png

设置multiply正片叠底的效果:

image.png

🎁 说在最后

本文实现祥云纹理主要利用了渐变色函数以及图层混合模式,其中的要点在于处理好每个波纹图元的样式以及设置合理的混合模式。

在上一章节实现过程中,实际开发顺序其实是以下顺序,只是为了行文流畅,调换了下顺序:

初步分析 -〉构图分析 -> 扇形波纹 -> 波纹改进 ->最终实现

我是喜欢归纳总结前端相关知识的前端阿彬,尽力持续输出原创优质文章,欢迎点赞关注😘

Alt

往期文章
# 🥳🥳🥳 “钉钉官网首页的炫酷动效” 被我用css新特性轻松破解啦~
# 🐿 CSS魔术师Houdini,用浏览器引擎实现高级CSS效果
# ⛳前端进阶:SEO 全方位解决方案
# 我给自己搭建的前端导航网站,你们都别用🤪
# 2023 最新最细 vite+vue3+ts 多页面项目架构,建议收藏备用!
# 2023 前端性能优化清单

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

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

相关文章

科技云报道:分布式存储红海中,看天翼云HBlock如何突围?

科技云报道原创。 过去十年,随着技术的颠覆性创新和新应用场景的大量涌现,企业IT架构出现了稳态和敏态的混合化趋势。 在持续产生海量数据的同时,这些新应用、新场景在基础设施层也普遍基于敏态的分布式架构构建,从而对存储技术…

GE D20 EME 10BASE-T电源模块产品特点

GE D20 EME 10BASE-T 电源模块通常是工业自动化和控制系统中的一个关键组件,用于为系统中的各种设备和模块提供电源。以下是可能包括在 GE D20 EME 10BASE-T 电源模块中的一些产品特点: 电源输出:D20 EME 模块通常提供一个或多个电源输出通道…

laravel框架 - 语言包的安装和配置

1, 查找 laravel框架语言包地址: \根目录\resources\lang\ 默认有个 en 语言包 2,下载 和 安装 下载地址:https://packagist.org/ 搜索 laravel/lang 参考网址:https://packagist.org/packages/overtrue/laravel-lang 选择你…

Python运维脚本:提高工作效率

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Pandas数据清理

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 介绍 如果您喜欢数据科学,那么数据清理对您来说可能听起来像是一个熟悉的术语。如果没有,让我向你解释一下。我们的数据通常来自多个资源,并不干净。它可能包含缺失值、重复项、错误…

视频gif怎么制作?一招教你视频制作gif

gif动画图片是当下表达情感的一种流行方式。想要将一个有趣的视频制作成一个gif动态图片的时候,要怎么操作呢?很简单,通过使用gif动态图片制作(https://www.gif.cn/)工具,上传MP4格式的视频,一键…

无涯教程-JavaScript - COSH函数

描述 COSH函数返回数字的双曲余弦值。 语法 COSH (number)争论 Argument描述Required/OptionalNumberAny real number for which you want to find the hyperbolic cosine.Required Notes 双曲余弦的公式为- $$COSH\left(z\right)\frac {e ^ 2 e ^ {-2}} {2} $$ 适用性…

查看栈内存 调试方法

一、Memory窗口 1、打开此窗口,查看运行时内存数据 2、栈顶、栈底 输入 esp ebp,就可确定此函数栈的大小 在地址处,输入esp, 跳到此栈的栈顶 ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指…

微服务的艺术:构建可扩展和弹性的分布式应用

文章目录 什么是微服务架构?微服务的设计原则1. 基于业务边界划分服务2. 松耦合和强内聚3. 自动化测试和部署4. 监控和日志5. 弹性设计 微服务的实施细节1. 服务发现示例代码:使用Consul进行服务发现 2. 负载均衡示例代码:Nginx配置负载均衡 …

Qt5开发及实例V2.0-第一章Qt概述

Qt5开发及实例V2.0-第一章-Qt概述 第一章-Qt概述1.1 什么是Qt1.2 Qt 5的安装1.2.1 下载安装Qt 51.2.2 运行Qt 5 Creator1.2.3 Qt 5开发环境 1.3 Qt 5开发步骤及实例1.3.1 设计器Qt 5 Designer实现1.3.2 代码实现简单实例 L1.2 Qt 5安装:概念解析L1.3 Qt 5开发步骤及…

66、Spring Data JPA 的基本功能--CRUD 和 分页

Spring Data JPA 的基本功能–CRUD 和 分页 ★ Spring Data JPA开发 (1)配置数据源。 (2)配置JPA相关属性,这些属性由JpaProperties类负责处理。——上面2步都在application.properties中配置即可。 (3&a…

电脑提示丢失MSVCP140.dll是什么意思,总结5个MSVCP140.dll丢失的解决分享

在计算机使用过程中,有时候会出现一些异常情况,比如丢失 MSVCP140.dll 文件。MSVCP140.dll 是 Microsoft Visual C 2015 Redistributable 的一部分,它包含了一些在 C 编程时需要的函数和类。许多程序和游戏都需要依赖这个文件来正常运行。一旦…

通过RSYNC在linux和windows间同步文件

通过RSYNC在linux和windows间同步文件 下载windows版本rsync下载后是一个zip的压缩包,直接解压就可使用配置windows到linux的秘钥拷贝公钥文件到linux服务器,实现免密配置同步命令结合windows计划任务实现定时同步文件 下载windows版本rsync 下载链接 h…

无涯教程-JavaScript - OFFSET函数

描述 OFFSET函数返回对范围的引用,该范围是一个单元格或单元格范围中指定的行数和列数。 返回的引用可以是单个单元格或单元格范围。您可以指定要返回的行数和列数。 语法 OFFSET (reference, rows, cols, [height], [width]) 争论 Argument描述Required/OptionalReferenc…

Amazon Lightsail——兼具亚马逊云科技的强大功能与 VPS 的简易性

对于开发者而言,当你想构建系统架构时,你的面前就出现了两种选择,选择一:花时间去亲手挑选每个亚马逊云科技组件(云服务器、存储、IP 地址等),然后自己组装起来;选择二是只需要一个预…

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps:我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1的整数,通俗来讲就是提供了一种可以表示任意大整数的方法,当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候,会出错。所以此时我们需要使用Big…

亚马逊小家电出口美国、欧盟、日本需要做什么认证?

海关总署统计数据显示,2023年1-6月,中国家电出口172893.1万台,同比增长1.4%,出口额2967亿元,同比增长5.2%。据奥维云网数据显示,2023年1-6月厨房小家电(包含品类:咖啡机、电饭煲、电…

Python脚本批量造数据、跑定时任务协助测试

目录 批量造数据 结合pythonpytestfixture 实现定时任务接口调用 目录结构 定时任务 批量造数据 连接Mysql的信息 1 import pymysql2 # 数据库连接信息3 # 多个库要有多个conn4 conn pymysql.connect(5 host"主机",6 user"用户名",7 pas…

【Redis】Redis 的学习教程(十)之使用 Redis 实现消息队列

消息队列需要满足的要求: 顺序一致:要保证消息发送的顺序和消费的顺序是一致的,不一致的话可能会导致业务上的错误消息确认机制:对于一个已经被消费的消息(已经收到ACK)不能再次被消费消息持久化:要具有持久化的能力&…