返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么用CSS绘制各种形状
  • 391
分享到

怎么用CSS绘制各种形状

2024-04-02 19:04:59 391人浏览 安东尼
摘要

这篇文章主要为大家展示了“怎么用CSS绘制各种形状”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用CSS绘制各种形状”这篇文章吧。自适应的椭圆1.自适应的椭

这篇文章主要为大家展示了“怎么用CSS绘制各种形状”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用CSS绘制各种形状”这篇文章吧。

自适应的椭圆

1.自适应的椭圆

实现方式是通过border-radius这个属性;border-radius它可以单独指定水平和垂直半径。用 /  分隔这两个值。并且该属性的值不仅可以接受长度值,还能接收百分比的值。百分比的值会基于元素的尺寸进行解析,宽是水平半径的解析,高是垂直半径的解析。

所以可以把两个半径的值都设置成50%;

border-radius: 50% / 50%; 

最终的效果:

怎么用CSS绘制各种形状

2.半椭圆的实现

border-radius的值是可以分开设置的,用空格进行分开,甚至可以为四个角提供完全不同的水平和垂直的半径。

border-radius四个值的渲染顺序是从左上角开始,顺时针渲染;
当只给定3个值时,第四个值和第二个相等;
当给定两个值时,第三个值和***个值相等,第四个值和第二个值相等。

所以半椭圆的实现方法就是:

border-radius: 50% / 100% 100% 0 0; 

最终效果:

怎么用CSS绘制各种形状

同理的四分之一的椭圆的生成方法:

border-radius: 100% 0 0 0;

最终效果:

怎么用CSS绘制各种形状

平行四边形的实现

在生成平行四边形时,直接对当前对div使用transfORM: skew(-45deg);变形,会导致div里面的内容也会发生变形,就像下面这样:

怎么用CSS绘制各种形状

通用的解决办法是通过伪元素的方法,就是把所有的样式用到伪元素上,对伪元素进行变形,由于内容不在伪元素里,所以内容不会受到影响。具体的实现如下:

<div class="parallelogram">click</div>
.parallelogram {text-align: center;position: relative;
}.parallelogram::before {transform: skew(-45deg);position: absolute;left: 0;right: 0;top: 0;bottom: 0;z-index: -1;content: ' ';background: #fb3;
}

生成的效果如下:

怎么用CSS绘制各种形状

这种技巧不仅对于skew()变形来说有用,还适用于其他任何变形样式,当想变形任何一个元素而不想改变它的内容的时候都可以用到它。

菱形图片的生成

在css中,有些需求是要把图片裁剪成菱形,使用css可以很好的解决这个问题,为不需要预先把图片裁剪成菱形而影响后期的维护。

基于变形的方案

直接使用类似平行四边形的方式旋转,给img设置max-width:  100%,会导致图片被裁剪成八边形。因为100%会被解析成div的边长。所以解决这个问题的办法就是让图片的宽等于div这个容器的对角线的长度,比较好的办法就是把图片用scale放大根号2倍(大概是1.42倍),具体实现的代码如下:

<div class="picture"><img src="cat.jpg" /> </div>
.picture {width: 400px;height: 400px;transform: rotate(45deg);overflow: hidden;
}.picture1 > img {max-width: 100%;height: 400px;transform: rotate(-45deg) scale(1.42);
}

效果如下:

怎么用CSS绘制各种形状

scale和width放大的区别:scale的缩放图片是以它的中心点进行缩放的(在不指定transform-origin的前提下),通过width属性来放大图片时,只会以它左上角的原点进行缩放,然后用额外的负边距来调整图片的位置。

裁切路径方案上面的办法还需要前套一层多余的html标签,使用clip-path这个属性,这个原本是svg的属性,使用polyGon()这个多边形的函数,使用的百分比的值会解析为元素自身的尺寸。

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

clip-path这个属性还能参与动画,只要动画是在同一个形状函数之间进行的,而且点的数量是相同的就可以,比如我们希望鼠标hover时平滑的扩展为完成的面积,只需这样:

.picture {clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);transition: 1s clip-path;
}.picture:hover {clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}

切脚效果的实现

径向渐变的方式

实现一个角被切掉的效果,可以使用渐变,渐变接受一个角度作为方向,并且允许文字溢出并超出切角区域(因为它只是背景图案),具体实现如下:

div {  background: #58a;  background: linear-gradient(-45deg, transparent 15px, #58a 0);
}

效果如下:

怎么用CSS绘制各种形状

实现两个切角的办法:

div {width: 200px;height: 100px;background: #58a;background: linear-gradient(-45deg, transparent 15px, #58a 0) 
                right, linear-gradient(45deg, transparent 15px, #65a 
                 0) left;background-size: 50% 100%;background-repeat: no-repeat;
}

效果如下:
怎么用CSS绘制各种形状

同理的四个切角的实现:

div {width: 200px;height: 100px;background: #58a;background: linear-gradient(135deg, transparent 15px, #58a 0) top 
left, linear-gradient(-135deg, transparent 15px, #58a 0) top right, linear-gradient(-45deg, transparent 15px, #58a 0) bottom right, linear-gradient(45deg, transparent 15px, #58a 0) bottom left;background-size: 50% 50%;background-repeat: no-repeat;
}

效果如下:

怎么用CSS绘制各种形状

上面的代码可维护比较差,在改变切角和颜色时都要修改多处,所以我们可以使用scss的mixin来写:

@mixin beveled-corners($bg, $tl:0, $tr:$tl, $br:$tl, $bl:$tr) {
    background: $bg;
    background:
    linear-gradient(135deg, transparent $tl, $bg 0) top left,
    linear-gradient(225deg, transparent $tr, $bg 0) top right,
    linear-gradient(-45deg, transparent $br, $bg 0) bottom right,
    linear-gradient(45deg, transparent $bl, $bg 0) bottom left;
    background-size: 50% 50%;
    background-repeat: no-repeat;
}

调用时:

@include beveled-corners(#58a, 15px, 5px);

***生成的效果是左上角和右下角是15px的切角,右上角和左下角是5px的切角。上面的minxin设置了初值,当传入的值少于四个值时,就跟border-radius赋值一样。

一样的道理我们也可以创建弧形切角,至少改成径向渐变

div {width: 200px;height: 100px;background: #58a;background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left, radial-gradient(circle at top right, transparent 15px, #58a 0) top right, radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right, radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left;background-size: 50% 50%;background-repeat: no-repeat;
}

效果如下:
怎么用CSS绘制各种形状

内联SVG与border-image的方式

SVG 可以实现与尺寸完全无关的***缩放,当文本溢出的时候,则会起到普通边框的作用,令文字折行。具体的实现如下:

div {  width: 200px;  height: 100px;  border: 15px solid transparent;  border-image: 1 url('data:image/svg+xml,\<svg xmlns="Http://www.w3.org/2000/svg" width="3" height="3" fill="%2358a">\<polygon points="0,1 1,0 2,0 3,1 3,2 2,3 1,3 0,2"/>\</svg>');
}

效果如下:

怎么用CSS绘制各种形状

解决中间的背景色的填充可以给div块加一个和border一样的背景色:

div {width: 200px;height: 100px;border: 15px solid transparent;border-image: 1 url(data:image/svg+xml,\<svg xmlns="http://www.w3.org/2000/svg" width="3" heigh="3" fill="%2358a">\<polygon points="0,1 1,0 2,0 3,1 3,2 2,3 1,3 0,2"/>\</svg>);background: #58a;background-clip: padding-box;
}

裁切路径方案CSS 裁切路径最神奇的地方在于我们可以同时使用百分比数值(它会以元素自身的宽高作为基数度进行换算)和绝对长度值,从而提供巨大的灵活性。

如果用裁切路径将一个元素切出20px大小的斜面切角,具体的代码如下:

background: #58a;clip-path: polygon( 20px 0, calc(100% - 20px) 0, 100% 20px, 100% calc(100% - 20px), calc(100% - 20px) 100%, 20px 100%, 0 calc(100% - 20px), 0 20px);

这个方法***的好处:可以使用任意类型的背景,甚至可以对替换元素(比如图片)进行裁切
,并且支持动画效果。

缺点:当内边距不够宽时,它会裁切掉文本。

梯形标签页的实现

梯形的实现可以通过

div {position: relative;display: inline-block;padding: .5em 1em .35em;color: white;
}div::before {content: '';position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: -1;background: #58a;transform: scaleY(1.3) perspective(.5em) rotateX(5deg);transform-origin: bottom;
}

效果如下:

怎么用CSS绘制各种形状

变形效果会让这个元素以它自身的中心线为轴进行空间上的旋转,这会让它的尺寸很难控制,解决办法可以设置transform-origin:bottom;,当它在3D空间中旋转时,把它的底边固定。固定底边的同时,高度的缩水会变得更加显眼。为了解决这个问题,可以通过变形属性(scaleY())来改变它的尺寸。

同样的方法可以实现下面这种tab布局:

怎么用CSS绘制各种形状

具体代码如下:

nav > a {position: relative;display: inline-block;padding: .3em 1em 0;
}nav > a::before {content: '';position: absolute;top: 0; right: 0; bottom: 0; left: 0;z-index: -1;background: #ccc;background-image: linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,0));border: 1px solid rgba(0,0,0,.4);border-bottom: none;border-radius: .5em .5em 0 0;box-shadow: 0 .15em white inset;transform: perspective(.5em) rotateX(5deg);transform-origin: bottom;
}

通过把transform-origin改成bottom left或bottom right,就可以立即得到左侧倾斜或右侧倾斜的标签页。

这个方法的缺点是:斜边的角度依赖于元素的宽度。不过,对于宽度变化不大的多个元素(比如导航菜单)来说,这个方法还是非常管用的。

简单的饼图的绘制

思路是把圆形的左右两部分指定为上述两种颜色,然后用伪元素覆盖上去,通过旋转来决定露出多大的扇区。具体的代码如下:

.pie {width: 100px;height: 100px;border-radius: 50%;background: yellowgreen;background-image: linear-gradient(to right, transparent 50%, #655 0);.pie::before {
    content: '';display: block;margin-left: 50%;height: 100%;border-radius: 0 100% 100% 0 / 50%;background-color: inherit;transform-origin: left;
}

实现的效果如下:

怎么用CSS绘制各种形状

这种方式还支持动画,就可以用CSS动画来实现一个饼图从0 变化到100% 的动画,从而得到一个炫酷的进度指示器:

@keyframes spin {to { transform: rotate(.5turn); }
}
@keyframes bg {
    50% { background: #655; }
}.pie::before {content: '';display: block;margin-left: 50%;height: 100%;border-radius: 0 100% 100% 0 / 50%;background-color: inherit;transform-origin: left;animation: spin 3s linear infinite, bg 6s step-end infinite;
}

生成多个不同比率的静态饼图的办法,可以通过上面的那个动画的实现,需要设置动画处于暂停状态,然后设置负的动画延时直接跳转到动画中的任意时间点, 最终实现的代码如下:

<div class="pie" style="animation-delay: -20s"><span>20</span></div><div class="pie" style="animation-delay: -60s"><span>60</span></div>
.pie{position: relative;width: 100px;height: 100px;line-height: 100px;border-radius: 50%;background: yellowgreen;background-image: linear-gradient(to right, transparent 50%, #655 0);color: #000;text-align: center;
}

@keyframes spin {to { transform: rotate(.5turn); }
}
@keyframes bg {
    50% { background: #655; }
}.pie::before {content: '';position: absolute;top: 0; left: 50%;width: 50%; height: 100%;border-radius: 0 100% 100% 0 / 50%;background-color: inherit;transform-origin: left;animation: spin 50s linear infinite, bg 100s step-end infinite;animation-play-state: paused;animation-delay: inherit;
}.pie span {position: relative;z-index: 10;
}

效果如下:

怎么用CSS绘制各种形状

用SVG 解决方案

<svg viewBox="0 0 32 32"><circle r="16" cx="16" cy="16" /></svg>
svg {width: 100px; height: 100px;transform: rotate(-90deg);background: yellowgreen;border-radius: 50%;
}circle {fill: yellowgreen;stroke: #655;stroke-width: 32;stroke-dasharray: 38 100; }

让饼图的周长***接近100,就可以直接把比率的百分比值指定为strokedasharray的长度,不需要做任何计算了。因为周长是2&pi;r,半径就是100/22&pi;  &asymp;  15.915,最终把这个值取整为16。在SVG的viewBox属性中指定其尺寸,而不再使用width和height属性,这样就可以让它自动适应容器的大小了。

SVG的优点是„增加第三种颜色是非常容易的,并且可以用内联样式来指定颜色。

以上是“怎么用CSS绘制各种形状”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网VUE频道!

--结束END--

本文标题: 怎么用CSS绘制各种形状

本文链接: https://lsjlt.com/news/80638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用CSS绘制各种形状
    这篇文章主要为大家展示了“怎么用CSS绘制各种形状”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用CSS绘制各种形状”这篇文章吧。自适应的椭圆1.自适应的椭...
    99+
    2024-04-02
  • 怎么用纯css绘制各种图形
    本篇内容主要讲解“怎么用纯css绘制各种图形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用纯css绘制各种图形”吧!1、  向上三角形  CSS核心代码 ...
    99+
    2024-04-02
  • CSS怎么实现各种形状
    这篇文章给大家分享的是有关CSS怎么实现各种形状的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。CSS实现各种形状的方法:1、圆形在设置CSS时要设置宽度和高度相等,然后设置【border-radius】属性为宽度...
    99+
    2023-06-14
  • 怎么使用CSS实现各种奇形怪状按钮
    这篇文章主要介绍“怎么使用CSS实现各种奇形怪状按钮”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用CSS实现各种奇形怪状按钮”文章能帮助大家解决问题。先让我...
    99+
    2024-04-02
  • 怎么在Android中实现绘制各种图形
    怎么在Android中实现绘制各种图形?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先自定义一个View类,这个view类里面需要一个Paint对象来控制图形的属性,需要...
    99+
    2023-05-30
    android
  • Matplotlib实现各种条形图绘制
    目录1. 条形图的绘制2. 横向条形图3. 分组条形图4. 堆叠条形图5. 条形图应用场景1. 条形图的绘制 plt.bar 方法有以下常用参数: x :一个数组或者列表,代表需要绘...
    99+
    2024-04-02
  • CSS怎么绘制图形
    这篇文章主要介绍了CSS怎么绘制图形的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS怎么绘制图形文章都会有所收获,下面我们一起来看看吧。正方形/长方形<!DOCTYPE html>&l...
    99+
    2023-06-27
  • CSS怎么绘制心形
    这篇文章主要介绍“CSS怎么绘制心形”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS怎么绘制心形”文章能帮助大家解决问题。具体代码:<!DOCTYPE html><h...
    99+
    2023-06-27
  • 怎么用CSS绘制三角形
    本篇内容介绍了“怎么用CSS绘制三角形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用 border 绘...
    99+
    2024-04-02
  • CSS怎么绘制三角形
    本篇文章给大家分享的是有关CSS怎么绘制三角形,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、绘制方法画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及...
    99+
    2023-06-15
  • C#怎么绘制指定的形状
    这篇文章主要讲解了“C#怎么绘制指定的形状”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么绘制指定的形状”吧!以下实例创建了 Shape 基类,并创建派生类 Circle、 Recta...
    99+
    2023-06-17
  • html5-Canvas如何在web中绘制各种图形
    这篇文章将为大家详细讲解有关html5-Canvas如何在web中绘制各种图形,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在html5中...
    99+
    2024-04-02
  • Python中怎么绘制各种曲线
    本篇文章为大家展示了 Python中怎么绘制各种曲线,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python 代码如下:import numpy as np ...
    99+
    2023-06-15
  • HTML5中怎么用Canvas绘制各种线条
    本篇内容介绍了“HTML5中怎么用Canvas绘制各种线条”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 使用Css怎么绘制一个扇形
    今天就跟大家聊聊有关使用Css怎么绘制一个扇形,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。span {    @if $...
    99+
    2023-06-08
  • 怎么用HTML5+CSS3绘制锯齿状的矩形
    这篇文章主要讲解了“怎么用HTML5+CSS3绘制锯齿状的矩形”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用HTML5+CSS3绘制锯齿状的矩形”吧!...
    99+
    2024-04-02
  • 【Matplotlib】一文带你掌握Matplotlib绘制各种图形
    文章目录 前言一、折线图1 - 单线2 - 多线 二、柱状图(条形图)1 - 单柱2 - 多柱3 - 堆叠4 - 条形 三、直方图四、箱型图1 - 单个2 - 多个 五、散点图1 ...
    99+
    2023-09-03
    matplotlib 机器学习 数据分析
  • Python matplotlib怎么绘制各种流线图
    本篇内容介绍了“Python matplotlib怎么绘制各种流线图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!流线图概述什么是...
    99+
    2023-06-21
  • 怎样利用CSS绘制三角形
    这篇文章给大家分享的是有关怎样利用CSS绘制三角形的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在一些面经中,经常能看到有关 CSS 的题目都会有一道如何使用 CSS 绘制三角形,而经常的回答通常也只有使用 bo...
    99+
    2023-06-15
  • 怎么使用CSS代码绘制三角形
    本篇内容主要讲解“怎么使用CSS代码绘制三角形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用CSS代码绘制三角形”吧!1、绘制方法画出三角形的原理是调整border(边框)的四个方向的宽...
    99+
    2023-07-05
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作