css border 三角形陰影(不規則圖形陰影) & 多重邊框的制作


前言:這是筆者學習之后自己的理解與整理。如果有錯誤或者疑問的地方,請大家指正,我會持續更新!

border 的組合寫法

  border:border-width border-style border-color;

  • border-width:邊框寬度,不能為百分比,因為不會根據設備寬度改變;同理,outline | text-shadow | box-shadow 也不可以;
  • border-style:邊框樣式,一般用 solid 多一點,dashed(虛線)、dotted(點狀線)也有;
  • border-color:邊框顏色,默認顏色是元素的文本顏色,如果沒有設置,那就從父元素繼承文本顏色;

  邊框可以根據方向單獨設置,上下左右,border-top | border-bottom | border-left | border-right ;

  所以屬性也可以單獨設置,border-top-width | border-top-style | border-top-color ;

  單屬性也可以有組合寫法:

  • border-width:上   右   下   左;(順時針方向)
  • border-width:上   左右   下;
  • border-width:上下   左右 ;
  • border-width:四個方向;
  • border-style | border-color也可以這樣設置;

  還可以根據方向來用組合寫法:

  • border-left : 邊框寬度 邊框樣式 邊框顏色;

用 border 做圖形

  邊框的交界處是斜線,大師們用這個特性做出了三角形,配合其他屬性,可以做出各種圖形;

  原理就是:控制四個方向的邊框顏色,就可以做出三角形。再控制寬度,就可以做出各種不同的鈍角、銳角三角形;

    .triangle {
      border-style: solid;
      border-width: 30px 50px 60px 80px;
      /*我們可以控制各方向邊框的寬度,做出各種不同的三角形*/
      border-color: #f00 #0f0 #00f #0ff;
      /*四個方向的顏色自由設置,當設置其他三個方向或兩個方向的顏色為transparent(透明色)時,另一方向就成了一個三角形*/
      width: 0;
      /*盒子寬度為0,四個方向的border寬度一致,可以用border做正方形*/
      margin: 100px;
    }

 

  我比較喜歡根據方向來寫三角形,這樣容易理解:

  

    .triangle {
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #0ff;
      /*我們一般根據方向來寫三角形,這樣容易記憶;箭頭指向的反方向的顏色設置為你想要的,然后箭頭方向不要寫,另外兩個方向的顏色設置為transperent透明*/
    }

 

小三角的陰影

  三角形做出來了,但是當我們給元素定義一個 box-shadow,會出現如下情況:

  如果不想要陰影,很好解決,刪掉三角形的 box-shadow 就好了;

  而在實際應用中,我們很多情況下是需要陰影的,只是陰影出現在三角形的兩條邊上,下圖給容器設置了陰影;

  

方法一:

  我們可以在加一個元素,也寫成三角形,設置層級比箭頭和容器元素都小,並且設置濾鏡,位置比箭頭稍高,露出邊緣部分就可以了;

  當我們把之前的箭頭刪掉,就是如右圖:

  

  完成品:

  

  PS:濾鏡也有兼容性問題,建議用谷歌瀏覽器測試;

  <style type="text/css">
    .note {
      margin: 100px;
      width: 200px;
      height: 80px;
      background: #f60;
      position: relative;
      border-radius: 5px;
      box-shadow: 0 0 10px 0px #000;
      /*水平偏移---垂直偏移---模糊度---擴張半徑---顏色*/
    }

    .triangle {
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #f60;
      /*我們一般根據方向來寫三角形,這樣容易記憶;箭頭指向的反方向的顏色設置為你想要的,然后箭頭方向不要寫,另外兩個方向的顏色設置為transperent透明*/
      position: absolute;
      top: -10px;
      left: 50%;
      margin-left: -10px;
    }

    .filter {
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #000;
      position: absolute;
      top: -10px;
      left: 50%;
      margin-left: -10px;
      z-index: -1;
      filter: blur(2px);
      /*這又設計到濾鏡的知識*/
    }
  </style>
  <div class="wrapper">
    <div class="note">
      <span class="triangle"></span>
      <span class="filter"></span>
    </div>
  </div>

 

方法二:

  還是 filter,但是設置 drop-shadow;

  drop-shadow 不支持內陰影,但是支持不規則圖形的陰影。

  

  <style type="text/css">
    .note {
      margin: 100px;
      width: 200px;
      height: 80px;
      background: #f60;
      position: relative;
      border-radius: 5px;
      /*box-shadow: 0 0 10px 0px #000;*/
      /*水平偏移---垂直偏移---模糊度---擴張半徑---顏色*/

      filter: drop-shadow(0 0 6px #000);
      /*看清楚哦,drop-shadow沒有擴張半徑*/
    }

    .triangle {
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #f60;
      /*我們一般根據方向來寫三角形,這樣容易記憶;箭頭指向的反方向的顏色設置為你想要的,然后箭頭方向不要寫,另外兩個方向的顏色設置為transperent透明*/
      position: absolute;
      top: -10px;
      left: 50%;
      margin-left: -10px;
    }
  </style>
  <div class="wrapper">
    <div class="note">
      <span class="triangle"></span>
    </div>
  </div>

 

小三角的邊框

  三角形陰影問題解決方法如上。

  同理,三角形的邊框也可以這樣寫:寫個三角形,沉在箭頭下邊,顏色設置成邊框顏色,位置比箭頭稍高一些(容器邊框寬度值),就可以了;

  接下來我使用 :after 和 :before 寫的三角形和邊框,同理上面的陰影也可以這樣;

  <style type="text/css">
    .note {
      margin: 100px;
      width: 200px;
      height: 80px;
      background: #f0f;
      position: relative;
      border-radius: 5px;
      border: 1px solid #000;
    }

    .note:after {
      content: "";
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #f0f;
      /*我們一般根據方向來寫三角形,這樣容易記憶;箭頭指向的反方向的顏色設置為你想要的,然后箭頭方向不要寫,另外兩個方向的顏色設置為transperent透明*/
      position: absolute;
      top: -10px;
      left: 50%;
      margin-left: -10px;
    }

    .note:before {
      content: "";
      border-left: 10px solid transparent;
      border-right: 10px solid transparent;
      border-bottom: 10px solid #000;
      position: absolute;
      top: -11px;
      /*寫個三角形,沉在箭頭下邊,顏色設置成邊框顏色,位置比箭頭稍高一些(容器邊框寬度值),就可以了*/
      left: 50%;
      margin-left: -10px;
      z-index: -1;
    }
  </style>
  <div class="wrapper">
    <div class="note"></div>
  </div>

 

border-radius 圓角

  css3 屬性 border-radius,“邊框半徑”,值可以用 px、em、pt、百分比等。

  border-radius 支持四個角使用不同弧度,方向依次是左上--右上--右下--左下(是從左上開始,順時針)。

  border-radius 還可以單獨對每個角設置:

  • border-top-left-radius
  • border-top-right-radius
  • border-bottom-right-radius  
  • border-bottom-left-radius

  單獨設置可以寫兩個值,第一個值是水平半徑,第二個值是垂直半徑;如果只有一個值,那么水平和垂直相等。

  <style type="text/css">
    * {
      padding: 0;
      margin: 0;
    }

    .test {
      width: 200px;
      height: 80px;
      margin: 100px;
      background: #f0f;
      border-radius: 15px 20px 35px 50px / 10% 25% 1em 50%;
      /*水平-----/-----垂直,中間用“/”隔開*/
      /*左上水平   右上水平   右下水平   左下水平  /  左上垂直   右上垂直   右下垂直   左下垂直*/
      /*這種方法不推薦使用,太亂了,傻傻分不清楚*/
    }
  </style>
  <div class="test"></div>

  當然,這個屬性我們用的最多的就是畫圓形,把值設成寬度的一半及以上(50%及以上)

多重邊框

outline 制作多重邊框

  有的需求是邊框外面還有邊框,我們可以用 outline 來寫,有一個相關的屬性 outline-offset,可以控制描邊與邊緣的位置關系,可以設置成負值;

  outline 制作多重邊框,最多只能兩層,而且不能是弧形的;

    .test {
      margin: 100px;
      width: 200px;
      height: 80px;
      border: 10px solid #f0f;
      outline: 15px solid #f90;
      outline-offset: -25px;
    }

 

box-shadow 制作多重邊框

  box-shadow 可以做很多層(多了會很卡,電腦性能問題),而且配合 border-radius 屬性可以做出弧形;

  box-shadow 是不占據空間的,所以無法響應事件,我們可以利用 inset 設置成內陰影,在擴大空間就好了;

    .test {
      margin: 100px;
      width: 200px;
      height: 80px;
      border: 10px solid #f0f;
      border-radius: 25% 30% 50% 29%;
      box-shadow: 0 0 0 10px #0f0, 0 0 0 20px #ff0, 0 0 0 10px #0ff inset;
      /*水平偏移---垂直偏移---擴張半徑---模糊度---顏色*/
      /*可以寫多個陰影,用逗號隔開*/
      /*inset是內陰影*/
      /*由於box-shadow屬性並不占據空間,所以是無法響應事件的,我們可以利用inset內陰影,再用padding擴充空間就好了*/
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM