当你发现好多图都能用css画出来的时候,你就会觉得css很有魅力了。//我是这么觉得的,先不考虑什么兼容问题

像漫画里出现的对话框,往往都是一个对话框然后就加入一个箭头指向说话的那一方,来表示这个内容是谁述说的。

     今天认真学了一下:相关资料

首先,要知道一个对话框无非就是一个矩形和一个小三角的契合,想起小学时候教的七巧板;

所以简单来说,只要能制作出矩形和小三角即可;

     矩形,一个普通块都可以算得上是矩形了,只要有足够的width和height;

     那么三角形呢,这才是难点,起初完全没去研究过原来三角形可以是这么回事,在刚开始接触border的时候,只知道给块画个边框然后就知道了块的大小;

  但是border的世界真的是博大精深,当给足了它颜色与宽度,它就有了改变世界的能力。

css实现一个对话框的容器 css规则定义对话框_css实现一个对话框的容器

对于上图,实际的实现也是很简单

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>

效果图:

css实现一个对话框的容器 css规则定义对话框_html_02

当时看到这个效果的时候,还没自己实现之前,就有一个疑问,那就是三角形的颜色问题,因为三角形就是一个border,一条边而不是一个块,不能拥有多种颜色,所以实际上一个border只是一个实心颜色的图形,那怎么办呢?

解决方案是复制多一个border三角形,当然颜色要不同,只要让其位置上重叠,底部着漏出一点边,从而达到有边效果的三角形(实际是重叠的两个三角形)。

 

关于位置移动问题,我觉得自己研究还是挺好玩的,不过就是没拿到诀窍的感觉,还是要自己去算一下。