最近看到那种带箭头的提示框,忽然想看一下到底什么原理,也就去网上搜了一下,现在总结一下实现方法。
大概也就三种方法。

第一种方法就是纯粹的利用div的边框
图中A和B,C和D分别是一对实现向右和向左箭头的前后图。
看图A:
<div class="arrow-right-a"></div>
CSS:
.arrow-right-a {
width: 0;
height: 0;
border-left: 20px solid #ccc;
border-top: 10px solid #000;
border-bottom: 10px solid #000;
border-right: 10px solid #ccc;
}把div的高和宽都设为0,然后设置这个div的四个边框,边框宽度设置大一点。
最终看效果(图A)。
我们可以看到四个边框都是三角形的,那么我们是不是可以让其中的任意三个边框透明,只显示一个三角形,是不是就可以得到四个方向的箭头了呢?
看图B:
<div class="arrow-right-b"></div>
CSS:
.arrow-right-b {
width: 0;
height: 0;
border-left: 20px solid #ccc;
border-top: 10px solid rgba(0 , 0, 0 , 0);
border-bottom: 10px solid rgba(0 , 0, 0 , 0);
}设置左边框颜色是灰色,上边框和下边框透明,就得到了图B的效果。
图C和图D是同样的原理。
第二种方法就是上面的方法加上css的伪类:before和:after
图E:
<div style="position:relative"> <div class="tip">向左的箭头: 只有三个边:上、下、右。而 < | 总体来看,向左三角形的高=上+下边框的长度。 宽=右边框的长度 向右的箭头: 只有三个边:上、下、左。而 |> 总体来看,向右三角形的高=上+下边框的长度。 宽=左边框的长度 向上的箭头,类似于A,只有三个边,不能指定上边框 </div> </div>
先设置好主体内容的css:
.tip {
width: 200px;
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
box-shadow: 0 0 10px #ccc;
}然后在tip前面插入内容:
.tip:before {
content: "";
border-right: 10px solid #ccc;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
position: absolute;
left: -10px;
top: 20px;
}内容是空,其他的边框设置根据需要和第一种方法一致。
:before伪类插入的内容默认是显示在div内容的开头。
所以我们要用定位去重新固定到需要的位置。
看效果,问题来了,这个箭头和第一种方法实现的是一样的,里面有颜色,和我们的主体背景不一致,很不和谐。
好,下面就要用到:after伪类了。
.tip:after {
content: "";
border-right: 10px solid #fff;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
position: absolute;
left: -9px;
top : 20px;
}这个的边框颜色设置成和主体背景颜色相一致,然后定位到before的内容除,覆盖掉before,空出1px不被覆盖即可。
效果如图E。
第三种方法就是要用到css3的旋转了
原理就是给一个div固定的宽和高,设置这个div的边框颜色和阴影,然后旋转这个div到适合的角度,
然后外面再包一层div,让它的子div超出它,超出的隐藏掉。
HTML:
<div class="tip-b"> <div class="arrow-outer"><div class="arrow-left-a-a"></div></div> <div class="tip-content"> 向左的箭头: 只有三个边:上、下、右。而 < | 总体来看,向左三角形的高=上+下边框的长度。 宽=右边框的长度 向右的箭头: 只有三个边:上、下、左。而 |> 总体来看,向右三角形的高=上+下边框的长度。 宽=左边框的长度 向上的箭头,类似于A,只有三个边,不能指定上边框 </div> </div>
arrow-outer就是箭头的父级,css是:
.arrow-outer {
width: 30px;
height: 30px;
position: absolute;
top: 20px;
left: -29px;
overflow: hidden;
display: inline-block;
}关键是overflo:hidden。
然后是箭头arrow-left-a-a:
.arrow-left-a-a {
width: 20px;
height: 20px;
border: 1px solid #ccc;
box-shadow: 0 0 5px #ccc;
position: absolute;
left: 20px;
top: 3px;
transform:rotate(45deg);
background-color: #fff;
}旋转45度,背景和主体背景一致。
旋转的目的就是让这个div互相垂直的两边形成指向,然后用定位让它超出他的父级div(.arrow-outer),超出的部分就是不需要的部分,自然会被隐藏。
最终就会形成箭头。
边框透明的话用rgba和transparent都是一样的,随便用哪个。
示例完整代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS 箭头Demo</title>
<style type="text/css">
body {
padding-left: 20px;
}
/* rgba:
R:红色值。正整数 | 百分数
G:绿色值。正整数 | 百分数
B:蓝色值。正整数| 百分数
A:透明度。取值0~1之间
*/
.arrow-right-a {
width: 0;
height: 0;
border-left: 20px solid #ccc;
border-top: 10px solid #000;
border-bottom: 10px solid #000;
border-right: 10px solid #ccc;
}
.arrow-right-b {
width: 0;
height: 0;
border-left: 20px solid #ccc;
border-top: 10px solid rgba(0 , 0, 0 , 0);
border-bottom: 10px solid rgba(0 , 0, 0 , 0);
}
.arrow-left-a{
width: 0;
height: 0;
border-right: 20px solid #ccc;
border-top: 10px solid #000;
border-bottom: 10px solid #000;
}
.arrow-left-b{
width: 0;
height: 0;
border-right: 20px solid #ccc;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
}
.tip {
width: 200px;
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
box-shadow: 0 0 10px #ccc;
}
.tip:before {
content: "";
border-right: 10px solid #ccc;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
position: absolute;
left: -10px;
top: 20px;
}
.tip:after {
content: "";
border-right: 10px solid #fff;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
position: absolute;
left: -9px;
top : 20px;
}
.arrow-left-a-a {
width: 20px;
height: 20px;
border: 1px solid #ccc;
box-shadow: 0 0 5px #ccc;
position: absolute;
left: 20px;
top: 3px;
transform:rotate(45deg);
background-color: #fff;
}
.tip-b {
position: relative;
}
.arrow-outer {
width: 30px;
height: 30px;
position: absolute;
top: 20px;
left: -29px;
overflow: hidden;
display: inline-block;
}
.tip-content {
width: 200px;
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
box-shadow: 0 0 10px #ccc;
display: inline-block;
}
</style>
</head>
<body>
<div class="arrow-right-a"></div>
<br>
<div class="arrow-right-b"></div>
<br>
<div class="arrow-left-a"></div>
<br>
<div class="arrow-left-b"></div>
<br>
<div style="position:relative">
<div class="tip">向左的箭头: 只有三个边:上、下、右。而 < | 总体来看,向左三角形的高=上+下边框的长度。 宽=右边框的长度 向右的箭头: 只有三个边:上、下、左。而 |> 总体来看,向右三角形的高=上+下边框的长度。 宽=左边框的长度 向上的箭头,类似于A,只有三个边,不能指定上边框 </div>
</div>
<br>
<div class="tip-b">
<div class="arrow-outer"><div class="arrow-left-a-a"></div></div>
<div class="tip-content">
向左的箭头: 只有三个边:上、下、右。而 < | 总体来看,向左三角形的高=上+下边框的长度。 宽=右边框的长度 向右的箭头: 只有三个边:上、下、左。而 |> 总体来看,向右三角形的高=上+下边框的长度。 宽=左边框的长度 向上的箭头,类似于A,只有三个边,不能指定上边框
</div>
</div>
</body>
</html>本文链接:https://360us.net/article/12.html