如何用css和HTML結合畫熊,結合偽元素實現的純CSS3高級圖形繪制

自小編上次整理了一些基礎圖形的繪制方法之后,大家都紛紛表示對css3的繪圖技巧學習很有幫助。雖說萬變不離其宗,再復雜的圖形也可以用最簡單的三角形或者圓弧組合出來,但仍有不少朋友反映,學會基本圖形也不懂得怎樣組合,也不知道什么時候用偽元素比較合適。所以今天小編來一篇相對復雜的圖形繪制教程,大家看過之后就會發現,很多看似復雜的圖形(比如下圖這樣的),換一下組合方式就會變得簡單很多。

f1a13ab6bf4c2b147d3909f771156c19.png

如果你覺得以上圖形無從下手,或者覺得需要用很多個html元素來完成的話,那相信本教程對你的幫助會非常大。

現在我們先來編寫基礎的html代碼:

08c7786659bc9d7416c57c6886ee100a.png

后面我們只要往里面填充樣式和元素即可測試效果。

我們先來看一個比較簡單的形狀,雞蛋。可別小看它,想當年達芬奇光畫這個雞蛋都練了不知道多少年,所以大家也來學畫蛋吧,以后當上一名CSS3畫家。

f8653092af092d734c6d30cf156f7898.png

上次我們學習了繪制橢圓的方法,乍一看似乎在橢圓基礎上進行修改即可獲得正確的效果。但之所以能繪制出橢圓,其原因在于border-radius使用了百分比,而在一個角里面,x和y的百分比始終相等。

舉個例子,一個矩形的寬度為30px,高度為40px,如果我們讓一個角的圓角半徑等于50%,那么圓角在x方向上的半徑等于15px,y方向上的半徑等于20px,若為40%,則x方向半徑等于12px,y方向半徑等于16px,x和y的比例始終等于矩形的寬高比3:4。所以,你希望x方向上的半徑等于15px,y方向上的半徑等于30px,那用上次的方法是絕對不可能做到的。

對于這個蛋來說,我們不難發現x方向上的圓角半徑都剛好等于寬度的一半,也就是50%,但是y方向就不一樣了,上面兩個角的半徑明顯大于下面兩個角。假設上面的圓角半徑是60%,那么下面的圓角半徑就是40%了,這樣就可以確保圓角之間沒有直線連接。

那么問題來了,我們要實現的就是左上角的圓角半徑在x方向上等于50%,在y方向上等于60%,又該怎樣實現呢?

這里小編給大家介紹圓角半徑的另一個用法——通過斜杠分開x和y方向的圓角半徑。

border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

其中,/前面的部分代表x方向上的4個半徑,順序依次為左上,右上,右下,左下(從左上順時針排下來即可),自然而然地就會想到/后面的部分就代表y方向上的4個半徑,順序跟x方向的一樣。可見左上和右上的半徑都是60%,而左下和右下則均為40%。

下面給出完整的代碼,HTML部分就一個div

d993840b8de58ca3c25c7123f471becb.png

CSS代碼如下:

.egg{

display:block;

width:126px;

height:180px;

background-color:red;

-webkit-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

-moz-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

-o-border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

border-radius:50% 50% 50% 50% / 60% 60% 40% 40%;

}

接下來我們看看下面的這個圖形,非常經典的吃豆豆游戲主角。

d909d35afa1741932300360767881b94.png

學過基本圖形繪制的朋友可能會想到用三角形擦除一個圓形來得到上圖的形狀。嗯,這確實是一個方法,但局限性相當明顯,因為CSS3不存在真正意義上的擦除。所謂的“擦除”,僅僅是用跟背景一樣的顏色進行填充而已,如果背景圖不是透明的話,那這種做法就白搭了。

這里我們換個思路,首先我們知道畫三角形用的是很粗的邊框,然后利用轉角處的交界線生成三角形。

0fc1f591af30df178e9bb666eea764ba.png

所以第一步,我們先讓整個div的寬高等于0,然后設置很粗的邊框。

HTML代碼:

8ad5d33a3a08cf82ad8ffb0c18c5a790.png

CSS代碼:

.pacman{

width:0px;

height:0px;

border:60px solid red;

}

效果如下圖所示,顯示出來的是一個正方形,但實際上它沒有寬高,都是邊框在撐著。

4ecfb3e352c541c5f4c09437c8dd2311.png

根據前面介紹的原理,這個“正方形”其實是4個三角形拼接的結果。

69d8cb0f3deb689dc4756bca94b0d687.png

這樣的話,我們自然而然地就想到隱藏掉右側的邊框線,嘗試設置為0。

由于4條邊不對等了,所以我們拆分一下。

.pacman{

width:0px;

height:0px;

border-right:0 solid red;

border-top:60px solid red;

border-left:60px solid red;

border-bottom:60px solid red;

}

運行效果如下圖所示:

885eeb7e02951cde259de74e762a64f0.png

由于失去了右邊線的支撐,右側全部被截沒了,看來60px還得保留,但是又不能顯示出來,怎么辦?你可能會想到用跟背景一樣的顏色來模擬隱藏,但更好的方法是設置為transparent(透明),這樣才會讓圖形適用于所有背景(包括圖片背景)。

.pacman{

width:0px;

height:0px;

border-right:60px solid transparent;

border-top:60px solidred;

border-left:60px solidred;

border-bottom:60px solidred;

}

再次運行,效果就對了:

c5a9e078906eeb1c5fdc8e759f65d9e5.png

這時候,貌似把直角換成圓角就能得到正確的效果,我們不妨試試,圓角半徑就等于邊框的粗細。

.pacman{

/*其它樣式代碼省略*/

-webkit-border-radius:60px;

-moz-border-radius:60px;

-o-border-radius:60px;

border-radius:60px;

}

運行效果如下圖所示,果然正確了:

e1bd14884af3d88cb32ba79800c16096.png

最后我們來看看這個。天哪,數一數,12個三角形,偽元素怎么塞都塞不進啊。

92ee7cdf0032d97c6906f54752ba1b6e.png

CSS3初學者會很容易被復雜的表象所迷惑,這往往是因為制作者在圖形結構分析方面的經驗不足,無法找出多個“元素”之間的內在聯系進行重組。聽起來好像很玄乎,那么,小編就畫一個“線稿”給大家看一下吧。

d30db7658695235a9dcaedde0f6cce09.png

哈哈,這樣是不是就恍然大悟了呢?12個角,竟然就是3個旋轉角度不同的正方形重疊所得。這樣的話,總的元素數量也就3個。加上before和after偽元素的支持,這么“復雜”的圖形也就只需一個HTML元素就能搞定。

正方形每旋轉90度就重合一次,所以3個元素分下來,就是一個元素不旋轉,然后一個旋轉30度,一個旋轉60度。而旋轉可以通過CSS3的transform屬性輕松實現。

HTML代碼如下:

e561d5dbbe7a09c107c647d0d9efbc93.png

然后用CSS定義基本形狀,它不旋轉:

.burst-12{

background:red;

width:80px;

height:80px;

position:relative;

text-align:center;

}

3個元素需要重疊,因此要設置相對定位。

然后,兩個偽元素的形狀跟burst-12完全一致,不同的只是要絕對定位,所以before和after偽元素可以一起定義。

.burst-12:before,.burst-12:after{

content:"";

position:absolute;

top:0;

left:0;

height:80px;

width:80px;

background:red;

}

最后,我們讓before旋轉30度,after旋轉60度,效果就完成了。

.burst-12:before{

-webkit-transform:rotate(30deg);

-moz-transform:rotate(30deg);

-ms-transform:rotate(30deg);

-o-transform:rotate(30deg);

}

.burst-12:after{

-webkit-transform:rotate(60deg);

-moz-transform:rotate(60deg);

-ms-transform:rotate(60deg);

-o-transform:rotate(60deg);

}

小編相信,只要用心學習,技術再菜的童鞋也能照著教程把里面的圖形全部繪制出來。然而要是換成其它圖形,我想還是會有人說畫不出來,或者要繞很大一個圈子才能做得到。這也是情理之中的事情,畢竟這當中的技巧沒有一般的規律可循,更多的是經驗的積累。所以要在實戰用運用自如,除了熟悉一些常用的手法之外,還要多參考成功的案例,從中獲取更多的靈感。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458780.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于C++中常見內存錯誤的總結

在系統開發過程中出現的bug相對而言是比較好解決的,花費在這個上面的調試代價不是很大,但是在系統集成后的bug往往是難以定位的bug(最好方式是打樁,通過打樁可以初步鎖定出錯的位置,如:進入函數前打印日志&…

UWP開發細節記錄:判斷文件類型

StorageFile.ContentType 屬性,是 string 類型,用來表示文件內容的 MIME 類型。例如,音樂文件可能有 "audio/mpeg" MIME 類型。(MSDN) MIME 類型的定義可以下面的鏈接找到: MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

轉載請注明 http://blog.csdn.net/eclipsexys 翻譯自Developer Android。時間倉促,有翻譯問題請留言指出,謝謝創建Lisst和Cards在你的應用程序創建復雜的清單,并與材料設計風格卡。您能夠使用RecyclerView和CardView部件。 創建RecyclerView …

計算機考研自命題院校雙非,計算機考研408——951211院校匯總

眾所周知,計算機考研408計算機學科基礎綜合難度與一些頂尖985自命題相比也是不落下風的,號稱最難工科專業課(請忽略912這種殿堂級別的),難度大、知識點龐雜也是前些年眾多高校紛紛脫離408統考的原因。19年的計算機類考研火到爆炸,…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓搗Docker,- - ! 報錯: serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 轉載于:https://www.cnblo…

新手學Struts(一)----JSP+Servlet講解MVC實現原理

MVC基本原理一個簡單的例子改良的例子Struts基本流程的實現最近在學SSH(Struts HibernateSpring),這也算是一個比較經典的框架了,之前都是看人家大牛說這個框架,那個框架,說的真溜,自己也是佩服的五體投地啊…

中國首臺千萬億次超級計算機,中國首臺千萬億次超級計算機首批設備開始試用...

新華社天津1月13日電(記者 周潤健 羅捷)記者13日從國家超級計算天津中心獲悉,中國首臺千萬億次超級計算機“天河一號”首批設備調試工作結束,具備向客戶提供服務的條件,“天河一號”…

Outlook Express 錯誤代碼表

錯誤碼 意義 一般 0x800C01310x800C013E 可能是 Folders.dbx 檔案屬性錯誤或損壞. 0x800CCC00 身份驗證(Authentication)未載入 0x800CCC01 認證(Certificate)內容錯誤 0x800CCC02 認證日期錯誤 0x800CCC03 使用者已聯機 0x800CCC…

USB設備枚舉過程

(1)集線器檢測新設備 (集線器的英文稱為“Hub”)主機集線器監視著每個端口的信號電壓,當有新設備接入時便可覺察。(集線器端口的兩根信號線的每一根都有15kΩ的下拉電阻,而每一個設備在D都有一個…

windows下apache+php+mysql 環境配置方法

轉自:http://www.jb51.net/article/30128.htm 一 準備 1 下載apache http://httpd.apache.org/download.cgi#apache24 httpd-2.2.22-win32-x86-openssl-0.9.8t.msiopenssl表示帶有openssl模塊,利用openssl可給Apache配置SSL安全鏈接 2 下載php http://wi…

計算機工作原理 公開課,《計算機的基本工作原理》公開課材料(11頁)-原創力文檔...

《計算機系統的組成》教學設計教師:吳軍一、學習者分析初一的學生,具有活潑好動的特點,懷著對初中生活的憧憬來到一個新的環境里,對每樣事物都充滿著好奇,都想去探個究竟。隨著社會的進步, 計算機的使用范圍…

USB枚舉過程分析

1. 枚舉是什么? 枚舉就是從設備讀取一些信息,知道設備是什么樣的設備,如何進行通信,這樣主機就可以根據這些信息來加載合適的驅動程序。調試USB設備,很重要的一點就是USB的枚舉過程,只要枚舉成功了,那么就…

linux -- read(), write()

read()函數 2011-03-23 16:28:37| 分類&#xff1a; linux | 標簽&#xff1a; |字號大中小 訂閱 read函數從打開的設備或文件中讀取數據。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值&#xff1a;成功返回讀取的字節數&…

jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及區別

jQuery為開發插件提拱了兩個方法&#xff0c;分別是&#xff1a; jQuery.fn.extend();jQuery.extend(); 雖然 javascript 沒有明確的類的概念&#xff0c;但是用類來理解它&#xff0c;會更方便。 jQuery便是一個封裝得非常好的類&#xff0c;比如我們用 語句 $("#btn1&…

CATia對計算機配置要求,【2人回答】求CATIA對電腦的詳細配置要求-3D溜溜網

回答&#xff1a;1、內存要求在32G和64G之間。2、硬盤要求選擇7200轉機械硬盤&#xff0c;4k以上分辨&#xff0c;就選擇SSD固態硬盤。3、CPU要求睿頻在4.1GHZ以上&#xff0c;核心在6和8核之間。4、顯卡要求顯存在6GB和11GB之間&#xff0c;位寬要求在192bit和384bit之間。5、…

如何制作自動更新程序?

原文出自&#xff1a;http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自動更新程序&#xff1f; [版權所有 邱秋 2014 metaphysisyeah.net, 轉載請注明出處] 最近為單位寫了一個C/S結構的軟件&#xff0c;這個軟件是工作在單位的局域網內的。為了減輕為程序…

包含JS交互的混淆出錯

2019獨角獸企業重金招聘Python工程師標準>>> 小上司離職&#xff0c;我接手他負責的項目&#xff0c;進行版本更新的時候&#xff0c;在生成jar包測試的時候&#xff0c;點擊按鈕沒有反應&#xff0c;頁面是webview&#xff0c;按鈕則是與js交互&#xff0c;logcat打…

計算機常用代碼大全,常用電腦命令大全【圖文】

導語 &#xff1a;電腦&#xff0c;這個在前幾年貌似還離我們非常遙遠的詞匯&#xff0c;現在隨著信息化社會的不斷發展&#xff0c;已經走進了我們的千家萬戶。現在每一家新 裝修 &#xff0c;它都作為一種必備的家用電器來使用。由此可見電腦對我們 現代 人的重要性。但電腦畢…

細數技術指標-[轉載]

技術指標類別龐雜&#xff0c;要一一學全&#xff0c;基本不可能&#xff0c;也沒有這個必要。我們只要掌握幾個常用的指標&#xff0c;了解它們的原理&#xff0c;從而舉一反三&#xff0c;就足夠了。其實任何一種技術指標都是從形態、價格、量、時間這四項出發的&#xff0c;…

[javaSE] 看博客學習java并發編程

共享性 多線程操作同一個數據&#xff0c;產生線程安全問題 新建一個類ShareData 設計一個int 型的成員變量count 設計一個成員方法addCount()&#xff0c;把count變量 在main函數中開啟多個線程操作這個成員變量&#xff0c;在main函數里 獲取ShareData對象&#xff0c;new 出…