当你发现好多图都能用css画出来的时候,你就会觉得css很有魅力了。//我是这么觉得的,先不考虑什么兼容问题
像漫画里出现的对话框,往往都是一个对话框然后就加入一个箭头指向说话的那一方,来表示这个内容是谁述说的。
今天认真学了一下:相关资料
首先,要知道一个对话框无非就是一个矩形和一个小三角的契合,想起小学时候教的七巧板;
所以简单来说,只要能制作出矩形和小三角即可;
矩形,一个普通块都可以算得上是矩形了,只要有足够的width和height;
那么三角形呢,这才是难点,起初完全没去研究过原来三角形可以是这么回事,在刚开始接触border的时候,只知道给块画个边框然后就知道了块的大小;
但是border的世界真的是博大精深,当给足了它颜色与宽度,它就有了改变世界的能力。
对于上图,实际的实现也是很简单
1 .div-border{
2 width: 0px;
3 height: 0px;
4 border-top-color: #ccFF99;
5 border-right-color: #ff0099;
6 border-bottom-color: #00ff99;
7 border-left-color: #9900ff;
8 border-width: 50px;
9 border-style: solid;
10 }
11 .div-trangle{
12 width: 0px;
13 height: 0px;
14 border-color: transparent #000;
15 border-width: 50px;
16 border-style: solid;
17 }
以上的css,两个类,一个就是实现上图的四种颜色,之所以会这样,颜色由border-color来去定义,而border-width则是边框宽度,针对top边框来说,border-width或者是border-top-width可以说就是最上面那个三角形的高,即直角顶点到水平边的垂直距离;//哎呀,我不想说的那么数学化- -
之所以会变成三角形,也就是因为实际的内容width和高度都变成0了,这个其实可以自行在chrome控制台边控制样式,边查看页面效果。
另外一个类主要区别在于border-color里取了transparent,这个值表示透明,效果自行演示咯。
1 <body>
2 <div style="height:200px;">
3 <div class="div-border">
4
5 </div>
6 </div>
7 <div style="height:200px;">
8
9 <div class="div-trangle">
10
11 </div>
12 </div>
13 </body>
既然能得到三角形,那么怎么让矩形跟三角形位置上的组合呢?这个就要看html的一个文档流和position概念了,其实我也不是很熟。
大概原理是让矩形具有position:relative的属性, 而让三角形归属与矩形块中,并且拥有position:absolute的属性,此后,三角形就可以通过top\right\left\bottom属性值的设置来移动三角形对于其父元素矩形的位置,从而达到完美契合。
1 <html>
2 <head>
3 <title>对话框</title>
4 <style type="text/css">
5 *{
6 margin: 0;
7 padding: 0;
8 }
9 .div-mid{
10 margin: 0 auto;
11 width: 800px;
12 height: 600px;
13 }
14 .div-diabox{
15 width: 200px;
16 border-style: solid;
17 border-width: 1px;
18 border-radius: 10px;
19 border-color: #CCCC33;
20 background-color: #FFFF99;
21 position: relative;
22 margin: 0 auto;
23 padding:30px;
24 top: 30px;
25 }
26 .div-diabox .arrow-bottom-out{
27 width: 0px;
28 height: 0px;
29 border-style: solid;
30 border-color: #CCCC33 transparent transparent transparent;
31 border-width: 10px;
32 position: absolute;
33 top: 79px;
34 left: 10px;
35 }
36 .div-diabox .arrow-bottom-in{
37 width: 0px;
38 height: 0px;
39 border-style: solid;
40 border-color: #FFFF99 transparent transparent transparent;
41 border-width: 10px;
42 position: absolute;
43 top: 78px;
44 left: 10px;
45 }
46 .div-diabox .arrow-top-out{
47 width: 0px;
48 height: 0px;
49 border-style: solid;
50 border-color: transparent transparent #CCCC33 transparent;
51 border-width: 10px;
52 position: absolute;
53 top: -20px;
54 right: 10px;
55 }
56 .div-diabox .arrow-top-in{
57 width: 0px;
58 height: 0px;
59 border-style: solid;
60 border-color: transparent transparent #FFFF99 transparent;
61 border-width: 10px;
62 position: absolute;
63 top: -19px;
64 right: 10px;
65 }
66 .div-diabox .arrow-right-out{
67 width: 0px;
68 height: 0px;
69 border-style: solid;
70 border-color: transparent transparent transparent #CCCC33;
71 border-width: 10px;
72 position: absolute;
73 top: 10px;
74 right: -20px;
75 }
76 .div-diabox .arrow-right-in{
77 width: 0px;
78 height: 0px;
79 border-style: solid;
80 border-color: transparent transparent transparent #FFFF99;
81 border-width: 10px;
82 position: absolute;
83 top: 10px;
84 right: -19px;
85 }
86 .div-diabox .arrow-left-out{
87 width: 0px;
88 height: 0px;
89 border-style: solid;
90 border-color: transparent #CCCC33 transparent transparent;
91 border-width: 10px;
92 position: absolute;
93 top: 10px;
94 left: -20px;
95 }
96 .div-diabox .arrow-left-in{
97 width: 0px;
98 height: 0px;
99 border-style: solid;
100 border-color: transparent #FFFF99 transparent transparent;
101 border-width: 10px;
102 position: absolute;
103 top: 10px;
104 left: -19px;
105 }
106 </style>
107 </head>
108
109 <body>
110 <div class="div-mid">
111 <div class="div-diabox">
112 <span class="arrow-bottom-out"></span>
113 <span class="arrow-bottom-in"></span>
114 雷猴码
115 </div>
116 <br/>
117 <br />
118 <div class="div-diabox">
119 <span class="arrow-top-out"></span>
120 <span class="arrow-top-in"></span>
121 雷猴码
122 </div>
123 <br/>
124 <br />
125 <div class="div-diabox">
126 <span class="arrow-right-out"></span>
127 <span class="arrow-right-in"></span>
128 雷猴码
129 </div>
130 <br/>
131 <br />
132 <div class="div-diabox">
133 <span class="arrow-left-out"></span>
134 <span class="arrow-left-in"></span>
135 雷猴码
136 </div>
137
138 </div>
139 </body>
140 </html>
效果图:
当时看到这个效果的时候,还没自己实现之前,就有一个疑问,那就是三角形的颜色问题,因为三角形就是一个border,一条边而不是一个块,不能拥有多种颜色,所以实际上一个border只是一个实心颜色的图形,那怎么办呢?
解决方案是复制多一个border三角形,当然颜色要不同,只要让其位置上重叠,底部着漏出一点边,从而达到有边效果的三角形(实际是重叠的两个三角形)。
关于位置移动问题,我觉得自己研究还是挺好玩的,不过就是没拿到诀窍的感觉,还是要自己去算一下。