如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制

自小编上次整理了一些基础图形的绘制方法之后,大家都纷纷表示对css3的绘图技巧学习很有帮助。虽说万变不离其宗,再复杂的图形也可以用最简单的三角形或者圆弧组合出来,但仍有不少朋友反映,学会基本图形也不懂得怎样组合,也不知道什么时候用伪元素比较合适。所以今天小编来一篇相对复杂的图形绘制教程,大家看过之后就会发现,很多看似复杂的图形(比如下图这样的),换一下组合方式就会变得简单很多。

f1a13ab6bf4c2b147d3909f771156c19.png

如果你觉得以上图形无从下手,或者觉得需要用很多个html元素来完成的话,那相信本教程对你的帮助会非常大。

现在我们先来编写基础的html代码:

08c7786659bc9d7416c57c6886ee100a.png

后面我们只要往里面填充样式和元素即可测试效果。

我们先来看一个比较简单的形状,鸡蛋。可别小看它,想当年达芬奇光画这个鸡蛋都练了不知道多少年,所以大家也来学画蛋吧,以后当上一名CSS3画家。

f8653092af092d734c6d30cf156f7898.png

上次我们学习了绘制椭圆的方法,乍一看似乎在椭圆基础上进行修改即可获得正确的效果。但之所以能绘制出椭圆,其原因在于border-radius使用了百分比,而在一个角里面,x和y的百分比始终相等。

举个例子,一个矩形的宽度为30px,高度为40px,如果我们让一个角的圆角半径等于50%,那么圆角在x方向上的半径等于15px,y方向上的半径等于20px,若为40%,则x方向半径等于12px,y方向半径等于16px,x和y的比例始终等于矩形的宽高比3:4。所以,你希望x方向上的半径等于15px,y方向上的半径等于30px,那用上次的方法是绝对不可能做到的。

对于这个蛋来说,我们不难发现x方向上的圆角半径都刚好等于宽度的一半,也就是50%,但是y方向就不一样了,上面两个角的半径明显大于下面两个角。假设上面的圆角半径是60%,那么下面的圆角半径就是40%了,这样就可以确保圆角之间没有直线连接。

那么问题来了,我们要实现的就是左上角的圆角半径在x方向上等于50%,在y方向上等于60%,又该怎样实现呢?

这里小编给大家介绍圆角半径的另一个用法——通过斜杠分开x和y方向的圆角半径。

border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

其中,/前面的部分代表x方向上的4个半径,顺序依次为左上,右上,右下,左下(从左上顺时针排下来即可),自然而然地就会想到/后面的部分就代表y方向上的4个半径,顺序跟x方向的一样。可见左上和右上的半径都是60%,而左下和右下则均为40%。

下面给出完整的代码,HTML部分就一个div

d993840b8de58ca3c25c7123f471becb.png

CSS代码如下:

.egg{

display:block;

width:126px;

height:180px;

background-color:red;

-webkit-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

-moz-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

-o-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

}

接下来我们看看下面的这个图形,非常经典的吃豆豆游戏主角。

d909d35afa1741932300360767881b94.png

学过基本图形绘制的朋友可能会想到用三角形擦除一个圆形来得到上图的形状。嗯,这确实是一个方法,但局限性相当明显,因为CSS3不存在真正意义上的擦除。所谓的“擦除”,仅仅是用跟背景一样的颜色进行填充而已,如果背景图不是透明的话,那这种做法就白搭了。

这里我们换个思路,首先我们知道画三角形用的是很粗的边框,然后利用转角处的交界线生成三角形。

0fc1f591af30df178e9bb666eea764ba.png

所以第一步,我们先让整个div的宽高等于0,然后设置很粗的边框。

HTML代码:

8ad5d33a3a08cf82ad8ffb0c18c5a790.png

CSS代码:

.pacman{

width:0px;

height:0px;

border:60px solid red;

}

效果如下图所示,显示出来的是一个正方形,但实际上它没有宽高,都是边框在撑着。

4ecfb3e352c541c5f4c09437c8dd2311.png

根据前面介绍的原理,这个“正方形”其实是4个三角形拼接的结果。

69d8cb0f3deb689dc4756bca94b0d687.png

这样的话,我们自然而然地就想到隐藏掉右侧的边框线,尝试设置为0。

由于4条边不对等了,所以我们拆分一下。

.pacman{

width:0px;

height:0px;

border-right:0 solid red;

border-top:60px solid red;

border-left:60px solid red;

border-bottom:60px solid red;

}

运行效果如下图所示:

885eeb7e02951cde259de74e762a64f0.png

由于失去了右边线的支撑,右侧全部被截没了,看来60px还得保留,但是又不能显示出来,怎么办?你可能会想到用跟背景一样的颜色来模拟隐藏,但更好的方法是设置为transparent(透明),这样才会让图形适用于所有背景(包括图片背景)。

.pacman{

width:0px;

height:0px;

border-right:60px solid transparent;

border-top:60px solidred;

border-left:60px solidred;

border-bottom:60px solidred;

}

再次运行,效果就对了:

c5a9e078906eeb1c5fdc8e759f65d9e5.png

这时候,貌似把直角换成圆角就能得到正确的效果,我们不妨试试,圆角半径就等于边框的粗细。

.pacman{

/*其它样式代码省略*/

-webkit-border-radius:60px;

-moz-border-radius:60px;

-o-border-radius:60px;

border-radius:60px;

}

运行效果如下图所示,果然正确了:

e1bd14884af3d88cb32ba79800c16096.png

最后我们来看看这个。天哪,数一数,12个三角形,伪元素怎么塞都塞不进啊。

92ee7cdf0032d97c6906f54752ba1b6e.png

CSS3初学者会很容易被复杂的表象所迷惑,这往往是因为制作者在图形结构分析方面的经验不足,无法找出多个“元素”之间的内在联系进行重组。听起来好像很玄乎,那么,小编就画一个“线稿”给大家看一下吧。

d30db7658695235a9dcaedde0f6cce09.png

哈哈,这样是不是就恍然大悟了呢?12个角,竟然就是3个旋转角度不同的正方形重叠所得。这样的话,总的元素数量也就3个。加上before和after伪元素的支持,这么“复杂”的图形也就只需一个HTML元素就能搞定。

正方形每旋转90度就重合一次,所以3个元素分下来,就是一个元素不旋转,然后一个旋转30度,一个旋转60度。而旋转可以通过CSS3的transform属性轻松实现。

HTML代码如下:

e561d5dbbe7a09c107c647d0d9efbc93.png

然后用CSS定义基本形状,它不旋转:

.burst-12{

background:red;

width:80px;

height:80px;

position:relative;

text-align:center;

}

3个元素需要重叠,因此要设置相对定位。

然后,两个伪元素的形状跟burst-12完全一致,不同的只是要绝对定位,所以before和after伪元素可以一起定义。

.burst-12:before,.burst-12:after{

content:"";

position:absolute;

top:0;

left:0;

height:80px;

width:80px;

background:red;

}

最后,我们让before旋转30度,after旋转60度,效果就完成了。

.burst-12:before{

-webkit-transform:rotate(30deg);

-moz-transform:rotate(30deg);

-ms-transform:rotate(30deg);

-o-transform:rotate(30deg);

}

.burst-12:after{

-webkit-transform:rotate(60deg);

-moz-transform:rotate(60deg);

-ms-transform:rotate(60deg);

-o-transform:rotate(60deg);

}

小编相信,只要用心学习,技术再菜的童鞋也能照着教程把里面的图形全部绘制出来。然而要是换成其它图形,我想还是会有人说画不出来,或者要绕很大一个圈子才能做得到。这也是情理之中的事情,毕竟这当中的技巧没有一般的规律可循,更多的是经验的积累。所以要在实战用运用自如,除了熟悉一些常用的手法之外,还要多参考成功的案例,从中获取更多的灵感。

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

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

相关文章

基于C++中常见内存错误的总结

在系统开发过程中出现的bug相对而言是比较好解决的,花费在这个上面的调试代价不是很大,但是在系统集成后的bug往往是难以定位的bug(最好方式是打桩,通过打桩可以初步锁定出错的位置,如:进入函数前打印日志&…

UWP开发细节记录:判断文件类型

StorageFile.ContentType 属性,是 string 类型,用来表示文件内容的 MIME 类型。例如,音乐文件可能有 "audio/mpeg" MIME 类型。(MSDN) MIME 类型的定义可以下面的链接找到: MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android。时间仓促,有翻译问题请留言指出,谢谢创建Lisst和Cards在你的应用程序创建复杂的清单,并与材料设计风格卡。您能够使用RecyclerView和CardView部件。 创建RecyclerView …

计算机考研自命题院校双非,计算机考研408——951211院校汇总

众所周知,计算机考研408计算机学科基础综合难度与一些顶尖985自命题相比也是不落下风的,号称最难工科专业课(请忽略912这种殿堂级别的),难度大、知识点庞杂也是前些年众多高校纷纷脱离408统考的原因。19年的计算机类考研火到爆炸,…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓捣Docker,- - ! 报错: serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 转载于:https://www.cnblo…

新手学Struts(一)----JSP+Servlet讲解MVC实现原理

MVC基本原理一个简单的例子改良的例子Struts基本流程的实现最近在学SSH(Struts HibernateSpring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊…

中国首台千万亿次超级计算机,中国首台千万亿次超级计算机首批设备开始试用...

新华社天津1月13日电(记者 周润健 罗捷)记者13日从国家超级计算天津中心获悉,中国首台千万亿次超级计算机“天河一号”首批设备调试工作结束,具备向客户提供服务的条件,“天河一号”…

Outlook Express 错误代码表

错误码 意义 一般 0x800C01310x800C013E 可能是 Folders.dbx 档案属性错误或损坏. 0x800CCC00 身份验证(Authentication)未载入 0x800CCC01 认证(Certificate)内容错误 0x800CCC02 认证日期错误 0x800CCC03 使用者已联机 0x800CCC…

USB设备枚举过程

(1)集线器检测新设备 (集线器的英文称为“Hub”)主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D都有一个…

windows下apache+php+mysql 环境配置方法

转自:http://www.jb51.net/article/30128.htm 一 准备 1 下载apache http://httpd.apache.org/download.cgi#apache24 httpd-2.2.22-win32-x86-openssl-0.9.8t.msiopenssl表示带有openssl模块,利用openssl可给Apache配置SSL安全链接 2 下载php http://wi…

计算机工作原理 公开课,《计算机的基本工作原理》公开课材料(11页)-原创力文档...

《计算机系统的组成》教学设计教师:吴军一、学习者分析初一的学生,具有活泼好动的特点,怀着对初中生活的憧憬来到一个新的环境里,对每样事物都充满着好奇,都想去探个究竟。随着社会的进步, 计算机的使用范围…

USB枚举过程分析

1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就…

linux -- read(), write()

read()函数 2011-03-23 16:28:37| 分类&#xff1a; linux | 标签&#xff1a; |字号大中小 订阅 read函数从打开的设备或文件中读取数据。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值&#xff1a;成功返回读取的字节数&…

jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别

jQuery为开发插件提拱了两个方法&#xff0c;分别是&#xff1a; jQuery.fn.extend();jQuery.extend(); 虽然 javascript 没有明确的类的概念&#xff0c;但是用类来理解它&#xff0c;会更方便。 jQuery便是一个封装得非常好的类&#xff0c;比如我们用 语句 $("#btn1&…

CATia对计算机配置要求,【2人回答】求CATIA对电脑的详细配置要求-3D溜溜网

回答&#xff1a;1、内存要求在32G和64G之间。2、硬盘要求选择7200转机械硬盘&#xff0c;4k以上分辨&#xff0c;就选择SSD固态硬盘。3、CPU要求睿频在4.1GHZ以上&#xff0c;核心在6和8核之间。4、显卡要求显存在6GB和11GB之间&#xff0c;位宽要求在192bit和384bit之间。5、…

如何制作自动更新程序?

原文出自&#xff1a;http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自动更新程序&#xff1f; [版权所有 邱秋 2014 metaphysisyeah.net, 转载请注明出处] 最近为单位写了一个C/S结构的软件&#xff0c;这个软件是工作在单位的局域网内的。为了减轻为程序…

包含JS交互的混淆出错

2019独角兽企业重金招聘Python工程师标准>>> 小上司离职&#xff0c;我接手他负责的项目&#xff0c;进行版本更新的时候&#xff0c;在生成jar包测试的时候&#xff0c;点击按钮没有反应&#xff0c;页面是webview&#xff0c;按钮则是与js交互&#xff0c;logcat打…

计算机常用代码大全,常用电脑命令大全【图文】

导语 &#xff1a;电脑&#xff0c;这个在前几年貌似还离我们非常遥远的词汇&#xff0c;现在随着信息化社会的不断发展&#xff0c;已经走进了我们的千家万户。现在每一家新 装修 &#xff0c;它都作为一种必备的家用电器来使用。由此可见电脑对我们 现代 人的重要性。但电脑毕…

细数技术指标-[转载]

技术指标类别庞杂&#xff0c;要一一学全&#xff0c;基本不可能&#xff0c;也没有这个必要。我们只要掌握几个常用的指标&#xff0c;了解它们的原理&#xff0c;从而举一反三&#xff0c;就足够了。其实任何一种技术指标都是从形态、价格、量、时间这四项出发的&#xff0c;…

[javaSE] 看博客学习java并发编程

共享性 多线程操作同一个数据&#xff0c;产生线程安全问题 新建一个类ShareData 设计一个int 型的成员变量count 设计一个成员方法addCount()&#xff0c;把count变量 在main函数中开启多个线程操作这个成员变量&#xff0c;在main函数里 获取ShareData对象&#xff0c;new 出…