《三分钟阅读》CSS对话框小尾巴实现的最佳方式

三分钟阅读:给自己3分钟的时间,拾起自己遗漏的知识点,第3期

前言

对话框小尾巴,估计大家在实际开发中应该经常遇到过,省事点的就是叫设计小姐姐给切个带小尾巴的背景图,那不省事的呢?

边框的魔法

在css3出来之前,若通过css来实现小尾巴效果,可能使用最多的是通过如下的hack方式:

<div class="tooltip">
    <p>我是快乐的小尾巴的爸爸</p>
    <span class="triangle"></span>
</div>
复制代码
 .tooltip {
    position: relative;
    background-color: silver;
    width: 200px;
    height: 50px;
    border-radius: 0.25em;
    display: flex;
    justify-content: center;
    align-items: center;
    border:1px solid red;
}

.triangle {
    display: block;
    height: 0px;
    width: 0px;
    border: 10px solid transparent;
    border-top-color: silver;
    background:red;
    position: absolute;
    bottom: -20px;
    left: calc(50% - 10px);
}

复制代码

效果如下:

不设置triangle宽高,设置border10像素的透明边框,然后设置top方向边框颜色和父元素一致就可完成这样的效果,同理,变换小尾巴箭头方向只需要在top,bottom,left,right方向上单独设置不同的边框颜色即可。

这种方式是挺奇妙的,但存在以下几个问题:

  1. 如果父元素tooltip设置边框颜色,小尾巴颜色就法设置了,因为小尾巴本身就是通过边框魔法实现的
  2. 小尾巴无法继承父元素的背景色,如果父元素背景色变化了,小尾巴得重新设置颜色
  3. 小尾巴的形状无法支持多样化,比如下次我们想换个圆角的小尾巴,这种方式就无法实现了

被咬了一口的样式,残缺的美~

clip-path

针对以上问题,现在有了一种特别好的方式,就是通过css3新增的clip-path属性来实现

clip-path属性可以创建一个只有元素的部分区域可以显示的剪切区域,区域内的部分显示,区域外的隐藏

css代码如下:

.triangle {
    display: block;
    height: 20px;
    width: 20px;
    background-color: inherit;
    border: inherit;
    position: absolute;
    bottom: -10px;
    left: calc(50% - 10px);
    // ---关键代码 start---
    clip-path: polygon(0% 0%, 100% 100%, 0% 100%);
    transform: rotate(-45deg);
    // ---end---
    border-radius: 0 0 0 2px;
}
复制代码

我们可以看到triangle继承了父元素tooltip的边框颜色以及背景色,同时我们还设置了小尾巴2个像素的圆角。

其中polygon多边形的坐标如下:

深绿色块就是我们要显示的区域,然后逆时针翻转45度就成了我们想要的样式。

多么好的方式呀!

那浏览器兼容性如何呢?我查看了下Caniuse这个网站,除了老IE基本其它浏览器都支持,所以开心的用起来吧!

最后提供一个sass的mixin,参数是上下左右四个方向。

@mixin triangleMixin ($direction) {
  background-color: inherit;
  border: inherit;
  clip-path: polygon(0% 0%, 100% 100%, 0% 100%);
  
  @if( $direction == left ) {
    transform: rotate(45deg);
  } @else if( $direction == right ) {
    transform: rotate(-135deg);
  } @else if( $direction == down ) {
    transform: rotate(-45deg);
  } @else {
    transform: rotate(135deg);
  }
}
复制代码
以下是利用51单片机实现数码管倒计时的代码: ```c #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 数码管显示0-9的编码表 void delay(uint i) // 延时函数 { while (i--); } void main() { uchar minute = 3, second = 0; // 初始化倒计时的时间 while (1) { P2 = 0x00; // 关闭数码管,准备显示下一个数字 P0 = table[minute / 10]; // 显示分钟的十位 P2 = 0x01; // 打开数码管,显示分钟的十位 delay(1000); // 延时1秒 P2 = 0x00; // 关闭数码管,准备显示下一个数字 P0 = table[minute % 10]; // 显示分钟的个位 P2 = 0x02; // 打开数码管,显示分钟的个位 delay(1000); // 延时1秒 P2 = 0x00; // 关闭数码管,准备显示下一个数字 P0 = table[second / 10]; // 显示秒钟的十位 P2 = 0x04; // 打开数码管,显示秒钟的十位 delay(1000); // 延时1秒 P2 = 0x00; // 关闭数码管,准备显示下一个数字 P0 = table[second % 10]; // 显示秒钟的个位 P2 = 0x08; // 打开数码管,显示秒钟的个位 delay(1000); // 延时1秒 if (--second == 0xff) // 秒钟减1,如果减到0,则分钟减1 { second = 59; if (--minute == 0xff) // 分钟减1,如果减到0,则倒计时结束 { break; } } } while (1); // 倒计时结束,停在这里 } ``` 需要注意的是,本代码中的延时函数是通过循环实现的,因此可能会有一定的误差。如果需要更精确的延时,可以使用定时器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值