border屬性的多方位應用和實現自適應三角形

2021-09-11 11:43:04 字數 4276 閱讀 7431

border屬性是在實際的應用中使用頻率比較高的乙個屬性,除了作為邊框使用,利用border屬性的一些特徵以及表現方式,可以在實現一些比較常見的效果(如等高布局,上下固定內容滾動布局和繪製css圖示等),利用css3新增的屬性值(如使用填充邊框)可以實現一些更複雜的效果。

本文不介紹border的屬性的基本應用方法,將直接介紹如何通過border屬性實現一些常見的效果。

利用border畫三角形和梯形等多邊形

在css中,常見的平面圖形為矩形以及圓形。但是難免有些情景需要我們利用css去繪製三角形、梯形和平行四邊形等。此時我們可以利用border在渲染時的一些表現特點來實現這些功能。以下講解如何一步一步得到三角形。

首先我們寫乙個div,樣式如下

.border 複製**
瀏覽器渲染後效果如下:

我們發現,通過給div的四個邊框設定不同的顏色,其渲染後的表現形式為四個梯形組成的邊框。

如果我們把高度定義為0,那麼渲染後如下:

如果我們再把寬度設定為0,結果如下:

到此為止,通過對比以上定義的不同的樣式,我們發現,在css中,邊框的表現實際上以梯形的形式來渲染的(這可能與groove等3d效果的屬性值有關,具體沒去深入研究)。當元素的寬高為0時就會變成擠在一起的四個三角形。因此,我們可以想到,如果把其中的三個邊框的顏色定義為透明色transparent,然後通過包裹在乙個外層容器上,並給外層容器設定overflow:hidden,那麼我們將得到乙個等腰梯形或者三角形。現在我們把css修改如下:

.trapezoid 複製**
我們將得到以下梯形:

將樣式設定為如下:

.******** 複製**
我們將得到以下三角形:

由於所有的二維多邊形可以劃分為多個三角形組成,加上border這種表現形式的基礎,我們可以通過設定不同邊框寬度值、顏色以及借住偽元素或者多個元素的拼接可以實現更為複雜的一些圖形,理論上我們可以用css繪製任何的多邊形。比如多角星,菱形,以及我們常見的聊天氣泡等。如下為其中幾個例子

利用border實現左右兩欄等高布局

在實際上專案中,我經常會有左右兩欄布局的需求,比如後台管理的左側選單欄區域和右側的內容區域以及類似京東分類導航的布局,如下圖。

實現這種布局有很多解決方案,比如利用padding和margin相互抵消的方法即可實現。但是如果利用border來實現的話,可能可以使css更加簡潔,適用性和相容性也會更高。比如針對第一張圖的效果,我們有如下html結構。

class="menu">

首頁li>

商品管理li>

營銷中心li>

會員管理li>

系統設定li>

ul>

div>

class="content">這裡是內容區域div>

複製**

以及以下主要的css:

.menu 

.content 複製**

由於border寬度不支援百分比值,所以這種實現方法的缺點是難以直接做到左右兩側寬度按比例自適應。

利用border實現移動端上下固定布局

在移動端上的應用,頁面的頭部和底部固定,中間內容區域滾動是常見的布局,如下圖。

實現這種布局同樣是有多種實現方法,一般是利用上下fixed定位(fixed定位在移動端會有呼起鍵盤錯位和結合transform使用時的bug,這個另外寫文章分析),再借助margin,padding來實現。但是如果利用border來實現不僅**簡潔,相容性也高。其核心的樣式為在內容區域增加透明的上下邊框,上邊框的寬度等於頭部高度,下邊框的寬度等於腳步高度。如下:

header,footer 

header

footer

.container 複製**

利用這種方法,我們同樣也可以實現背景的定位,比如為新增水印時水印的右下角和左上角等定位。

border-color使用技巧

由於在border不指定顏色時其顏色值等於標籤的字型顏色值,我們可以利用此特點做一些效果。比如:具有邊框的a標籤,正常狀態下邊框和字型顏色為灰色,滑鼠經過時為藍色,如下:

一般情況下,我們會用偽元素來寫裡面的加號,當滑鼠經過時要同時改變邊框色值,字型色值和偽元素的背景色值,但是利用這屬性,我們只需要改變a標籤的字型色值。**如下。

a 

a:hover

a:before,a

:after

a:after

a:before 複製**

實現乙個自適應三角形

有時候我們會有做自適應三角形效果的需求,比如下圖。這是乙個註冊頁面,設計需求為:在註冊頁面頂部的兩個身份的選擇為兩個灰色背景的矩形,寬度自適應。當選中其中乙個身份時變為藍色背景的五邊形。

實現這個需求可以用svg或者css3的clip-path屬性來實現,但假如我們要借助border來實現,該怎麼做呢?

我們對ui元素進行拆分,有多種拆分方法很自然的是把啟用狀態下的形狀拆分為頂部的矩形和底部的等腰三角形。這樣可以借助偽元素以及邊框畫三角形的方法進行css樣式的定義。但問題來了,因為兩個標籤的寬度是自適應的,那麼邊框寬度的值也需要自適應,然而邊框的寬度值是不支援百分比的。??怎麼辦?這時我們第乙個想到的方法自然會是用js動態計算,但是不是不借助js動態計算就沒有辦法了呢?我們可以畫個圖進行分析。

假設分割後的三角形形成的矩形區域為父級元素(圖中藍色部分),實際的三角形為相對於該元素定位的子元素或者偽元素(這裡選用偽元素,圖中的紅藍交叉部分),那麼我們的標籤只需要乙個div

當我們要讓三角形隨著矩形自適應,其理想狀態應該為圖中紅色和藍色交叉部分(上邊框+透明的左右邊框實現的三角形)。由border-width不支援百分比值,我們姑且先給邊框寬度乙個足夠大的值,通過定位後,就成了圖中紅色三角形的部分。溢位的部分,我們在父級進行overflow:hidden即可,這樣乙個自適應的三角形就實現了。剩下的就是如何去定位和如何設定這個值。

我們假設父級的寬度為a,高度為b,三角形的border-top為y,border-left和border-right為x。在未進行定位之前,a點應該與b點重合,通過定位後,a點與b點相對位置為(-(x-0.5a) , -(y-b))。此時我們又遇到乙個問題,就是x和y為乙個固定的大值,a和b為乙個百分比值,那麼css就要進行計算才能定位,用css3的calc屬性可以解決,但是可能會有相容性問題。我們通過思考,換個角度,如果能夠讓a點相對於c和d的中點定位,那相對位置就變為(-x,-y),問題就好辦了。我們把做一下改變,如下圖:

如果我們把父級的高度設定為0,利用padding-top來撐開高度,把寬度設定為0.5a,利用padding-left來撐開另外的0.5a,那麼a點就相對於p點定位(p點此時為內容區域的左上角)了。此時,a相對於p的位置為(-x,-y)。至此,通過以下樣式即可實現乙個響應式三角形。(注意border-left和border-top的比例,根據相似三角形特徵計算即可)

div>

複製**

div 

div:after 複製**

效果如下:

有了這個方法,就可以實現上面的註冊頁tab標籤的設計。同時通過調整各個引數,一樣可以實現各種型別的三角形。設要定義的等腰三角形底為2x,高為y,父級需要的寬為2a,高為b。那麼各個值滿足的關係如下:

border-left = border-right = x = -margin-left;

border-top / padding-top = x / a;

margin-top = -border-top;

至於border-left的取值則根據實際需要設定乙個大值即可,

而border-top與三角形的形狀有關,即與a和b比例有關複製**

以上為border屬性的一些特點和實際應用,後期將會繼續更新更多的特點和使用場景。暫且先寫這些。

實現多方位網路營銷的一些技巧

在網路營銷的優勢逐漸被企業意識到的形式下,越來越多的企業開始加入網路營銷的陣營。但是很多企業並不懂網路營銷,他們都希望通過簡單的方式實現多方位網路營銷。在網路平台越來越多,網路營銷的競爭越來越激烈的形式下,企業的網路營銷要達到顯著效果,確實要實現多方位網路營銷。但是一些企業對網路營銷本就缺乏經驗,要...

阿卡索的2018,多方位嘗試探索新發展

隨著經濟的快速增長 新興商業模式層出不窮,在這中國的網際網路 大潮裡,7 年時間可以改變什麼呢?阿卡索,這家成立於 2011 年的中國 英語教育品牌,在 7 年多的發展中,不斷嘗試探索新的發展,力求能為使用者提供最優質的教育服務。回顧 2018 年,英語教育充滿了機遇和挑戰。一方面,英語教育不斷獲得...

border和css的背景屬性

1 background color red 2 background image url 背景圖預設顯示狀態 a 當背景圖小於容器尺寸 平鋪 b 當背景圖等於容器尺寸 一張 c 當背景圖大於容器尺寸 只顯示容器區域 3 控制背景圖是否平鋪以及平鋪狀態 background repeat 屬性值 r...