如何用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,一经查实,立即删除!

相关文章

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

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

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…

USB枚举过程分析

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

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

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

如何制作自动更新程序?

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

包含JS交互的混淆出错

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

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

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

细数技术指标-[转载]

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

图论测试题(一)第一题:longest

第一题:longest 乌托邦有n个城市,某些城市之间有公路连接。任意两个城市都可以通过公路直接或者间接到达,并且任意两个城市之间有且仅有一条路径(What does this imply? A tree!)。 每条公路都有自己的长度&#xff0…

RTC实时时钟驱动

RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去。 RTC通过STRB/LDRB这两个ARM指令向CPU传送8位数据(BCD码)。数据包括秒&am…

计算机表格复制粘贴后不变,excel表格复制粘贴后格式不变

Excel使用过程中经常需要将一个表格内容复制粘贴到其他表格中去。如果原始表格设置了行高和列宽,选中要复制的区域复制后,当在其他表格选择一个单元格进行粘贴时,行高和列宽就都变了。下面介绍excel表格复制粘贴后格式不变的操作方法。excel表…

C++ Primer章课后编程问题

1、代码#include<iostream> int main() {using namespace std;int num1;int num2;int total0;cout << "请输入開始数字\n";cin >> num1;cout << "请输入结束数字\n";cin >> num2;for (num1; num1<num2; num1)total num1…

vs 常见问题汇总

vs添加对dll的引用 我们在使用vs进行开发调试的时候经常会遇到一个问题&#xff0c;就是当我们的主工程引用到其他工程更新的dll&#xff08;我们经常采用copy到工程目录的方法&#xff09;、亦或者当我们的多个工程引用到同一个dll文件的时候&#xff0c;我们怎么来配置&#…

斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...

▶有望推出四驱版本▶专利图已经曝光▶外观没有变化斯柯达柯珞克大家应该不会特别陌生&#xff0c;虽然它在前两个月才正式上市&#xff0c;不过作为一款合资的紧凑型SUV来说&#xff0c;它的关注度还是不错的。销量上&#xff0c;4月份交出了2668辆的成绩&#xff0c;虽然还不…

javascript实例——鼠标特效篇(包含2个实例)

鼠标是现在电脑的基本配置之一&#xff0c;也是最常用的输入命令的工具之一。本文将将一些与鼠标有关系的特效。 1、跟随鼠标移动的彩色星星 如题&#xff0c;会根据鼠标的移动而移动&#xff0c;并在鼠标周围随机来回移动&#xff0c;让人感觉在放大缩小。根据书上的代码做了一…

Perforce使用指南_forP4V

第一章 前言 Perforce SCM System是一款构建于可伸缩客户/服务器结构之上的软件配置管理工具。仅仅应用 TCP/IP&#xff0c;开发人员就能够通过多种Perforce客户端&#xff08;几种平台的GUI、WEB、或命令行&#xff09;访问 Perforce服务器。Perforce能够被快速和容易地部署…

曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台

1Cloudview1.5核心优势对于云计算而言&#xff0c;国产厂商也有着自己独到的云方案。曙光Cloudview云计算操作系统采用新一代云计算中心的全新的管理模型&#xff0c;充分考虑云计算中心的资源分配、业务运行和运维服务等各种管理要素&#xff0c;实现云计算中心的软硬件平台资…

直连测速服务器异常,求证! 网件R7800, Speedtest测速的怪现象,200M宽带+R7800者进...

本帖最后由 毛毛雨 于 2017-11-18 18:50 编辑宽带是联通FTTH 200M&#xff0c;标准千兆网线&#xff0c;千兆网卡。问题前的插曲&#xff1a;R7800刚到手&#xff0c;就迫不及待的换上了&#xff0c;结果&#xff0c;无论是路由器内置Speedtest册数&#xff0c;还是电脑端的Spe…

iOS socket

为什么80%的码农都做不了架构师&#xff1f;>>> #import "ViewController.h"interface ViewController ()<NSStreamDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>{NSInputStream *_inputStream;//对应输入流NSOutputS…

Macosx 安装 ionic 成功教程

2019独角兽企业重金招聘Python工程师标准>>> 一、首先介绍一下ionic ionic是一个用来开发混合手机应用的&#xff0c;开源的&#xff0c;免费的代码库。可以优化html、css和js的性能&#xff0c;构建高效的应用程序&#xff0c;而且还可以用于构建Sass和AngularJS的…