web前端教程:用 CSS 實現三角形與平行四邊形

来源:http://www.cnblogs.com/jiaoyu121/archive/2017/06/10/6979568.html
-Advertisement-
Play Games

最近在逛某個技術網站的時候,感覺文章關鍵詞上的樣式好酷炫啊,分頁的樣式。來張截圖: 你在首頁的底部也可以看到這樣一個分頁欄;是不是看上去還不錯?下麵就來看看這是如何實現的吧~ 第一種方法:利用border 第一種方法是藉助border屬性 hack 出三角形,然後通過一個矩形拼接兩個三角形最終製造出 ...


最近在逛某個技術網站的時候,感覺文章關鍵詞上的樣式好酷炫啊,分頁的樣式。來張截圖:

你在首頁的底部也可以看到這樣一個分頁欄;是不是看上去還不錯?下麵就來看看這是如何實現的吧~

第一種方法:利用border

第一種方法是藉助border屬性 hack 出三角形,然後通過一個矩形拼接兩個三角形最終製造出一個平行四邊形。為什麼使用border可以產生三角形呢?先來看看一張圖片:

看了圖中的三個小圖形的變化過程,你應該已經清楚了一半。其實 hack 出三角形只需要兩個條件,第一,元素本身的長寬為0;其次,將不需要的部分通過 border-color 來設置隱藏。通過類似的方法,你還可以創造出梯形,上圖中的三個圖形的代碼如下。

#first {

width: 20px;

height: 20px;

border-width: 10px;

border-style: solid;

border-color: red green blue brown;

}

#second {

width: 0;

height: 0;

border-width: 10px;

border-style: solid;

border-color: red green blue brown;

}

#third {

width: 0;

height: 0;

border-width: 10px;

border-style: solid;

border-color: red transparent transparent transparent;

}

接下來就要考慮如何拼接出一個平行四邊形了。在border法中,它由三部分組成,分別是左三角形、矩形、右三角形。如果每次繪製平行四邊形都要創建三個元素顯然過於麻煩了,所以在這裡:before和:after偽元素是個不錯的選擇。下麵我們實現一下這樣的效果:

為了將三角形與矩形無縫拼接到一起,多處屬性要保持一致,所以使用類似 Less, Sass, Stylus 等 CSS 預處理器來寫這段代碼會更容易維護,下麵給出 Scss 版本的代碼。

//三角形的寬高

$height: 24px;

$width: 12px;

//對平行四邊形三部分的顏色進行賦值

@mixin parallelogram-color($color) {

background: $color;

&:before { border-color: transparent $color $color transparent; }

&:after { border-color: $color transparent transparent $color; }

}

//單個三角形的樣式

@mixin triangle() {

content: '';

display: block;

width: 0;

height: 0;

position: absolute;

border-style: solid;

border-width: $height/2 $width/2;

top: 0;

}

//平行四邊形的樣式

.para {

display: inline-block;

position: relative;

padding: 0 10px;

height: $height;

line-height: $height;

margin-left: $width;

color: #fff;

&:after {

@include triangle();

right: -$width;

}

&:before {

@include triangle();

left: -$width;

}

@include parallelogram-color(red);

}

需要註意的是,如果通過 $height、$width 設置的三角形斜率太小或太大都有可能造成渲染出鋸齒,所以使用起來要多多測試一下不同的寬高所得到的視覺效果如何。

如果你想學習交流html5等web前端技術,想多瞭解一些前端方面的內容,可以加入我們的QQ學習群:27062964,一起學習交流,提升自己,有學習資料和源碼分享。或者點擊鏈接直接加入群:https://jq.qq.com/?_wv=1027&k=48DmPsZ

第二種方法:利用transform

使用transform來實現平行四邊形的方法,效果大概是這個樣子:

看到之後覺得好神奇啊,原來還可以只有平行四邊形的外輪廓。(因為方法一隻能創造填充效果的平行四邊形)實現起來非常簡單,主要是藉助了transform: skew(...),下麵就來看看源碼吧。

 

.city {

display: inline-block;

padding: 5px 20px;

border: 1px solid #44a5fc;

color: #333;

transform: skew(-20deg);

}

 

上海

 

於是我們得到了這樣的效果:

看到圖片的你一定是這樣想的:

彆著急嘛,我們的確是把整個 div 進行了歪曲,導致中間的文字也是傾斜的,而這顯然不是我們所要的效果。所以我們需要加一個內層元素,並對內層元素做一次逆向的歪曲,從而得到我們想要的效果:

實現代碼如下,另附CodePen 示例

 

.city {

display: inline-block;

padding: 5px 20px;

border: 1px solid #44a5fc;

color: #333;

transform: skew(-20deg);

}

.city div {

transform: skew(20deg);

}

 

 

 

 

上海

 

總結

第一種方法使用 border 屬性 hack 出三角形,並通過對三個元素進行拼接最終實現了平行四邊形;而第二種方法則通過 transform: skew 來得到平行四邊形。總體來說,第二種方法相對於第一種代碼量小得多,而且也很好理解。唯一的不足是無法構造像本站的分頁中所使用的梯形。

希望本文對各位有所幫助。

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入學習交流群
343599877,我們一起學前端!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Bootstrap</tit ...
  • 在a.less中導入base.lessa.less中的代碼 base.less中的代碼 @value的值為[ripple, .5s, linear]"@{value}"成為字元串"[ripple, .5s, linear]",避免js解析錯誤。~避免編譯,不加則輸出為"ripple"Tips: 少一 ...
  • 之前對事件模型還是比較清楚的,許多概念都清晰映射在腦海中。工作之後,一方面使用的 局限性,二是習慣於用框架中的各種事件監聽方式,簡單即方便,久而久之,事件的一些概念開 始淡出記憶中,就像我現在已經開始淡忘C語言的指針、麥克斯韋方程組、矩陣的變換、最小二乘 法等。知識就像五彩繽紛的鵝卵石鋪墊在你前行的 ...
  • 基礎框架 瞭解HTML的代碼註釋 什麼是代碼註釋?代碼註釋的作用是幫助程式員標註代碼的用途,過一段時間後再看你所編寫的代碼,就能很快想起這段代碼的用途。代碼註釋不僅方便程式員自己回憶起以前代碼的用途,還可以幫助其他程式員很快的讀懂你的程式的功能,方便多人合作開髮網頁代碼。 語法: <!--註釋文字 ...
  • 上手簡單,讓Atom能夠成為了一款優雅而低門檻的神器,深度可定製的特性,讓Atom在你的打磨之下,變得越來越符合你的心意 ...
  • 理解Node.js 為了理解Node.js是如何工作的,首先你需要理解一些使得Javascript適用於伺服器端開發的關鍵特性。Javascript是一門簡單而又靈活的語言,這種靈活性讓它能夠經受住時間的考驗。函數、閉包等特性使Javascript成為一門適合Web開發的理想語言。 有一種偏見認為J ...
  • 1 new Object() 先創建一個Object實例,然後為它添加屬性和方法 2 對象字面量法 對象字面量法是創建對象最快捷方便的方式,在很多場景下被使用。 對象字面量法的缺點是創建多個同類對象時,會產生大量重覆代碼,因此有了工廠模式。 3 工廠模式 工廠模式用函數封裝了創建對象的細節,調用函數 ...
  • 哈哈哈 哈哈哈 每個人都是獨立的個體,大白也不例外,仔細觀察大白有一個圓圓的頭加一對黑溜溜的眼睛,沒有腹肌的軀幹和一顆裸露的心臟,圓滾滾的肚子兩邊一對寬厚的臂膀,仔細看還有兩個萌萌噠小手指呢,最後一對粗的像大象一樣的大腿才能支撐這軟軟的肚子嘛,哈哈~ 因為大白是白的,所以我們可以定義一個深顏色的背景 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...