这阵子在做一个web端项目中遇到一个问题,需要实现带箭头的选项卡点击可切换。起初没想太多,直接切一个向上的小箭头图片,外层div设置相同颜色的边框,再用相对定位和绝对定位。这种方法是可行的,但是因为手机和电脑的屏幕显示图片的画质细节不同,导致1px的边框比1px的切图实际粗很多,对于有强迫症的人来说心里总是不舒服的……后来我就想,屁大点的箭头直接用css写一个算了。可是以前没写过,那就研究一下吧。网上有很多这方面的资料,但是还是那句话,那都是人家的不是自己的,要想据为己有自己也写篇博客吧。

这种纯css没有兼容性的问题,无需切图,甚至没有用到CSS3,对各种浏览器支持良好。

基本原理:控制盒子模型的宽度高度和边框的显示隐藏,以及改变某一条边的颜色。

从梯形入手:

当元素宽、高和边框的宽相等时,改变某一边的颜色可以看到一个梯形;

<span class="ladder"></span>
<style type="text/css">
.ladder{
border:10px solid transparent;
border-left:10px #f00 solid;
width:10px;
height:10px;
display: inline-block;
}
</style>

梯形

三角形:

当元素宽、高为零,且其他边为透明颜色时,可以形一个三角形。

向上的三角形:<span class="triangle-up"></span>
向下的三角形:<span class="triangle-down"></span>
向左的三角形:<span class="triangle-left"></span>
向右的三角形:<span class="triangle-right"></span> <style type="text/css">
.triangle-up{
border: 20px solid transparent;
border-bottom: 20px solid #f00;
width:0;
height:0;
}
.triangle-down{
border: 20px solid transparent;
border-top: 20px solid #f00;
width:0;
height:0;
}
.triangle-left{
border:20px solid transparent;
border-right:20px solid #f00;
width:0;
height:0;
}
.triangle-right{
border:20px solid transparent;
border-left:20px solid #f00;
width:0;
height:0;
}
</style>

上下左右三角形

通过不同颜色的两个元素覆盖可以形成三角线。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA1MAAABXCAYAAADhwR8XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAA19SURBVHhe7d0Bjqw2EgDQOfIcITeYI0/SyXbCtoCyTQE2fl+KVhuMKT9XjSkmSr5+/SFAgAABAgQIECBAgACBaoGv6jvcQIAAAQIECBAgQIAAAQK/milJQIAAAQIECBAgQIAAgQYBzVQDmlsIECBAgAABAgQIECCgmZIDBAgQIECAAAECBAgQaBDQTDWguYUAAQIECBAgQIAAAQKaKTlAgAABAgQIECBAgACBBgHNVAOaWwgQIECAAAECBAgQIKCZkgMECBAgQIAAAQIECBBoENBMNaC5hQABAgQIECBAgAABApopOUCAAAECBAgQIECAAIEGAc1UA5pbCBAgQIAAAQIECBAgoJmSAwQIECBAgAABAgQIEGgQ0Ew1oLmFAAECBAgQIECAAAECmik5QIAAAQIECBAgQIAAgQYBzVQDmlsIECBAgAABAgQIECCgmZIDBAgQIECAAAECBAgQaBDQTDWguYUAAQIECBAgQIAAAQKaKTlAgAABAgQIECBAgACBBgHNVAOaWwgQIECAAAECBAgQIHC4mfr6OjZFy/1b97TM1ZoCR54VxX9k7tb1uO8ZAnfkTpTPV8geWXcU/5G5r1i7Z/QrcDR3Wu6P8vkKrZa433FF8R+Z+4q1e0a/Akdzp+X+KJ+v0GqJWz3W7cyhTujIBkUbtbeMpyfna+0ZtnWpYPToAjU58xrb+tenk3ocPXPEf4ZATT1uPb9lDvV4xm6ac3SBlloqPeu8rx5qJUZPrb/jbxbISMyWpmHvuVFMLS+Pa7sczdNSWC0Wj8hAi0gRiHK/9CG186jHUlnjZhKoraOsZko9zpRl1loqoB63P556Xy3Nov1xVc1U1ESsXY/CrEnyree/n9Hy/Ci+2i8T0XqW1z/Hvv//ch218Rk/j4B6jH+Dqx7nqYe7V3qkHlvufd+zd/59njefz8k2q6m3rQ+Vy/Usxzgfs3fr2fO11FRUSyVzRnN4X31m3lU3UzUM0Q/W11wlY7Z+uC7vX5unZu6SdUXz1V5fOxyiOUriNGYOgdpcKRlfMkY9zpFfVlknUFM7JWdfxnzLM6b2w2Dd6uOzPFpPycfFaI7amI1/rkBtrkTjo+sl9aUeH5xvNUvLSKaShNuKaa9hOruZ2mp89r5UfH5Vi74K1vrW7J2xzxOozZeS8SVjemim1OPz8nn0FdXUztOaKfU4evY+L371+M8HjtK/vK8eq4FDv5la26TPDYnCK21Gtg6f9/1rz6ktpijWvRhqmsStuLYOpJK4jJlPYO1L7l7DXlIPyzHR+K0PGFF+Z+5U6UeUvbVE8UYfQTLXY65xBbLrMaq/kjPH+ThuPon8mEBmPdbWovfVY3s34t2Hm6m95qkkAUvGlHwJX0vevZe9km69tEErfaHbitHL2oilc3/Ma4dFdj3WNiF7zZh6vD9nRHCeQGY91pyLzsfz9tTM4wqox/V/9Nb76jk5PVwztdYEbb1AthxIEXNJE7b1NTCKJyr+KDbX5xKI8iW6fuRjwfvDgHqcK+esdlsgqrfo+uc5Fp01n5FsjXc+ytoZBaJ6i64vP1JEtVjzoVA9PjMbh2um1g6Qq5MziuH9ollyONbGvtWoPTM9rWpPIDoMouulzdRaPpf+vb3fVGXsbulXtjWLjEZQPWbs4jPmiOotur58eSs5Y0rG7D0z+rjXsivqsUXNPWcIRPUWXV+ecVGtHMn7vbo/6nIkLudjnf7jmqmt5qSOZXt0a3JuvXyuHYh7hevlLWsnx58nOgyi61c0U+px/DyzgjKBqN6i61c0U+qxbC+NGl8gqrea62c1U+px/Dz79+d2zVJKvu7WJkeUpNF8UeNRs76SsWvd+tbfK5lvrZmK1twyr3ueJ6Ae2/9tRaXZEB24pfP8O+6PP15B//6+/reXPz3G1ItNRRwZ9bh1npWck6Uf+vaatorlrg51Ph4VXNz//Z042XxTHanH2p/7pbXnfTXIw5+fYRPVb6Yqty6raNZ+w/See/mMrR8IlWEb/kCB6Ad+dH2NpOSlbe9l7I7DIvog8boexXVpPfbUvPQUy+A1GtVb7fXaj2qlZ9PZzdRw9dhj3r0aqddHF3+aBWrrLToj9gIprb0jz2iByIrrsvPxlfODNlRV1VrzohW9wLT8QN/66rWVZJ9NSc1Xs+XYKNaShF2bb++wXGus3qa1+9BShO7pX6A2D0rGl4xZ1sNaTanHgtzpoYnpIYYCqlGG1NTO5/kY3RtdX54NnzWpHkfJoP/FqS5TNqykZko/WERzbb0DOh//+e9cFf8ZOPcrVhn/F84/m44rmpmtrw9VG1i401tzfq5zq5HcK7i1ENa+BhSGatgEAqU5vtWYb+VcKV3pR4TSDyulz635uLG39tvr8c6D485n1270IOMz6rHlg99ePTgfB0med5jqMm3DMuox+nC495Hc+di4lYPWwCnN1FkvT6VbU1pEpfPVrifz+Zlz1azX2P4FanKjdGzpuBqdu+fMfH7mXH8b3nFw3PHMmoQZdGxNbtSMzeY449k1c9aMjdaeOVf0rNOvq8tU4prciMYevb63sGjuFpSaOWvGRrGkzTVgLVQ1UxGk6wQIECBQKXDlwXHlsyoZDCcwrYC6nHbrLXxDYLCa0EzJZAIECNwtcMXBccUz7nb0fAKjCajL0XZMvFcJDFQbmqmrksJzCBAgsCdw5sFx5tx2lQCBNgF12ebmrnkEBqkRzdQ8KWmlBAj0LnDGwXHGnL07io9A7wLqsvcdEl8vAgPUimaql2QRBwECBF4CmQdH5lx2hwCBHAF1meNolnkEOq8ZzdQ8qWilBAiMIpBxcGTMMYqXOAmMIqAuR9kpcfYm0HHtaKZ6SxbxECBA4OhvqDo+dGwugWkF1OW0W2/hSQKd1pBmKml/TUOAAIF0gZaDo+We9MBNSIDA/wmoSwlBIEegw1rSTOVsrVkIECBwjkDNwVEz9pxozUqAwKeAupQTBHIFOqspzVTu9pqNAAEC+QIlB0fJmPzIzEiAwJ6AupQfBM4R6Ki2NFPnbLFZCRAgkCuwd3B0dKjkLtpsBAYWUJcDb57QhxDopMY0U0NkiyAJECDwl8D74Pj5+Y/j+/v39+uvH+Wva/4QINCHQCcveX1giILAiQId1Jpm6sT9NTUBAgTSBZYNlUYqndeEBA4LdPByd3gNJiAwksDNNaeZGilZ7o719eK2/CJ+dzyeT2BWgXcT9fqNlJqcNQusu0eBm1/qeiQRE4FLBG6sPc3UJTv8gIe8k9Q/TvSAzbSERwj4uPGIbbSIBwnc+DL3IEVLIdAucFMNaqbat2yeO/1jRfPstZUSIECAQJvATS9ybcG6i8ADBW6qQc3UA3MpdUlriXlTsqauy2QECBAgQCBbwPmYLWo+AmUCN9aeZqpsi+Yc5V/FPOe+WzUBAgQItAvc+FLXHrQ7CQwscHPNaaYGzp1TQy9JzJIxpwZpcgIECBAg0KGA87HDTRHSIwU6qDXN1CMz6+CiahKzZuzBsNxOgAABAgSGEXA+DrNVAh1UoJMa00wNmj+nhd2SmC33nLYAExMgQIAAgU4EnI+dbIQwHifQUW1pph6XXQcWdCQxj9x7IGS3EiBAgACBrgWcj11vj+AGFOispjRTA+bQKSFnJGbGHKcszqQECBAgQOBGAefjjfge/SiBDmtJM/WoDGtcTGZiZs7VuBy3ESBAgACB7gScj91tiYAGE+i0hjRTg+VRerhnJOYZc6Yv3IQECBAgQOBiAefjxeAe9xiBjmtHM/WYLGtYyJmJeebcDUt1CwECBAgQ6ELA+djFNghiIIHOa0YzNVAupYZ6RWJe8YxUFJMRIECAAIELBJyPFyB7xCMEBqgVzdQjMq1yEVcm5pXPqmQwnAABAgQI3CbgfLyN3oMHERikRjRTg+RTWph3JOYdz0wDMxEBAgQIEDhJwPl4EqxphxcYqDY0U8NnW8UC7kzMO59dQWQoAQIECBC4VMD5eCm3hw0gMFhNaKYGyKmUEHtIzB5iSME0CQECBAgQSBRwPiZimmpogQFrQTM1dMYVBt9TYvYUSyGfYQQIECBA4HQB5+PpxB7QucCgNaCZ6jyvDofXY2L2GNNhaBMQIECAAIGDAs7Hg4BuH1Zg4NzXTA2bdQInQIAAAQIEHifw/f37++X17HH7akH7Aq+c//kZUkm1DrltgiZAgAABAgQeK/BqqPwhMJPAoI3Ua4s0UzMlqrUSIECAAAECBAgQIJAmoJlKozQRAQIECBAgQIAAAQIzCWimZtptayVAgAABAgQIECBAIE1AM5VGaSICBAgQIECAAAECBGYS0EzNtNvWSoAAAQIECBAgQIBAmoBmKo3SRAQIECBAgAABAgQIzCSgmZppt62VAAECBAgQIECAAIE0Ac1UGqWJCBAgQIAAAQIECBCYSUAzNdNuWysBAgQIECBAgAABAmkCmqk0ShMRIECAAAECBAgQIDCTgGZqpt22VgIECBAgQIAAAQIE0gQ0U2mUJiJAgAABAgQIECBAYCYBzdRMu22tBAgQIECAAAECBAikCWim0ihNRIAAAQIECBAgQIDATAKaqZl221oJECBAgAABAgQIEEgT0EylUZqIAAECBAgQIECAAIGZBP4EzX5FDersJPoAAAAASUVORK5CYII=" alt="" />

<span class="triangle02">
向上的三角线:
<span class="pot01"></span>
<span class="pot02"></span>
</span>
<span class="triangle02">
向下的三角线:
<span class="pot03"></span>
<span class="pot04"></span>
</span>
<span class="triangle02">
向左的三角线:
<span class="pot05"></span>
<span class="pot06"></span>
</span>
<span class="triangle02">
向右的三角线:
<span class="pot07"></span>
<span class="pot08"></span>
</span> <style type="text/css">
.triangle02{
width:200px;
height:100px;
display: inline-block;
position: relative;
}
.triangle02 span {
width: 0;
height: 0;
font-size: 0;
overflow: hidden;
position: absolute;
}
.pot01{
border-width: 20px;
border-style: dashed dashed solid ;
border-color: transparent transparent #f00 ;
left: 100px;
top: 0;
}
.pot02{
border-width: 20px;
border-style: dashed dashed solid ;
border-color: transparent transparent #fff ;
left: 100px;
top: 2px;
}
.pot03{
border-width: 20px;
border-style: solid dashed dashed;
border-color: #f00 transparent transparent;
left: 100px;
top: 2px;
}
.pot04{
border-width: 20px;
border-style: solid dashed dashed;
border-color: #fff transparent transparent;
left: 100px;
top: 0;
}
.pot05{
border-width: 20px;
border-style: dashed solid dashed dashed;
border-color: transparent #f00 transparent transparent;
left: 100px;
top: 2px;
}
.pot06{
border-width: 20px;
border-style: dashed solid dashed dashed;
border-color: transparent #fff transparent transparent;
left: 102px;
top: 2px;
}
.pot07{
border-width: 20px;
border-style: dashed dashed dashed solid;
border-color: transparent transparent transparent #f00;
left: 100px;
top: 2px;
}
.pot08{
border-width: 20px;
border-style: dashed dashed dashed solid;
border-color: transparent transparent transparent #fff;
left: 98px;
top: 2px;
}
</style>

上下左右三角线

那么带箭头的提示框就简单了,只需要外层加个边框,用相对和绝对定位就可以实现。

<div class="box">
<span class="top01"></span>
css实现箭头对话框
</div>
<style type="text/css">
.box {
width: 300px;
padding: 30px 20px;
border: 5px solid #666;
position: relative;
margin:30px auto;
} .box span {
width: 0;
height: 0;
font-size: 0;
overflow: hidden;
position: absolute;
}
.box span.top01 {
border-width: 20px;
border-style: dashed dashed solid ;
border-color: transparent transparent #666;
left: 20px;
bottom: 81px;
}
</style>

箭头对话框

<div class="box">
<span class="bot"></span>
<span class="top"></span>
css实现气泡对话框
</div>
<style type="text/css">
.box {
width: 300px;
padding: 30px 20px;
border: 5px solid #666;
position: relative;
margin:30px auto;
}
.box span {
width: 0;
height: 0;
font-size: 0;
overflow: hidden;
position: absolute;
}
.box span.bot {
border-width: 20px;
border-style: dashed dashed solid ;
border-color: transparent transparent #666 ;
left: 100px;
bottom: 85px;
}
.box span.top {
border-width: 20px;
border-style: dashed dashed solid ;
border-color: transparent transparent #ffffff;
left: 100px;
bottom: 78px;
}
</style>

气泡对话框

要实现我需求再结合js就行啦。

在这里,我把学习过程中参考的文章标注一下供大家学习:

用纯CSS实现的箭头

纯css实现带三角箭头带描边带阴影带圆角的兼容各浏览器de气泡层

css实现带箭头选项卡的更多相关文章

  1. 使用纯CSS实现带箭头的提示框

    爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6187323.html 1.全部代码 <!DOCTYPE html> < ...

  2. div+css制作带箭头提示框效果图(原创文章)

    一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...

  3. CSS实现带箭头的提示框

    我们在很多UI框架中看到带箭头的提示框,感觉挺漂亮,但是之前一直不知道其原理,今天网上找了些资料算是弄清楚原理了: 先上效果图: 原理分析: 上面的箭头有没有觉得很像一个三角形,是的,它就是三角形:只 ...

  4. css实现带箭头的流程条

    直接上效果图: <ul class="navs"> <li>1</li> <li>2</li> <li>3& ...

  5. div+css实现圆形div以及带箭头提示框效果

    .img{ width:90px; height:90px; border-radius:45px; margin:0 40%; border:solid rgb(100,100,100) 1px;& ...

  6. 圆角带箭头的提示框css实现

    css是一个很强大的东西,很多网页效果,我们可以通过css直接实现.今天给大家分享的是一个用css实现的圆角带箭头的提示框. 效果如下图: 这一个样式主要涉及到了css的边框样式border的运用和定 ...

  7. css简单实现带箭头的边框

    原文地址 https://tianshengjie.cn/artic... css简单实现带箭头的边框 普通边框 <style> .border { width: 100px; heigh ...

  8. 【荐】CSS实现漂亮实用带箭头的流程图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 用纯CSS实现的箭头

    div+css实现带三角箭头提示框 链接:http://www.xuebuyuan.com/160534.html 链接:http://www.admin10000.com/document/4089 ...

随机推荐

  1. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  2. uva 11995 I Can Guess the Data Structure stack,queue,priority_queue

    题意:给你n个操做,判断是那种数据结构. #include<iostream> #include<cstdio> #include<cstdlib> #includ ...

  3. Struts2 url传递中文出现乱码

    项目所有的编码都改为了utf-8.在tomcat的 server.xml中修改下面这段 <Connector port="8080" protocol="HTTP/ ...

  4. leetcode@ [315/215] Count of Smaller Numbers After Self / Kth Largest Element in an Array (BST)

    https://leetcode.com/problems/count-of-smaller-numbers-after-self/ You are given an integer array nu ...

  5. BNUOJ-29364 Bread Sorting 水题

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29364 题意:给一个序列,输出序列中,二进制1的个数最少的数.. 随便搞搞就行了,关于更多 ...

  6. Android实例-使用电话拨号器在移动设备上(官方)(XE8+小米2)

    源文地址: http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mob ...

  7. 关于UIImage类的对象两种初始化方法的区别

    1.imageNamed: UIImage *image = [UIImage imageNamed:"]; UIImage的类方法 第一次读取图片的时候,先把这个图片放到缓存中,下次再使用 ...

  8. 【STL源码学习】STL算法学习之四

    排序算法是STL算法中相当常用的一个类别,包括部分排序和全部排序算法,依据效率和应用场景进行选择. 明细: sort 函数原型: template <class RandomAccessIter ...

  9. 编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

    package animal; public class Animal { //成员属性 private String kind; public String getKind() { return k ...

  10. Unity3D-UnityVS的安装和使用

    我们先下载UnityVS,在下面这个网站的资源中搜索一下 http://www.u3dchina.com/portal.php 安装完毕后,执行以下操作 1:打开你的Unity项目 2:在Unity中 ...