整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS3绘制腾讯QQ企鹅

CSS3绘制腾讯QQ企鹅

者:Junting

来源:掘金

开始着手于QQ 企鹅的绘制, 第一步基本框架的绘制。

通过对Logo图像的观察,按照层次划分来组合最终的效果。选择使用绝对位置position:absolute;来布局各个元素。主要划分为头部,身体,围脖,双手,双脚。

对前端有兴趣或者正在学习web前端的小伙伴,可以私信小编【学习】即可免费领取2018最新的一整套系统web前端学习教程!

 <!-- QQ Logo box -->
 <div id="qq">
 <!-- 头 -->
 <div class="head"></div>
 <!-- 身体 -->
 <div class="body"></div>
 <!-- 手 -->
 <div class="handWrapper"></div>
 <!-- 脚 -->
 <div class="footWrapper"></div>
 </div>

基本框架结构就是这样的,QQ 对于容器是通过绝对定位来对每个元素布局进行设置的。

QQ Logo容器(画板):

/**
 * QQ Logo 绘制
 */
#qq {
 position: relative;
 margin: 0 auto;
 width: 420px;
 height: 400px;
 outline: gold solid 2px;
}

骨架出来了,那我们就开始一步步的进行绘制了,先从头开始:

绘制 head 前,还是跟步骤1一样,先对 head 的层次结构划分清楚,依次为:左眼、右眼、上嘴唇、下嘴唇、嘴唇的层次感体现

 <!-- 头 -->
<div class="head">
 <!-- 左眼 -->
 <div class="left eye"></div>
 <!-- 右眼 -->
 <div class="right eye"></div>
 <!-- 上嘴唇 -->
 <div class="mouthTopContainer"></div>
 <!-- 下嘴唇 -->
 <div class="mouthBottomContainer"></div>
 <!-- 嘴唇上下层次感 -->
 <div class="lispContainer"></div>
 </div>

绘制 head 的轮廓:

 /* QQ head */
.head {
 position: absolute;
 top: 18px;
 left: 96px;
 width: 234px;
 height: 185px;
 border: 1px solid #000;
 /* 通过对border-radius 圆弧的层度来进行钩画 */
 border-top-left-radius: 117px 117px;
 border-top-right-radius: 117px 117px;
 border-bottom-left-radius: 117px 68px;
 border-bottom-right-radius: 117px 68px;
}

图中为什么圆弧是设置成 border-bottom-left-radius: 117px 68px; 一般根据设计图出来后导出转成带有标尺图后,会自动计算出值;如果没有的话,那就要通过计算了。

然后依次绘制 head 其他结构:

眼睛

/* 眼睛 */
.eye {
 position: absolute;
 width: 44px;
 height: 66px;
 border:1px solid #000;
 border-radius: 50% 50%;
}
.left.eye {
 left: 62px;
 top: 50px;
}
.right.eye {
 left: 132px;
 top: 50px;
}

/* QQ head -> mouth */
.mouthTopContainer {
 position: absolute;
 top: 120px;
	left: 39px;
 width: 158px;
 height: 29px;
 border: 1px solid #000;
}
.mouthBottomContainer {
 position: absolute;
 top: 146px;
	left: 39px;
 width: 158px;
 height: 15px;
 border: 1px solid #000;
}

到这里基本头的骨架就出来,然后就是对头的骨架结构的线条进行修饰,现在太丑了,对吧!

眼睛

<!-- 左眼 -->
<div class="left eye">
 <!-- 眼球 -->
 <div class="innerLeftEye"></div>
 </div>
 <!-- 右眼 -->
 <div class="right eye">
 <!-- 眼球 -->
 <div class="innerRightEye">
 <!-- 月牙眼球两端圆弧修饰 -->
 <div class="fix"></div>
 </div>
</div>
/* QQ head -> eye */
.eye {
 position: absolute;
 width: 44px;
 height: 66px;
 border:1px solid #000;
 border-radius: 50% 50%;
}
.left.eye {
 left: 62px;
 top: 50px;
}
.right.eye {
 left: 132px;
 top: 50px;
}
.innerLeftEye {
 position: absolute;
 top: 20px;
 left: 20px;
 width: 18px;
 height: 24px;
 border-radius: 50%;
 border: 1px solid #000;
}
.innerLeftEye::after {
 content: "";
 position: absolute;
 top: 6px;
 left: 9px;
 width: 6px;
 height: 8px;
 border: 1px solid #000;
 border-radius: 50%;
}
.innerRightEye {
 position: absolute;
 top: 20px;
 left: 8px;
 /* 月牙眼球外轮廓 */
 width: 18px;
 height: 24px;
 border: 1px solid #000;
 border-top-left-radius: 50% 90%;
 border-top-right-radius: 50% 90%;
 border-bottom-left-radius: 50% 10%;
 border-bottom-right-radius: 50% 10%;
}
.innerRightEye::after {
 content: "";
 position: absolute;
 bottom: -1px;
	left: 4px;
 /* 月牙眼球内部轮廓 */
 width: 10px;
 height: 13px;
 border: 1px solid #000;
 border-top-left-radius: 50% 100%;
	border-top-right-radius: 35% 80%;
}
.fix {
 position: absolute;
 top: 17px;
 width: 4px;
 height: 4px;
 border: 1px solid #000;
 border-radius: 50%;
}
.fix:after{
	content: "";
 position: absolute;
 top: 0;
	left: 14px;
	width: 4px;
 height: 4px;
 border: 1px solid #000;
	border-radius: 50%;
}

<!-- 上嘴唇 -->
<div class="mouthTopContainer">
 <div class="mouthTop"></div>
</div>
<!-- 下嘴唇-->
<div class="mouthBottomContainer">
 <div class="mouthBottom"></div>
</div>
<!-- 嘴唇上下层次感-咬合部位 -->
<div class="lispContainer">
 <div class="lips">
 <div class="lipShadow left">
 </div>
 <div class="lipShadow right">
 </div>
 </div>
</div>
/* QQ head -> mouth */
.mouthTopContainer {
 /* 定位 */
 position: absolute;
 top: 120px;
	left: 39px;
 width: 158px;
 height: 29px;
 overflow: hidden; /* 隐藏超出部分 */
}
.mouthTop {
 /* 上嘴唇轮廓 */
 position: absolute;
 top: 0;
	left: 0;
 width: 158px;
 height: 34px;
 border: 1px solid #000;
 border-top-left-radius: 45% 34px;
	border-top-right-radius: 45% 34px;
}
.mouthBottomContainer {
 position: absolute;
 top: 146px;
	left: 39px;
 width: 158px;
 height: 15px;
 overflow: hidden; /* 隐藏超出部分 */
}
.mouthBottom {
 position: absolute;
 top: -4px;
	left: 0;
 width: 158px;
 height: 24px;
 border: 1px solid #000;
 border-top:none;
 border-bottom-left-radius: 45% 24px;
	border-bottom-right-radius: 45% 24px;
}
/* 嘴唇上下层次感-咬合部位 */
.lispContainer {
 /* 定位 */
 position: absolute;
	top: 146px;
	left: 60px;
 width: 116px;
 height: 24px;
}
.lips {
 position: absolute;
	top: 0;
	left: 0;
 width: 116px;
 height: 24px;
 border: 1px solid #FFA600;
 border-bottom-left-radius: 50% 100%;
	border-bottom-right-radius: 50% 100%;
}

基本 head 轮廓就是这样了,最后在把右眼眼球部分上个色,来进行层叠覆盖隐藏

.innerRightEye {
 position: absolute;
 top: 20px;
 left: 8px;
 /* 月牙眼球外轮廓 */
 width: 18px;
 height: 24px;
 /* border: 1px solid #000; */
 border-top-left-radius: 50% 90%;
 border-top-right-radius: 50% 90%;
 border-bottom-left-radius: 50% 10%;
 border-bottom-right-radius: 50% 10%;
 background: black;
	box-shadow: 0 -1px 2px black;
}
.innerRightEye::after {
 content: "";
 position: absolute;
 bottom: -1px;
	left: 4px;
 /* 月牙眼球内部轮廓 */
 width: 10px;
 height: 13px;
 /* border: 1px solid #000; */
 border-top-left-radius: 50% 100%;
 border-top-right-radius: 35% 80%;
 background: white;
}
.fix {
 position: absolute;
 top: 19px;
 width: 4px;
 height: 4px;
 /* border: 1px solid #000; */
 border-radius: 50%;
 background: black;
}
.fix:after{
	content: "";
 position: absolute;
 top: 0;
	left: 14px;
	width: 4px;
 height: 4px;
 /* border: 1px solid #000; */
 border-radius: 50%;
 background: black;
}

接下来 开始绘制 QQ 的 body 部分,老样子对 body 进行层次结构划分:围巾、围巾尾、内轮廓、外轮廓

<!-- 身体 -->
<div class="body">
 <!-- 内轮廓 -->
 <div class="innerWrapper">
 <div class="inner"></div>
 </div>
 <!-- 外轮廓 -->
 <div class="outerWrapper">
 <div class="outer"></div>
 </div>
 <!-- 围巾 -->
 <div class="scarf"></div>
 <!-- 围巾尾 -->
 <div class="scarfEnd"></div>
</div>

先各个容器位置布局好

/* QQ body */
.body {
 /* body 容器定位 */
 position: absolute;
 top: 135px;
 left: 48px;
 width: 326px;
 height: 300px;
 /* border: 1px solid #000; */
}
/* QQ body -> scarf */
.scarf {
 position: absolute;
 top: -2px;
 left: 34px;
 width: 258px;
 height: 110px;
 border: 1px solid #000;
 border-top: none;
}
/* QQ body -> scarfEnd */
.scarfEnd {
 position: absolute;
 left: 74px;
 top: 90px;
	width: 52px;
 height: 64px;
 border: 3px solid black;
}
/* QQ body -> innerWrapper */
.innerWrapper {
 /* innerWrapper 容器定位 */
 position: absolute;
 left: 30px;
	top: 76px;
 width: 280px;
 height: 200px;
 border: 1px solid #000;
}
/* QQ body -> outerWrapper */
.outerWrapper{
 /* outerWrapper 容器定位 */
 position: absolute;
	top: 54px;
	overflow: hidden;
 width: 262px;
	left: 32px;
 height: 250px;
 border: 1px solid #000;
}

轮廓线条修正

/* QQ body */
.body {
 /* body 容器定位 */
 position: absolute;
 top: 135px;
 left: 48px;
 width: 326px;
 height: 300px;
 /* border: 1px solid #000; */
}
/* QQ body -> scarf */
.scarf {
 position: absolute;
 top: -2px;
 left: 34px;
 width: 258px;
 height: 110px;
 border: 1px solid #000;
 border-top-left-radius: 30px 34px;
	border-top-right-radius: 38px 34px;
	border-bottom-left-radius: 50% 76px;
 border-bottom-right-radius: 50% 76px;
 border-top: none;
}
/* QQ body -> scarfEnd */
.scarfEnd {
 position: absolute;
 left: 74px;
 top: 90px;
	width: 52px;
 height: 64px;
 border: 3px solid black;
 border-bottom-left-radius: 50% 43%;
	border-bottom-right-radius: 15px;
	border-top-left-radius: 20% 57%;
}
/* QQ body -> innerWrapper */
.innerWrapper {
 /* innerWrapper 容器定位 */
 position: absolute;
 left: 30px;
	top: 76px;
 width: 280px;
 height: 200px;
 overflow: hidden;
}
.inner {
 position: absolute;
 left: 25px;
	top: -71px;
	width: 218px;
	height: 210px;
 border: 1px solid #000;
 border-radius: 50%;
}
/* QQ body -> outerWrapper */
.outerWrapper{
 /* outerWrapper 容器定位 */
 position: absolute;
	top: 54px;
	overflow: hidden;
 width: 262px;
	left: 32px;
 height: 250px;
}
.outer{
 position: absolute;
	top: -84px;
	width: 260px;
 height: 250px;
 border: 1px solid #000;
	border-radius: 125px;
}

大致轮廓基本已经出来了,还有一些内部线条,等后面在来慢慢绘制。

接下来我们来绘制 hand 部分,安装老路子层次结构划分:左手、右手; 手的样子需要通过两个 div 进行整合才能绘制出来,所以再次划分: 左手上、左手下、右手上、右手下

<!-- 手 -->
<div class="handWrapper">
 <div class="leftHandTopContainer">
 <div class="leftHandTop"></div>
 </div>
 <div class="leftHandBottomContainer">
 <div class="leftHandBottom"></div>
 </div>
 <div class="rightHandTopContainer">
 <div class="rightHandTop"></div>
 </div>
 <div class="rightHandBottomContainer">
 <div class="rightHandBottom"></div>
 </div>
</div>
/* QQ handWrapper */
.handWrapper{
 /* 定位手的起始点 */
	position: absolute;
	top: 219px;
	left: 7px;
}
/* QQ handWrapper -left */
.leftHandTopContainer {
 /* 定位 */
	position: absolute;
	top: 55px;
	left: 50px;
 width: 118px;
 height: 26px;
 border: 1px solid #000;
	transform-origin: bottom left;
	transform: rotate(-70deg);
}
.leftHandBottomContainer {
 /* 定位 */
 position: absolute;
	top: 78px;
	left: 50px;
	width: 100px;
 height: 30px;
 border: 1px solid #000;
	transform-origin: top left;
	transform: rotate(-70deg);
}
/* QQ handWrapper -right */
.rightHandTopContainer {
 /* 定位 */
 position: absolute;
	top: 47px;
	left: 240px;
 width: 118px;
 height: 34px;
 border: 1px solid #000;
	transform-origin: bottom right;
 transform: rotate(65deg);
}
.rightHandBottomContainer{
 /* 定位 */
 position: absolute;
	top: 81px;
 left: 248px;
	width: 110px;
	height: 58px;
 border: 1px solid #000;
	transform-origin: top right;
	transform: rotate(90deg);
}

线条轮廓修改

/* QQ handWrapper */
.handWrapper{
 /* 定位手的起始点 */
	position: absolute;
	top: 219px;
	left: 7px;
}
/* QQ handWrapper -left */
.leftHandTopContainer {
 /* 定位 */
	position: absolute;
	top: 55px;
	left: 50px;
 width: 118px;
 height: 26px;
 /* border: 1px solid #000; */
	transform-origin: bottom left;
 transform: rotate(-70deg);
 overflow: hidden;
}
.leftHandTop {
 /* 上半部分 */
	width: 128px;
	height: 54px;
 border: 1px solid #050346;
 border-top-left-radius: 44% 38px;
 border-top-right-radius: 56% 33px;
}
.leftHandBottomContainer {
 /* 定位 */
 position: absolute;
	top: 78px;
	left: 50px;
	width: 100px;
 height: 30px;
 /* border: 1px solid #000; */
	transform-origin: top left;
 transform: rotate(-70deg);
 overflow: hidden;
}
.leftHandBottom {
 position: absolute;
 top: -26px;
 width: 128px;
	height: 44px;
 border: 1px solid #050346;
 border-bottom-left-radius: 48% 20px;
	border-bottom-right-radius: 52% 23px;
}
/* QQ handWrapper -right */
.rightHandTopContainer {
 /* 定位 */
 position: absolute;
	top: 47px;
	left: 240px;
 width: 118px;
 height: 34px;
 /* border: 1px solid #000; */
	transform-origin: bottom right;
 transform: rotate(65deg);
 overflow: hidden;
}
.rightHandTop {
 position: absolute;
 left: -30px;
 width: 148px;
	height: 54px;
 border: 1px solid #050346;
 border-top-right-radius: 41% 54px;
 border-top-left-radius: 59% 48px;
}
.rightHandBottomContainer{
 /* 定位 */
 position: absolute;
	top: 81px;
 left: 248px;
	width: 110px;
	height: 58px;
 /* border: 1px solid #000; */
	transform-origin: top right;
 transform: rotate(90deg);
 overflow: hidden;
}
.rightHandBottom {
 position: absolute;
	top: 1px;
	left: 38px;
 width: 68px;
	height: 28px;
 border: 1px solid #000;
 border-bottom-right-radius: 100% 40px;
}

是不是漂亮很多了, 那快点把脚的部分也完成吧,和手的结构基本类似。

<!-- 脚 -->
<div class="footWrapper">
 <div class="leftFootTopWrapper">
 <div class="leftFootTop"></div>
 </div>
 <div class="leftFootBottomWrapper">
 <div class="leftFootBottom"></div>
 </div>
 <div class="rightFootTopWrapper">
 <div class="rightFootTop"></div>
 </div>
 <div class="rightFootBottomWrapper">
 <div class="rightFootBottom"></div>
 </div>
</div>

基础位置布局

/* QQ footerWrapper */
.footWrapper{
 /* 定位起始点 */
	position: absolute;
	top: 292px;
 left: 80px;
 width: 300px;
 height: 80px;
 border: 1px solid #000;
}
/* QQ footerWrapper -> left */
.leftFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 16px;
	left: -1px;
 width: 130px;
 height: 37px;
 border: 1px solid #000;
}
.leftFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: -1px;
	width: 130px;
	height: 38px;
 border: 1px solid #000;
}
/* QQ footerWrapper -> right */
.rightFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 22px;
	left: 134px;
 width: 130px;
 height: 38px;
 border: 1px solid #000;
}
.rightFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: 134px;
	width: 134px;
 height: 38px;
 border: 1px solid #000;
}

轮廓调整

/* QQ footerWrapper */
.footWrapper{
 /* 定位起始点 */
	position: absolute;
	top: 292px;
 left: 80px;
 width: 300px;
 height: 80px;
 /* border: 1px solid #000; */
}
/* QQ footerWrapper -> left */
.leftFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 16px;
	left: -1px;
 width: 130px;
 height: 37px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootTop {
 position: absolute;
	top: -10px;
 left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-left-radius: 80% 70%;
}
.leftFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: -1px;
	width: 130px;
	height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 44%;
	border-top-right-radius: 50% 44%;
	border-bottom-left-radius: 50% 56%;
	border-bottom-right-radius: 50% 56%;
}
/* QQ footerWrapper -> right */
.rightFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 22px;
	left: 134px;
 width: 130px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootTop {
 position: absolute;
 top: 0px;
	left: 4px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-right-radius: 32% 65%;
}
.rightFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: 134px;
	width: 134px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 56%;
	border-top-right-radius: 50% 56%;
	border-bottom-left-radius: 50% 44%;
	border-bottom-right-radius: 50% 44%;
}

基本整体框架结构就出来了,开始上色吧。上色的过程可以帮助我们调整z-index,也就是各个模块的重叠层次,遮盖了一些无用的线条和框角。

  1. head 开始
 /* QQ head */
.head {
 position: absolute;
 top: 18px;
 left: 96px;
 width: 234px;
 height: 185px;
 border: 1px solid #000;
 border-top-left-radius: 117px 117px;
 border-top-right-radius: 117px 117px;
 border-bottom-left-radius: 117px 68px;
 border-bottom-right-radius: 117px 68px;
 background: #000;
}
/* QQ head -> eye */
.eye {
 position: absolute;
 width: 44px;
 height: 66px;
 border:1px solid #000;
 border-radius: 50% 50%;
 background: #fff;
}
.left.eye {
 left: 62px;
 top: 50px;
}
.right.eye {
 left: 132px;
 top: 50px;
}
.innerLeftEye {
 position: absolute;
 top: 20px;
 left: 20px;
 width: 18px;
 height: 24px;
 border-radius: 50%;
 border: 1px solid #000;
 background: #000;
}
.innerLeftEye::after {
 content: "";
 position: absolute;
 top: 6px;
 left: 9px;
 width: 6px;
 z-index: 11;
 height: 8px;
 /* border: 1px solid #000; */
 border-radius: 50%;
 background: #fff;
}
.innerRightEye {
 position: absolute;
 top: 20px;
 left: 8px;
 /* 月牙眼球外轮廓 */
 width: 18px;
 height: 24px;
 /* border: 1px solid #000; */
 border-top-left-radius: 50% 90%;
 border-top-right-radius: 50% 90%;
 border-bottom-left-radius: 50% 10%;
 border-bottom-right-radius: 50% 10%;
 background: black;
 box-shadow: 0 -1px 2px black;
}
.innerRightEye::after {
 content: "";
 position: absolute;
 bottom: -1px;
	left: 4px;
 /* 月牙眼球内部轮廓 */
 width: 10px;
 height: 13px;
 /* border: 1px solid #000; */
 border-top-left-radius: 50% 100%;
 border-top-right-radius: 35% 80%;
 background: #FFF;
}
.fix {
 position: absolute;
 top: 19px;
 width: 4px;
 height: 4px;
 /* border: 1px solid #000; */
 border-radius: 50%;
 background: #000;
}
.fix:after{
	content: "";
 position: absolute;
 top: 0;
	left: 14px;
	width: 4px;
 height: 4px;
 /* border: 1px solid #000; */
 border-radius: 50%;
 background: black;
}
/* QQ head -> mouth */
.mouthTopContainer {
 /* 定位 */
 position: absolute;
 top: 120px;
 left: 39px;
 z-index: 1;
 width: 158px;
 height: 29px;
 overflow: hidden; /* 隐藏超出部分 */
}
.mouthTop {
 /* 上嘴唇轮廓 */
 position: absolute;
 top: 0;
 left: 0;
 z-index: 1;
 width: 158px;
 height: 34px;
 border: 1px solid #FFA600;
 border-top-left-radius: 45% 34px;
 border-top-right-radius: 45% 34px;
 background: #FFA600;
}
.mouthBottomContainer {
 position: absolute;
 top: 146px;
 left: 39px;
 z-index: 1;
 width: 158px;
 height: 15px;
 overflow: hidden; /* 隐藏超出部分 */
}
.mouthBottom {
 position: absolute;
 top: -4px;
 left: 0;
 z-index: 1;
 width: 158px;
 height: 24px;
 border: 1px solid #FFA600;
 border-top:none;
 border-bottom-left-radius: 45% 24px;
 border-bottom-right-radius: 45% 24px;
 background: #FFA600;
}
/* 嘴唇上下层次感-咬合部位 */
.lispContainer {
 /* 定位 */
 position: absolute;
	top: 146px;
	left: 60px;
 width: 116px;
 height: 24px;
}
.lips {
 position: absolute;
	top: 0;
	left: 0;
 width: 116px;
 height: 24px;
 border: 1px solid #FFA600;
 border-bottom-left-radius: 50% 100%;
 border-bottom-right-radius: 50% 100%;
 background: #FFA600;
}

  1. body
/* QQ body */
.body {
 /* body 容器定位 */
 position: absolute;
 top: 135px;
 left: 48px;
 width: 326px;
 height: 300px;
 /* border: 1px solid #000; */
}
/* QQ body -> scarf */
.scarf {
 position: absolute;
 top: -2px;
 left: 34px;
 z-index: 5;
 width: 258px;
 height: 110px;
 border: 1px solid #000;
 border-top-left-radius: 30px 34px;
	border-top-right-radius: 38px 34px;
	border-bottom-left-radius: 50% 76px;
 border-bottom-right-radius: 50% 76px;
 border-top: none;
 background: #FB0009;
}
/* QQ body -> scarfEnd */
.scarfEnd {
 position: absolute;
 left: 74px;
 top: 90px;
	width: 52px;
 height: 64px;
 border: 3px solid black;
 border-bottom-left-radius: 50% 43%;
	border-bottom-right-radius: 15px;
 border-top-left-radius: 20% 57%;
 background: #FB0009;
}
/* QQ body -> innerWrapper */
.innerWrapper {
 /* innerWrapper 容器定位 */
 position: absolute;
 left: 30px;
	top: 76px;
 width: 280px;
 height: 200px;
 overflow: hidden;
}
.inner {
 position: absolute;
 left: 25px;
	top: -71px;
	width: 218px;
	height: 210px;
 border: 1px solid #000;
 border-radius: 50%;
 background: #fff;
}
/* QQ body -> outerWrapper */
.outerWrapper{
 /* outerWrapper 容器定位 */
 position: absolute;
	top: 54px;
	overflow: hidden;
 width: 262px;
	left: 32px;
 height: 250px;
}
.outer{
 position: absolute;
	top: -84px;
	width: 260px;
 height: 250px;
 border: 1px solid #000;
 border-radius: 125px;
 background: #000;
}

上色后你会发现,有的图层显示先后顺序不对,需要调整下先后顺序。

  • head > body
  • body里(scafEnd > inner > outer)

  1. hand
/* QQ handWrapper -left */
.leftHandTopContainer {
 /* 定位 */
	position: absolute;
	top: 55px;
	left: 50px;
 width: 118px;
 height: 26px;
 /* border: 1px solid #000; */
	transform-origin: bottom left;
 transform: rotate(-70deg);
 overflow: hidden;
}
.leftHandTop {
 /* 上半部分 */
	width: 128px;
	height: 54px;
 border: 1px solid #050346;
 border-top-left-radius: 44% 38px;
 border-top-right-radius: 56% 33px;
 background: #000;
}
.leftHandBottomContainer {
 /* 定位 */
 position: absolute;
	top: 78px;
	left: 50px;
	width: 100px;
 height: 30px;
 /* border: 1px solid #000; */
	transform-origin: top left;
 transform: rotate(-70deg);
 overflow: hidden;
}
.leftHandBottom {
 position: absolute;
 top: -26px;
 width: 128px;
	height: 44px;
 border: 1px solid #050346;
 border-bottom-left-radius: 48% 20px;
 border-bottom-right-radius: 52% 23px;
 background: #000;
}
/* QQ handWrapper -right */
.rightHandTopContainer {
 /* 定位 */
 position: absolute;
	top: 47px;
	left: 240px;
 width: 118px;
 height: 34px;
 /* border: 1px solid #000; */
	transform-origin: bottom right;
 transform: rotate(65deg);
 overflow: hidden;
}
.rightHandTop {
 position: absolute;
 left: -30px;
 width: 148px;
	height: 54px;
 border: 1px solid #050346;
 border-top-right-radius: 41% 54px;
 border-top-left-radius: 59% 48px;
 background: #000;
}
.rightHandBottomContainer{
 /* 定位 */
 position: absolute;
	top: 81px;
 left: 248px;
	width: 110px;
	height: 58px;
 /* border: 1px solid #000; */
	transform-origin: top right;
 transform: rotate(90deg);
 overflow: hidden;
}
.rightHandBottom {
 position: absolute;
	top: 1px;
	left: 38px;
 width: 68px;
	height: 28px;
 border: 1px solid #000;
 border-bottom-right-radius: 100% 40px;
 background: #000;
}
  1. footer
/* QQ footerWrapper */
.footWrapper{
 /* 定位起始点 */
	position: absolute;
	top: 292px;
 left: 80px;
 width: 300px;
 height: 80px;
 /* border: 1px solid #000; */
}
/* QQ footerWrapper -> left */
.leftFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 16px;
	left: -1px;
 width: 130px;
 height: 37px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootTop {
 position: absolute;
	top: -10px;
 left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-left-radius: 80% 70%;
 background: #FF9C00;
}
.leftFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: -1px;
	width: 130px;
	height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 44%;
	border-top-right-radius: 50% 44%;
	border-bottom-left-radius: 50% 56%;
 border-bottom-right-radius: 50% 56%;
 background: #FF9C00;
}
/* QQ footerWrapper -> right */
.rightFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 22px;
	left: 134px;
 width: 130px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootTop {
 position: absolute;
 top: 0px;
	left: 4px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-right-radius: 32% 65%;
 background: #FF9C00;
}
.rightFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: 134px;
	width: 134px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 56%;
	border-top-right-radius: 50% 56%;
	border-bottom-left-radius: 50% 44%;
 border-bottom-right-radius: 50% 44%;
 background: #FF9C00;
}

到了这里基本完成了 90% 了, 剩下的就是线条优化,使 QQ 看起来更有层次感、立体感。

嘴唇

嘴巴的形状不够性感、立体;绘制一个斜边三角形,修复嘴唇的层次感。

绘制这样一个斜边三角形,步骤分解如图所示:

先是绘制一个普通三角形,通过逆时针旋转得到一个修复三角形,那么相对称的修复三角形可以通过使用rotateY,绕着Y轴旋转180度,来得到。

<!-- 嘴唇上下层次感 -->
<div class="lispContainer">
 <div class="lips">
 <!-- 左右上下嘴唇咬合阴影 -->
 <div class="lipShadow left"></div>
 <div class="lipShadow right"></div>
 </div>
</div>
/* 嘴唇上下层次感-咬合部位 */
.lispContainer {
 /* 定位 */
 position: absolute;
	top: 146px;
	left: 60px;
 width: 116px;
 height: 24px;
}
.lips {
 position: absolute;
	top: 0;
	left: 0;
 width: 116px;
 height: 24px;
 border: 1px solid #FFA600;
 border-bottom-left-radius: 50% 100%;
 border-bottom-right-radius: 50% 100%;
 background: #FFA600;
}
.lipShadow {
 position: absolute;
 width: 0px;
 height: 0px;
 border-top: 20px solid transparent;
	border-bottom: 20px solid transparent;
	border-right: 8px solid black;
	transform-origin: top right;
 transform: rotate(-60deg);
 z-index: 2;
}
.lipShadow.left {
 top: 4px;
 left: -12px;
 transform: rotate(-60deg);
}
.lipShadow.right {
 top: 4px;
 left: 111px;
 transform: rotate(60deg) rotateY(180deg);
}

围巾

围脖竟然没折痕,不立体; 通过绘制一个“小尾巴”来进行美化

border-right: 6px solid black;
width: 100px;
height: 70px;
border-bottom-right-radius: 70px 70px;

当对一个角应用圆角样式,如果这个角相邻的两个border一个有定义而一个无定义,那么绘制的结果就是由粗到细的“小尾巴了”。[在整个绘制过程中,同一个图形它的绘制方法有很多种,例如一个矩形可以用 width x height构成,也可以由border x height(width)构成,甚至可以由border组合(width=height=0)构成,根据情况选择吧。]

<!-- 围巾 -->
<div class="scarf">
 <div class="scarfShadow"></div>
 <div class="scarfShadowRight"></div>
</div>
<!-- 围巾尾 -->
<div class="scarfEnd">
 <div class="scarfEndShadow"></div>
</div>
</div>
/* QQ body -> scarf */
.scarf {
 position: absolute;
 top: -2px;
 left: 34px;
 z-index: 5;
 width: 258px;
 height: 110px;
 border: 4px solid #000;
 border-top-left-radius: 30px 34px;
	border-top-right-radius: 38px 34px;
	border-bottom-left-radius: 50% 76px;
 border-bottom-right-radius: 50% 76px;
 border-top: none;
 background: #FB0009;
}
.scarfShadowLeft {
 position: absolute;
 top: 0px;
	left: 6px;
	width: 60px;
 height: 70px;
 /* border: 4px solid #000; */
 border-top: 6px solid #000;
	border-top-left-radius: 90px 120px;
 border-top-right-radius: 30px 30px;
	transform: rotate(-79deg);
}
.scarfShadowRight {
 position: absolute;
 top: 8px;
	left: 143px;
	width: 100px;
 height: 70px;
 /* border: 4px solid #000; */
 border-right: 6px solid black;
	width: 100px;
 border-bottom-right-radius: 70px 70px;
 border-right: 6px solid black;
}
/* QQ body -> scarfEnd */
.scarfEnd {
 position: absolute;
 left: 74px;
 top: 90px;
	width: 52px;
 height: 64px;
 border: 3px solid black;
 border-bottom-left-radius: 50% 43%;
	border-bottom-right-radius: 15px;
 border-top-left-radius: 20% 57%;
 background: #FB0009;
 z-index: 4;
}
.scarfEndShadow {
 position: absolute;
 top: 6px;
	left: 12px;
	width: 20px;
 height: 20px;
 /* border: 4px solid #000; */
 border-top: 6px solid #000;
 border-top-left-radius: 30px 30px;
 transform-origin: top right;
 transform: skewX(4deg) scaleY(1.5) rotate(-60deg);
}

也是通过绘制小尾巴来进行美化

<!-- 脚 -->
<div class="footWrapper">
 <div class="leftFootTopWrapper">
 <div class="leftFootTop"></div>
 </div>
 <div class="leftFootBottomWrapper">
 <div class="leftFootBottom"></div>
 </div>
 <!-- 脚趾间隔线条 -->
 <div class="toe left"></div>
 <div class="rightFootTopWrapper">
 <div class="rightFootTop"></div>
 </div>
 <div class="rightFootBottomWrapper">
 <div class="rightFootBottom"></div>
 </div>
 <!-- 脚趾间隔线条 -->
 <div class="toe right"></div>
</div>
/* QQ footerWrapper */
.footWrapper{
 /* 定位起始点 */
	position: absolute;
	top: 292px;
 left: 80px;
 width: 300px;
 height: 80px;
 /* border: 1px solid #000; */
}
.toe {
 position: absolute;
	width: 25px;
	height: 20px;
 /* border: 4px solid #000; */
 border-top: 4px solid black;
 border-top: 4px solid black;
 border-top-right-radius: 30px 30px;
 border-top-left-radius: 10px 10px;
 transform-origin: top left;
 z-index: 10;
}
/* QQ footerWrapper -> left */
.leftFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 16px;
	left: -1px;
 width: 130px;
 height: 37px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootTop {
 position: absolute;
	top: -10px;
 left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-left-radius: 80% 70%;
 background: #FF9C00;
}
.toe.left {
 top: 50px;
 left: 2px;
 transform: rotate(-45deg);
}
.leftFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: -1px;
	width: 130px;
	height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.leftFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 44%;
	border-top-right-radius: 50% 44%;
	border-bottom-left-radius: 50% 56%;
 border-bottom-right-radius: 50% 56%;
 background: #FF9C00;
}
/* QQ footerWrapper -> right */
.rightFootTopWrapper {
 /* 定位左脚上容器 */
 position: absolute;
	top: 22px;
	left: 134px;
 width: 130px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootTop {
 position: absolute;
 top: 0px;
	left: 4px;
 width: 120px;
	height: 60px;
 border: 4px solid black;
 border-top-right-radius: 32% 65%;
 background: #FF9C00;
}
.toe.right {
 top: 50px;
 left: 264px;
 transform: rotate(45deg) rotateY(180deg);
}
.rightFootBottomWrapper {
 position: absolute;
 top: 52px;
	left: 134px;
	width: 134px;
 height: 38px;
 /* border: 1px solid #000; */
 overflow: hidden;
}
.rightFootBottom {
 position: absolute;
 top: -30px;
	left: 3px;
 width: 120px;
	height: 60px;
 border: 4px solid #000;
 border-top-left-radius: 50% 56%;
	border-top-right-radius: 50% 56%;
	border-bottom-left-radius: 50% 44%;
 border-bottom-right-radius: 50% 44%;
 background: #FF9C00;
}

大功告成,一个生动的 QQ 企鹅就绘制完了~

对前端有兴趣或者正在学习web前端的小伙伴,可以私信小编【学习】即可免费领取2018最新的一整套系统web前端学习教程!

介绍下这个过程中几个比较典型的图形绘制方法:

1、企鹅的眼睛:椭圆,直接设置border-radius:50% 50%; 即可[因为宽高分别为44px和66px,所以也可以这样设定:border-radius: 22px / 33px]

2、围脖的尾部:一个圆角各异的矩形,所以这里需要对几个角分别设定border-radius,微调的结果为

border-bottom-left-radius: 50% 43%;
border-bottom-right-radius: 15px;
border-top-left-radius: 20% 57%;

3、企鹅的胳膊:手的绘制较为麻烦一点,可以分为上下两个部分,将绘制的结果拼接到一起。那么对于不需要的部分怎么办呢?我们可以将上(下)部分放到一个div(container)中,利用overflow:hidden的属性来截取所要的部分。绘制复杂图形的时候常用的方法就是切割和拼接,将图形切割成一个个简单的小块,通过层叠和旋转变化进行组合。

使用transform:rotate(deg)的时候,优先设定transform-origin属性,会比较方便。设定的点作为中心点,整个图形绕着这个点进行角度变化。例如:transform-origin:bottom left, 使用左下角作为原点。也可以使用具体的像素值和百分比。

在基本的框架线条中比非常多的使用了border-radius用于构造各种曲线条,小企鹅是圆圆胖胖的,:)

面新闻、华西都市报的原创稿件,一直被大量网站、移动客户端等平台转载,通过封巢智媒体的全网数据监控、文图及视频对比分析、稿件来源追踪、传播路径分析、以及媒体白名单筛选等技术手段,现将8月11日-8月20日期间未经授权转载封面新闻、华西都市报原创稿件的部分平台予以公布,请相关侵权网站、移动客户端等平台立即停止侵权行为,封面新闻、华西都市报保留进一步追究其相应侵权责任的权利。

部分侵权转载平台如下:

1、搜狐网

未经许可侵权转载封面新闻原创稿件《4名女子自驾川西坠江 过路车行车记录仪拍下坠江瞬间》、《4名成都女子自驾川西坠江2死2失踪 其中3人是同事》、《两年轻女子点遍火锅店特色菜 吃完后拔腿就跑》等稿件文图50篇137次,且修改了稿件标题及来源。部分侵权稿件链接为:

http://www.sohu.com/a/247283951_420076

http://www.sohu.com/a/248619686_578875

http://www.sohu.com/a/246479257_100163025

2、快资讯

未经许可侵权转载封面新闻原创稿件《首届中国大熊猫国际文化周来啦,这份攻略不可错过!》、《兰州到成都,95后“准大学生”骑行近千公里入学:虽千万里吾往矣海特高新董事长李飙:航空培训领域“掘金” 从新加坡辐射东南亚》等13篇稿件文图且修改了稿件标题及来源。部分侵权稿件链接为:

https://sh.qihoo.com/9d04460763d8c0943?refer_scene=\u0026scene=1\u0026sign=look\u0026uid=dc9322863ae4625ce877f34b01290a2d

https://sh.qihoo.com/96831735fa330b902?refer_scene=\u0026scene=1\u0026sign=look\u0026uid=dc9322863ae4625ce877f34b01290a2d

https://sh.qihoo.com/915c0e766ade82df2?refer_scene=\u0026scene=1\u0026sign=look\u0026uid=dc9322863ae4625ce877f34b01290a2d

3、华人头条移动端

未经许可侵权转载封面新闻原创稿件《4岁女孩抓起爸爸的手机扔进大海 只因他在手机上花太多时间》、《女子被刺伤后手捂脖子大声呼救 伤人男子跳入江中》、《德牧未拴绳咬伤13岁少年 警方:狗主人拘留10日罚款500元》等11篇稿件文图,且修改了稿件标题及来源。部分侵权稿件链接为:

http://www.52hrtt.com/webservicepage_getInformationPage.do?id=G1533892440939&areaId=47&languageId=1&behaviorSource=4

http://www.52hrtt.com/webservicepage_getInformationPage.do?id=G1533893069976&areaId=47&languageId=1&behaviorSource=4

4、猎豹浏览器移动端

未经许可侵权转载封面新闻原创稿件《4名成都女子自驾川西坠江2死2失踪 其中3人是同事》、《当"中国速度"遇上"马来下午茶" 川企“出海”的难与甜》、《4名女子自驾川西坠江 过路车行车记录仪拍下坠江瞬间》等8篇稿件文图,且修改了稿件标题及来源。部分侵权稿件链接为:

http://m.news.liebao.cn/detail.html?newsid=gLfjeLxdWmuzaeiINIsyEQ

http://m.news.liebao.cn/detail.html?newsid=L-tgETJFWi6jVKHQ5VeDFA

http://m.news.liebao.cn/detail.html?newsid=jNRNduhYVdKl28lHIh6YWQ

5、悦头条移动端

未经许可侵权转载封面新闻原创稿件《兰州到成都,95后“准大学生”骑行近千公里入学:虽千万里吾往矣》、《4名女子自驾川西坠江 过路车行车记录仪拍下坠江瞬间》、《外卖餐垫上印寻人启事 店主:既为公益也有商业考虑》等5篇稿件文图且修改了稿件标题及来源。部分侵权稿件链接为:

https://cpu.baidu.com/api/1022/c54006e0/detail/21934382545673802/news

https://cpu.baidu.com/api/1022/c54006e0/detail/21792077125819907/news

https://cpu.baidu.com/api/1022/c54006e0/detail/21778175793077737/news

6、快头条移动端

未经许可侵权转载封面新闻原创稿件《的哥带生病儿子跑出租,婉拒更多捐助:我靠跑车能过下去》、《兰州到成都,95后“准大学生”骑行近千公里入学:虽千万里吾往矣》、《金沙考古成都展进入倒计时 快去刷成都“最牛考古成绩单”》等5篇稿件文图且修改了稿件标题及来源。部分侵权稿件链接为:

http://red.iatu.cn/enjya/jinShare?forward=1&aid=cmpp_041280045118013

http://red.iatu.cn/enjya/jinShare?forward=1&aid=sub_74256188

http://red.iatu.cn/enjya/jinShare?forward=1&aid=cmpp_033200059850190

7、唔哩移动端

未经许可侵权转载封面新闻原创稿件《青少年牙龈炎最常见 专家:每年至少进行一次口腔检查》等3篇稿件文图且修改了稿件标题及来源。部分侵权稿件链接为:

http://api.9idudu.com/sdk/wuli1/app/share/share.html?appId=ff6960eda7823d43d85f177043c7351e&appSecret=15ee5fd2dddfeb39df3e853d412b1608&messageId=9a216e2faf68e97c&messageType=NEWS&parentId=30&rt=channel&userId=a327cbd3c95bac0e8415e0c43c8738ec

8、今讯网

未经许可侵权转载封面新闻原创稿件《德牧未拴绳咬伤13岁少年 警方:狗主人拘留10日罚款500元》、《女子被刺伤后手捂脖子大声呼救 伤人男子跳入江中》、《巴西树懒妈妈怀子“偷渡”成都 四川首只树懒宝宝诞生》等文图且修改了稿件标题及来源。侵权稿件链接为:

http://news.jinxun.cc/20180814/0671546.html

http://news.jinxun.cc/20180813/0670935.html

为规范网络转载行为,制止非法侵权转载,现郑重公告如下:

1、封面传媒下属的封面新闻网、封面新闻客户端、封面新闻新浪微博、封面新闻微信公众号上发布的标题下方署名为“封面新闻”、“华西都市报”、“封面新闻-华西都市报” 、““封面新闻、华西都市报””的所有内容以及华西都市报下属的华西都市报纸质版、电子版、华西都市报新浪微博、华西都市报微信公众号上发布的标题下方署名为“华西都市报”的所有内容,包括但不限于文字报道、图片、音频、视频、直播等内容,均受《中华人民共和国著作权法》等有关法律法规中有关著作权或其他财产所有权的法律保护,为“封面传媒”、“华西都市报”及/或相关权利人专属所有或持有。

2、任何单位及个人,凡在互联网、移动客户端、微博和微信等平台上使用封面传媒或者华西都市报拥有版权的作品,须事先取得封面传媒或者华西都市报的授权后方可使用和转载,未经授权任何人不得复制、转载、摘编、发行、广播、信息网络传播、表演、建立镜像等。擅自使用封面传媒或者华西都市报版权作品,封面传媒、华西都市报将在其官网公告侵权人及其侵权行为。

3、本公告自发布后,侵权人继续侵权,封面传媒、华西都市报将采取包括但不限于向国家版权行政主管部门举报,向人民法院提起侵权诉讼等多种措施以维护著作权人的合法权益。届时产生的一切后果由侵权人承担。

4、对于未经许可的各类非法转载行为,任何单位及个人均有权举报,我们将对举报者的相关信息予以严格保密。

封面新闻、华西都市报版权事务联系电话:028-86969467

封面传媒 华西都市报社

2018年8月21日

【如果您有新闻线索,欢迎向我们报料,一经采纳有费用酬谢。报料微信关注:ihxdsb,报料QQ:3386405712】

多网站都挂着腾讯的营销QQ在线咨询代码,不过看来看去都是那么几个样式,没办法,因为腾讯营销QQ的样式一共就6种,而且还不怎么好看,虽然腾讯官方有提供API,不过并不多人会专门利用它做个更好看的样式。今天笔者正巧用到,就顺便研究了下,其实还是很简单的,插入3处代码,剩下的就是正常的css样式而已,下面是步骤。

1.进入营销QQ的页面版后台

“在线代码生成”,然后点击“在线咨询API接入”

2.获取在线咨询ID

这里点击“生成代码”(如需开发者API文档请见:https://id.b.qq.com/combo/account/bizqq/wpa/WPAOpenAPI.pdf)

3. 添加引用

请在要显示在线咨询图标的页面中粘贴以下代码,以引用页面。

<script charset="utf-8" src="http://wpa.b.qq.com/cgi/wpa.php"></script>

4. 设置咨询图标ID

请在在线咨询图标所在网页标签中设置id属性,以使您指定的图片或div成为可使用的在线咨询图标

<div id="BizQQWPA"></div>

这里可以是任何的html标签,如a 、span、H2等等,id每个人都不一样

5. 插入功能代码

请在要显示在线咨询图标的页面源代码末尾粘贴以下代码,以实现在线咨询功能。

BizQQWPA.addCustom({aty: '0', a: '0', nameAccount: 4008885159, selector: 'BizQQWPA'});

文/WingsBlog