者:Junting
来源:掘金
开始着手于QQ 企鹅的绘制, 第一步基本框架的绘制。
通过对Logo图像的观察,按照层次划分来组合最终的效果。选择使用绝对位置position:absolute;来布局各个元素。主要划分为头部,身体,围脖,双手,双脚。
<!-- 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,也就是各个模块的重叠层次,遮盖了一些无用的线条和框角。
/* 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; }
/* 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; }
上色后你会发现,有的图层显示先后顺序不对,需要调整下先后顺序。
/* 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; }
/* 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 企鹅就绘制完了~
介绍下这个过程中几个比较典型的图形绘制方法:
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
*请认真填写需求信息,我们会在24小时内与您取得联系。