只用一个 HTML 元素可以写出多少形状?——不规则图形篇(序)

news2024/12/28 4:53:31

上一篇章,我们的不规则图形篇发了之后,我一个朋友说我“良心发现”了,不提供新的知识点了,而是实实在在的一些案例直接丢给大家。

的确,前面的每一个篇章,我都有引入新的知识点

规划这个系列,起初计划是在不规则图形篇中把 clip-path 属性引入进来。但是,其中牵扯到了 SVG 的填充规则,想到我之后会再次做一份完整的 SVG 课程,于是我自作主张在上一篇章将其取消了。

然而,好多朋友都说我“夹带私货”,我冤枉啊/(ㄒoㄒ)/~~……这不,我今天就补上这个序章,把 clip-path 属性也加上了!


一、clip-path 基本语法

clip-path 属性使用裁剪方式创建元素的可显示区域区域内的部分显示区域外隐藏

1. <clip-source> 值

clip-source 属性使用 url() 引用 SVG 的元素。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
  <clipPath id="clipPath">
    <path d="M259.8,8.4l9.3,60.3c1.5,9.6,14.3,11.6,18.7,3l27.5-54.4c5.1-10.1,20.5-5.1,18.7,6.1l-9.8,60.2c-1.5,9.5,10.1,15.5,16.9,8.6l43-43.3c8-8.1,21.1,1.4,15.9,11.5l-27.9,54.2c-4.4,8.6,4.8,17.8,13.4,13.4l54.2-27.9c10.1-5.2,19.6,7.9,11.5,15.9l-43.3,43c-6.9,6.8-0.9,18.4,8.6,16.9l60.2-9.8c11.2-1.8,16.2,13.6,6.1,18.7l-54.4,27.5c-8.6,4.4-6.6,17.2,3,18.7l60.3,9.3c11.2,1.7,11.2,17.9,0,19.6l-60.3,9.3c-9.6,1.5-11.6,14.3-3,18.7l54.4,27.5c10.1,5.1,5.1,20.5-6.1,18.7l-60.2-9.8c-9.5-1.5-15.5,10.1-8.6,16.9l43.3,43c8.1,8-1.4,21.1-11.5,15.9l-54.2-27.9c-8.6-4.4-17.8,4.8-13.4,13.4l27.9,54.2c5.2,10.1-7.9,19.6-15.9,11.5l-43-43.3c-6.8-6.9-18.4-0.9-16.9,8.6l9.8,60.2c1.8,11.2-13.6,16.2-18.7,6.1l-27.5-54.4c-4.4-8.6-17.2-6.6-18.7,3l-9.3,60.3c-1.7,11.2-17.9,11.2-19.6,0l-9.3-60.3c-1.5-9.6-14.3-11.6-18.7-3l-27.5,54.4c-5.1,10.1-20.5,5.1-18.7-6.1l9.8-60.2c1.5-9.5-10.1-15.5-16.9-8.6l-43,43.3c-8,8.1-21.1-1.4-15.9-11.5l27.9-54.2c4.4-8.6-4.8-17.8-13.4-13.4l-54.2,27.9c-10.1,5.2-19.6-7.9-11.5-15.9l43.3-43c6.9-6.8,0.9-18.4-8.6-16.9L23.3,334c-11.2,1.8-16.2-13.6-6.1-18.7l54.4-27.5c8.6-4.4,6.6-17.2-3-18.7l-60.3-9.3c-11.2-1.7-11.2-17.9,0-19.6l60.3-9.3c9.6-1.5,11.6-14.3,3-18.7l-54.4-27.5c-10.1-5.1-5.1-20.5,6.1-18.7l60.2,9.8c9.5,1.5,15.5-10.1,8.6-16.9l-43.3-43c-8.1-8,1.4-21.1,11.5-15.9l54.2,27.9c8.6,4.4,17.8-4.8,13.4-13.4l-27.9-54.2c-5.2-10.1,7.9-19.6,15.9-11.5l43,43.3c6.8,6.9,18.4,0.9,16.9-8.6L166,23.3c-1.8-11.2,13.6-16.2,18.7-6.1l27.5,54.4c4.4,8.6,17.2,6.6,18.7-3l9.3-60.3C241.9-2.8,258.1-2.8,259.8,8.4z"/>
  </clipPath>
</svg>
<div></div>

可以看到,我们在 HTML 中插入一个 svg 元素一个 div 元素。设置 svg 元素视口为从左上角开始宽 500 且高 500 的范围,并在 svg 元素中声明一个 clipPath 标签,并在里面写入一个 path 标签。对于 path 标签中,我们使用 d 属性写了一个圆角二十角星路径

div {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  width: 500px;
  height: 500px;
  background: red;
  clip-path: url(#clipPath);
}

在 CSS 中,我们把 div 元素定位浏览器中央,控制 div 元素的宽度高度均为 500px,设置背景色红色

设置 clip-path 属性,在 url 方法中使用 ID 选择器定位了 svg 元素中 clipPath 标签的 id 属性。

可以看到,整个 div 元素只显示了圆角二十角星形状

2. <basic-shape> 值

basic-shape 是一种表现基础图形CSS 数据类型。

  • 当构建一个图形时,运用了 <basic-shape> 值的属性就会定义一个相关的盒模型

  • 基础图形使用的坐标系统即设置相关的盒模型左上角顶点原点,该坐标轴的 x 轴正方向y 轴正方向

  • 所有以百分比定义的长度将通过相关盒模型与使用的维度重定义

2.1 inset()

inset() 函数定义了一个矩形,其位于参考框每一边内侧的指定的距离处

<div></div>

我们的 HTML 只有一个 div 元素。然后 CSS 中继续直接模板中写属性。

width: 800px;
height: 600px;
background: red;
clip-path: inset(50px);

我们设置 div 宽度为 800px高度为 600px,设置背景色红色。然后直接设置 clip-path 属性的 inset 方法中传入一个 50px 的值。

得到一个普通的矩形,咋一看没有什么特别的。于是我们在浏览器开发者工具中查看该元素

我们可以看到,显示出来的矩形比原本我们设置的 div 元素的宽度高度每个方向小了 50px

我们在尝试给 inset 方法设置多个参数:

clip-path: inset(50px 25% 100px 100px);

直接给出通过浏览器开发者工具中查看的元素

可以看出来,是按照上右下左顺时针顺序设置向内的值。

我们继续,引入 round 关键字:

clip-path: inset(50px round 25px);

先看结果:

可以看到,显示矩形距离 div 容器边缘的距离都是 50px,然后显示矩形四个角都有一个 25px 圆角

一个大胆的想法诞生了:

clip-path: inset(50px 25% 100px 100px round 25px 50px 100px 200px);

直接看结果:

可以看到,按照上右下左顺时针顺序,显示矩形距离 div 容器边缘距离分别是 50px、25%、100px、100px,然后从显示矩形左上角开始,也是按照顺时针顺序,每一角圆角半径分别是 25px、50px、100px、200px

2.2 circle()

circle() 函数定义了一个圆形,使用半径位置来描述。

clip-path: circle(100px);

直接设置了一个值,看看效果:

果然,是在正中央显示一个半径为 100px 的圆形

我们再尝试控制一下圆形位置

clip-path: circle(500px at top left);

设置这个圆心位置为左上角

半径的设置中,还有两个关键词:

  • closest-side:使用从形状中心参照盒子最近边缘长度。对于圆形来说,这是任何维度中最近边缘

  • farthest-side:使用从形状中心参照盒子最远边缘长度。对于圆形来说,这是任何维度中最远边缘

clip-path: circle(closest-side at 40% 60%);

clip-path: circle(farthest-side at 40% 60%);

2.3 ellipse()

ellipse() 函数定义了一个椭圆,使用水平半径竖直半径和以及中心位置来描述。其语法和 circle() 函数几乎一样,只是多了一个半径

clip-path: ellipse(200px 150px);

clip-path: ellipse(400px 300px at top left);

clip-path: ellipse(closest-side closest-side at 40% 60%);

clip-path: ellipse(farthest-side farthest-side at 40% 60%);

clip-path: ellipse(farthest-side farthest-side);

2.4 polygon()

polygon() 函数通过提供一个或多个坐标对每一个坐标代表形状的一个顶点)来绘制多边形

clip-path: polygon(400px 0, 600px 200px, 450px 200px, 450px 600px, 350px 600px, 350px 200px, 200px 200px);

每个点是一对坐标值,用空格分隔。

每一个顶点坐标之间使用逗号分隔,理论上可以写出所有由全部直线构成的形状

2.5 path()

path() 函数接受 SVG 路径字符串作为参数,用于 CSS 形状运动路径模块绘制形状

clip-path: path('M0,250Q200,200,400,250T600,250V200L800,300L600,400V350 Q600,400,400,350T0,350Z');

看到 path 方法中的值,比较烧脑。

path() 函数中的字符串是 SVG 中 path 的 d 属性,其具体的语法不在这里展开了,将来我会制作一套详细的 SVG 教程,届时大家就完全明白了!

3. <geometry-box> 值

同 basic-shape 一起声明,它将为基本形状提供相应的参考框盒

  • margin-box:使用 margin box 作为引用框

  • border-box:使用 border box 作为引用框

  • padding-box:使用 padding box 作为引用框

  • content-box:使用 content box 作为引用框

  • fill-box:利用对象边界框object bounding box)作为引用框

  • stroke-box:使用笔触边界框stroke bounding box)作为引用框

  • view-box:使用最近的 SVG 视口viewport)作为引用框。如果 viewBox 属性被指定来为元素创建 SVG 视口引用框将会被定位坐标系原点引用框位于由 viewBox 属性建立的坐标系原点引用框尺寸用来设置 viewBox 属性的宽高值

这里就不设置具体的案例了,留给大家去测试吧!


二、云朵

上一个篇章的最后,我们在彩虹案例中写了一个小小的云朵,当时我们使用的是伪元素写的两个蛋形拼接而成的,感觉不太划算。那么,今天我们使用 clip-path 属性来写一个云朵吧!

clip-path: path('M250,400A100,50,0,1,1,200,200A150,100,0,1,1,500,200A270,100,0,1,1,550,400A100,50,0,1,1,250,400');

对于云朵,我们直接使用 path 方法,传入四个弧形即可完成。


三、二十角星

我们再来写一下上面的二十角星的形状吧!

clip-path: path('M259.8,8.4l9.3,60.3c1.5,9.6,14.3,11.6,18.7,3l27.5-54.4c5.1-10.1,20.5-5.1,18.7,6.1l-9.8,60.2c-1.5,9.5,10.1,15.5,16.9,8.6l43-43.3c8-8.1,21.1,1.4,15.9,11.5l-27.9,54.2c-4.4,8.6,4.8,17.8,13.4,13.4l54.2-27.9c10.1-5.2,19.6,7.9,11.5,15.9l-43.3,43c-6.9,6.8-0.9,18.4,8.6,16.9l60.2-9.8c11.2-1.8,16.2,13.6,6.1,18.7l-54.4,27.5c-8.6,4.4-6.6,17.2,3,18.7l60.3,9.3c11.2,1.7,11.2,17.9,0,19.6l-60.3,9.3c-9.6,1.5-11.6,14.3-3,18.7l54.4,27.5c10.1,5.1,5.1,20.5-6.1,18.7l-60.2-9.8c-9.5-1.5-15.5,10.1-8.6,16.9l43.3,43c8.1,8-1.4,21.1-11.5,15.9l-54.2-27.9c-8.6-4.4-17.8,4.8-13.4,13.4l27.9,54.2c5.2,10.1-7.9,19.6-15.9,11.5l-43-43.3c-6.8-6.9-18.4-0.9-16.9,8.6l9.8,60.2c1.8,11.2-13.6,16.2-18.7,6.1l-27.5-54.4c-4.4-8.6-17.2-6.6-18.7,3l-9.3,60.3c-1.7,11.2-17.9,11.2-19.6,0l-9.3-60.3c-1.5-9.6-14.3-11.6-18.7-3l-27.5,54.4c-5.1,10.1-20.5,5.1-18.7-6.1l9.8-60.2c1.5-9.5-10.1-15.5-16.9-8.6l-43,43.3c-8,8.1-21.1-1.4-15.9-11.5l27.9-54.2c4.4-8.6-4.8-17.8-13.4-13.4l-54.2,27.9c-10.1,5.2-19.6-7.9-11.5-15.9l43.3-43c6.9-6.8,0.9-18.4-8.6-16.9L23.3,334c-11.2,1.8-16.2-13.6-6.1-18.7l54.4-27.5c8.6-4.4,6.6-17.2-3-18.7l-60.3-9.3c-11.2-1.7-11.2-17.9,0-19.6l60.3-9.3c9.6-1.5,11.6-14.3,3-18.7l-54.4-27.5c-10.1-5.1-5.1-20.5,6.1-18.7l60.2,9.8c9.5,1.5,15.5-10.1,8.6-16.9l-43.3-43c-8.1-8,1.4-21.1,11.5-15.9l54.2,27.9c8.6,4.4,17.8-4.8,13.4-13.4l-27.9-54.2c-5.2-10.1,7.9-19.6,15.9-11.5l43,43.3c6.8,6.9,18.4,0.9,16.9-8.6L166,23.3c-1.8-11.2,13.6-16.2,18.7-6.1l27.5,54.4c4.4,8.6,17.2,6.6,18.7-3l9.3-60.3C241.9-2.8,258.1-2.8,259.8,8.4z');

直接复制上面的 clipPath 标签中的 path 标签中的 d 属性的值。

有没有发现?只要会 SVG 基本知识,要写各种形状,真的轻轻松松!

今天的干货应该合大家的胃口了吧!干货满满,诚意满满!

这里做个预告,完整的 SVG 课程,将会用图文视频讲解相结合的方式呈现出来,让我们拭目以待吧!

敬请期待我们本主题的最后一个篇章 —— 动画篇

关注“临界程序员”微信公众号,为您送上更多精彩内容!

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

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

相关文章

某系统接入网关任意文件读取漏洞

当你征服一座山峰时&#xff0c;它已经在你脚下了&#xff0c;你必须再找一座山峰去征服&#xff0c;否则&#xff0c;你只有下山&#xff0c;走下坡路了 漏洞描述 某系统接入网关存在任意文件读取漏洞&#xff0c;攻击者通过构造请求可以读取服务器任意文件 漏洞复现 访问…

“智能安全新防线:深信达软加密狗的全面防护功能解析“

在智能安全设备领域&#xff0c;深信达的CBS赛博锁以其独特的软加密狗技术&#xff0c;为设备提供了全面的安全保障。CBS赛博锁通过以下几个核心功能来保障智能设备的安全性&#xff1a; 1. **许可管理**&#xff1a;CBS赛博锁通过硬件唯一身份ID和许可授权管理&#xff0c;确保…

云匹面粉直供小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户信息管理&#xff0c;种植基地管理&#xff0c;云匹小麦采收管理&#xff0c;云匹面粉加工&#xff0c;面粉分类管理&#xff0c;云匹面粉管理&#xff0c;系统管理 微信端账号功能包括&#xff1…

Redis数据的持久化是如何做的?(面试版)

在Redis中提供了两种数据持久化的方式&#xff1a;RDB、AOF RDB快照 RDB全称Redis Database Backup file(Redis快照)&#xff0c;也被叫做Redis数据快照。简单来说就是创建快照来获取内存中某个时间点上的副本。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xf…

[java][代码]使用java在mongodb上传下载文件

建立java项目新建lib包&#xff0c;导入jar包 3.链接mongdo数据库代码 /** * 1.获取连接 * 2.上传文件 * 3.下载文件 * 4.删除文件 * */ public static GridFS GetMongoGridFS(){ List<ServerAddress> adds new ArrayList<>(); ServerAddress serverAddress new…

根据数据库设计开发一套通用的电子商务平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

如何从零开始在 Vue 3 项目中引入 Element Plus

如果想在 Vite 生成的 Vue 3 下项目中&#xff0c;从头开始使用 Element Plus UI 库&#xff0c;并成功展示到页面&#xff0c;可以按照如下步骤操作&#xff1a; 1. 创建 Vue 3 项目&#xff08;如果还没有&#xff09; 使用 vite 创建 npm create vitelatest my-vue-app -…

vue3 内置的特殊属性ref

Vue 3 中的数据绑定是通过模板语法实现的。开发者可以在模板中使用特殊的语法来绑定数据&#xff0c;例如使用双花括号 {{}} 来显示数据&#xff0c;或者使用 v-bind 指令来绑定属性。 当数据发生变化时&#xff0c;Vue 会自动更新绑定的数据在模板中的显示&#xff0c;实现页面…

CSS盒子模型【怪异盒模型、定位看这一篇就够了!!!】

目录 盒子模型 width和height属性 width属性 height属性 width和height的特性 边框属性 边框的三要素小属性 四个方向的边框的三要素小属性 边框应用场景-制作三角形 单独设置四个圆角 盒子水平居中 盒子模型占位计算 盒模型可视宽高 盒模型实际占位 box-sizing怪…

启动Application 报错:no mapping for GET /(已解决)

根据以上内容&#xff0c;帮助我顺利解决了此问题 自己的错误&#xff1a;因为我使用的是框架嘛&#xff0c;然后生成了一个SpringBoot项目后&#xff0c;resources下面就会有一个static的类&#xff0c;用于存放静态资源类&#xff0c;后面我把静态资源放在里面&#xff0c;但…

大脑可视化:多种方式实现fMRI的ROI的绘图

前言 在探索神经科学的深邃领域中&#xff0c;我们常常面临着如何将复杂的脑区数据以一种清晰、直观的方式呈现给同行和公众的挑战。随着功能性磁共振成像&#xff08;fMRI&#xff09;技术的发展&#xff0c;我们拥有了更多工具来揭示大脑的奥秘。本文旨在介绍一系列笔者学习的…

一键安装!系统之家Win7纯净版镜像文件:无捆绑软件!

今日系统之家小编给大家带来做到真正纯净的Win7纯净版系统&#xff0c;该版本系统将捆绑软件都删除了&#xff0c;系统特别干净&#xff0c;安装后整体操作体验感很好。系统运作速度也快&#xff0c;兼容性出色&#xff0c;也没有蓝屏问题的出现&#xff0c;时刻都能放心使用。…

数据结构学习:单链表

单链表简介 将线性表中的个元素分布在存储器的不同存储块&#xff0c;每个部分称为节点&#xff0c;通过地址或指针建立元素之间的联系。 节点的示意图如下&#xff0c; 节点的data域存放数据元素 ,而next域是一个指针&#xff0c;指针指向的直接后继所在的节点。 一个链表的…

sql-labs31-34关通关攻略

第三十一关 一.判断闭合 1“” 二.查询数据库 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()--http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()-- 三.查表 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,…

机器学习之 贝叶斯算法 及朴素贝叶斯分类器的代码实现(给我点赞的都发财,谢谢)

贝叶斯算法简介 贝叶斯算法是一种基于概率论的统计学方法&#xff0c;广泛应用于机器学习领域。它基于贝叶斯定理&#xff0c;用于计算后验概率。贝叶斯定理可以表述为&#xff1a; 其中&#xff1a; P(A∣B) 表示在事件 B 发生的情况下事件 A 发生的概率&#xff0c;称为后…

发现一个通用的滑块验证码缺口识别库 captcha-recognizer (两行代码识别滑块验证码缺口)

文章目录 前言安装与使用安装使用示例 识别效果展示总结 前言 滑块验证码缺口位置是滑块验证码验证的关键&#xff0c;在此本文介绍一个滑块验证码的通用识别库&#xff0c;基于深度学习实现通用的滑块验证码的识别。并封装为易用的Python库&#xff0c;传入图片即可识别出缺口…

学习笔记 韩顺平 零基础30天学会Java(2024.8.26)

P536 HMap阶段小结 P537 HMap底层机制 HashMap$Node&#xff08;$意思是一个内部类&#xff09;实现了Map$Entry&#xff0c;因此HashMap$Node的底层可以看成是Map$Entry&#xff08;对前面有关Entry那一节课的继续理解&#xff09; P538 HMap源码解读 P539 HMap扩容树化触发 P…

使用HTML实现贪吃蛇游戏

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>贪吃蛇游戏</title><style>canvas {…

【题解】【模拟】—— [CSP-J 2021] 小熊的果篮

【题解】【模拟】—— [CSP-J 2021] 小熊的果篮 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 思路1.数组模拟&#xff08;70分&#xff09;1.1.题意解析1.2.参考代码 思路2.双向链表模拟&#xff08;60分&am…

FastCGI简述

FastCGI (FCGI) 是一种协议&#xff0c;用于改善 Web 服务器和应用程序之间的通信效率。它是在 CGI&#xff08;Common Gateway Interface&#xff09;的基础上发展起来的&#xff0c;旨在解决 CGI 在处理大量并发请求时存在的性能问题。 CGI的由来 最早的Web服务器只能简单地…