都给我用css画三角形,画更种各样的三角形。

495 阅读6分钟

用clip-path裁剪出三角形。现代css技巧。

哈喽哈喽,我是你们的金樽清酒。我们都知道,作为一个前端,css是必不可少的。css可以说是十分考验一个前端的功底,它就像一个魔术一样,给一个网站注入灵魂。相信大家都喜欢魔术的那种神秘的感觉,现在让我们也挥动手中的魔术棒,来一场酣畅淋漓的魔术吧。(声明:这是看大漠老师的小册学习的)

魔术的关键clip-path

我先了解一下clip-path这个属性吧。

截屏2024-12-15 16.49.32.png 简单的说,这个属性能让我们裁剪出我们需要的内容。我们只需要给出对应的参数即可。但是能,今天我们要用到的是clip-path的ploygon函数。

截屏2024-12-15 16.55.06.png

可以看到,用clip-path的ploygon函数,你只需要确定好所需图形的坐标,就能裁切出需要的图形。 举个例子。我要裁剪出一个三角形。那我只需要知道三个点的坐标。(0 50%),(0,100%),(100% 100%),以盒子的左上角为坐标原点。向左为x正方向,向下为y轴正方向。

截屏2024-12-15 17.00.13.png

.easy-angle{

width: 30vmin;

aspect-ratio: 1;

clip-path: polygon(50% 0 ,0 100%,100% 100%);

background-color: aqua;

}

这是css样式,html结构只有一个带类名的盒子。是不是很神奇,这样我们就裁切出来了一个三角形。解释一下vmin这个单位,取视口高度较小的那一个的百分比,也就是30vmin就是相对于视口宽度较小的那一个的百分之三十。aspect-ratio: 1;这个属性是宽高比。这样我嫩就定义了盒子的宽高。clip-path: polygon(50% 0 ,0 100%,100% 100%);这一行就是我们的裁剪属性啦。ok,理论形成,开始实践。大漠老师呀教我们呢画各种各样的三角形,也就是说带我们去找各种各样的坐标,抓住重点。

画各种各样的三角形

等腰三角形

  • 那我们要怎么裁剪一个等腰三角形呢?那肯定也是要找到三个点的坐标位置啦?就像上面那个例子,其实就是等腰三角形。最上面那个点的横坐标,就是底边长的一半。

  • 顶点不在元素的边上,有一定的距离。这个时候我们该怎么办呢?(还是一样,找到坐标点)

WechatIMG3.jpg 如图所示,我们不确定的点,就是这个A点,A点的坐标怎么确定,比如就上顶的距离是s,那么它的坐标就是(w/2 s/h)。

.triangle { 
--w: 300; 
--h: 300; 
--s: 30; 
width: calc(var(--w) * 1px); 
height: calc(var(--h) * 1px); 
clip-path: polygon(50% calc(var(--s) / var(--h) * 100%), 100% 100%, 0 100%);
}

我们可以用变量的形式,方便做后续的更改。

等边三角形

WechatIMG4.jpg

经过分析我们可以根据等边三角形的特性,得到p点的坐标点。然后确定三个点,裁剪出等边三角形。 大致代码如下所示

.triangle--equilateral { 
--w: 50; 
--a: 60deg; 
--h: calc(var(--w) * sqrt(3) / 2); /* 或者 calc(sin(var(--a)) * var(--w)) */ 
width: calc(var(--w) * 1vmin); 
aspect-ratio: 1; 
clip-path: polygon(50% calc((var(--w) - var(--h)) / var(--w) * 100%), 100% 100%, 0 100%); }

上述代码还可以优化,将计算出来的h作为元素的高

--w:50vmin;
--h:calc(var(--w) * sqrt(3) / 2);
width: var(--w); aspect-ratio: calc(1 / sqrt(3) * 2); /* 或 calc( 1 / sin(var(--a))) 或 calc(1 / cos(30deg))*/ 
clip-path: polygon(50% 0, 100% 100%, 0 100%);

或者用计算出来的高重置宽高比

.triangle { 
--w: 50vmin; 
--a: 60deg; 
width: var(--w); 
aspect-ratio: calc(1 / sqrt(3) * 2); /* 或 calc( 1 / sin(var(--a))) 或 calc(1 / cos(30deg))*/ 
clip-path: polygon(50% 0, 100% 100%, 0 100%); }

截屏2024-12-15 17.54.44.png 这样等边三角形就画完啦。

边框三角形

有时候我们需要完成一个三角形镂空的效果,像是一个三角形边框一样,这样我们该怎么去实现呢?

截屏2024-12-15 17.58.17.png 类似于这样的效果。(此图取自大漠的小册)

还是一样的我们需要去找点的坐标,然后用clip-path的ploygon去裁剪,那我们需要几个点呢?有人说外边三个,里面三个,所以是六个,不对,其实是八个点,还有点重重合,然后裁剪出一个封闭的图形。 所以大致就是外层四个点,内层四个点。

截屏2024-12-15 18.05.11.png

代码大致就是这样

.triangle--border { 
clip-path: polygon( /* 外部坐标点 */ P1, P2, P3, P1, /* p4 与 P1 重叠,P4 = P1 */ 
/* 内部坐标点 */ P5, P6, P7, P5 /* P8 与 P5 重叠, P8 = p5 */ )
}

那我们首先需要确定,边框的厚度,然后根据三角函数去计算各个点的坐标,用clip-path的ploygon裁剪即可。那我们怎么去计算呢。大漠老师的这张图就很生动的给了我们答案。已知b的值就能求到各个点的坐标了。例如p6点的坐标就是(p2-c,p2-a)

截屏2024-12-15 18.08.54.png 大致代码

.triangle--border {
--b: 25px; /* 控制边框厚度 */ 
--w: 50vmin; 
--p1: 50% 0;
--p2: 100% 100%; 
--p3: 0 100%; 
--p5: 50% var(--b); 
--p6: calc(var(--b) * cos(30deg)) calc(100% - var(--b) * sin(30deg)); 
--p7: calc(100% - var(--b) * cos(30deg)) calc(100% - var(--b) * sin(30deg)); 
width: var(--w); 
aspect-ratio: 1 / cos(30deg); 
clip-path: polygon( /* 外部的点 */ var(--p1), var(--p2), var(--p3), var(--p1), /* p4 = p1 */ var(--p5), var(--p6), var(--p7), var(--p5) ); }

截屏2024-12-15 18.15.10.png 这样一个边框三角形就完成啦。

圆角三角形

在很多的ui界面中,我们都能看到圆角三角形的影子,可以说运用的很广泛。

截屏2024-12-15 18.30.51.png (该图也来自大漠老师的demo) 比如左上角的收藏图标。那怎么去实现呢。其实可以利用ploygon函数的坐标可以超出这个特性,在裁剪的时候超出一点,104%。

截屏2024-12-15 18.33.12.png (这也是大漠老师的图解)

代码

.element { clip-path: polygon(0 0, 100% 0, 104% 0, 0% 104%); }

截屏2024-12-15 18.34.19.png

这样就可以裁剪出一个圆角三角形。别忘了让原始的div设置圆角属性哦。

总结

利用clip-path的ploygon方法,可以根据坐标点裁剪出我们想要的形状,然后我们可以根据三角函数,或一些魔法数字来裁剪出我们需要的三角形。(这篇文章是根据阅读大漠老师的小册的自我学习文章,感兴趣的可以看看大漠老师的小册,更加的详细)