《三分鐘閱讀》CSS對話框小尾巴實現的最佳方式

三分鐘閱讀:給本身3分鐘的時間,拾起本身遺漏的知識點,第3期css

前言

對話框小尾巴,估計你們在實際開發中應該常常遇到過,省事點的就是叫設計小姐姐給切個帶小尾巴的背景圖,那不省事的呢?html

邊框的魔法

在css3出來以前,若經過css來實現小尾巴效果,可能使用最多的是經過以下的hack方式:css3

<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方向上單獨設置不一樣的邊框顏色便可。sass

這種方式是挺奇妙的,但存在如下幾個問題:flex

  1. 若是父元素tooltip設置邊框顏色,小尾巴顏色就法設置了,由於小尾巴自己就是經過邊框魔法實現的
  2. 小尾巴沒法繼承父元素的背景色,若是父元素背景色變化了,小尾巴得從新設置顏色
  3. 小尾巴的形狀沒法支持多樣化,好比下次咱們想換個圓角的小尾巴,這種方式就沒法實現了

被咬了一口的樣式,殘缺的美~網站

clip-path

針對以上問題,如今有了一種特別好的方式,就是經過css3新增的clip-path屬性來實現ui

clip-path屬性能夠建立一個只有元素的部分區域能夠顯示的剪切區域,區域內的部分顯示,區域外的隱藏spa

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);
  }
}
複製代碼
相關文章
相關標籤/搜索