03--css形狀--css揭秘

来源:https://www.cnblogs.com/ShareBeautiful/archive/2018/02/07/8427247.html
-Advertisement-
Play Games

形狀 一 自適應的橢圓 1.難題 1> 圓 你可能註意到過, 給任何正方形元素設置一個足夠大的border-radius, 就可以把它變成一個圓形。所用到的CSS 代碼如下所示: *當任意兩個相鄰圓角的半徑之和超過border box 的尺寸時,用戶 代理必須按比例減小各個邊框半徑所使用的值,直到它 ...


形狀

一 自適應的橢圓

1.難題
1> 圓
你可能註意到過, 給任何正方形元素設置一個足夠大的border-radius,
就可以把它變成一個圓形。所用到的CSS 代碼如下所示:

1 #bd {
2     width: 200px;
3     height: 200px;
4     background: #fb3;
5     border-radius: 100px; /* >= 正方形邊長的一半 */
6 }

 

*當任意兩個相鄰圓角的半徑之和超過border box 的尺寸時,用戶
代理必須按比例減小各個邊框半徑所使用的值,直到它們不會相互重疊
為止

2> 橢圓
如果它的寬高相等,就顯示為一個圓;如果寬
高不等,就顯示為一個橢圓

2.解決方案
說到border-radius,有一個鮮為人知的真相:它可以單獨指定水平
和垂直半徑,只要用一個斜杠(/)分隔這兩個值即可。這個特性允許我
們在拐角處創建橢圓圓角

因此,如果我們有一個尺寸為
200px × 150px 的元素,就可以把它圓角的兩個半徑值分別指定為元素寬高的
一半,從而得到一個精確的橢圓:

#bd {
    width:200px;
    height:100px;
    border-radius:100px/50px;
}


但是,這段代碼存在一個很大的缺陷:只要元素的尺寸發生變化,
border-radius 的值就得跟著改。我們在圖3-5 中可以看到,當元素的尺寸
變為200px×300px 時,如果border-radius 沒有跟著改變,會發生什麼後
果。因此,如果我們的元素尺寸會隨著它的內容變化而變化,這就是一個問
題了。

它不僅可以接受長度值,還可以接受百分比值
這個百分比值會基於元素的尺寸進行解析,即寬度用於水平半徑的解析,而高度
用於垂直半徑的解析。這意味著相同的百分比可能會計算出不同的水平和垂
直半徑。

#bd {
    border-radius:50%;
}

 

3.半橢圓
我們甚至可以為所有四個角提供完全不同的水平和垂
直半徑,方法是在斜杠前指定1~4 個值,在斜杠後指定另外1~4 個值。請註
意這兩組值是單獨展開為四個值的。舉例來說,當border-radius 的值為
10px / 5px 20px 時,其效果相當於10px 10px 10px 10px / 5px 20px
5px 20px。

#bd {
    border-radius:50%/100% 100% 0 0;
}

 


半橢圓是可以變成半圓的,只要它的寬度剛好伸展到高度的兩倍(或者對一個沿縱軸劈開的
橢圓來說,是高度伸展為寬度的兩倍

4.四分之一橢圓
要創建一個四分之一橢圓,其中一個角的水平和垂直半徑值都需要是
100%,而其他三個角都不能設為圓角。

#bd {
    border-radius:100% 0 0 0;
}

 


二 平行四邊形


1.難題
使用skew()來進行斜向拉伸實現 平行四邊形
一個參數時:表示水平方向的傾斜角度
兩個參數時:第一個參數表示水平方向的傾斜角度,第二個參數表示垂直方向的傾斜角度

#box {
    transform:skew(-45deg);
}

 


但是,這導致它的內容也發生了斜向變形,這很不好看,而且難讀。
有沒有辦法只讓容器的形狀傾斜,而保持其內容不變呢?

2.且套元素方案
我們可以對內容再應用一次反向的skew() 變形,從而抵消容器的變形
效果,最終產生我們所期望的結果。

<a href="#yolo" class="button">
<div>Click me</div>
</a>
<style>
.button { transform: skewX(-45deg); }
.button > div { transform: skewX(45deg); }
</style>

 

3.偽元素方案
另一種思路是把所有樣式(背景、邊框等)應用到偽元素上,然後再對
偽元素進行變形。因為我們的內容並不是包含在偽元素里的,所以內容並不
會受到變形的影響。下麵來看看這個技巧能否得到與前面相同的鏈接樣式。
此時,用偽元素生成的方塊是重疊在內容之上 可以給偽元素設置z-index: -1 樣式

.button {
    width:200px;
    height:200px;
    position: relative;
    /* 其他的文字顏色、內邊距等樣式…… */
}
.button::before {
    content: ''; /* 用偽元素來生成一個矩形 */
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    width:inherit;
    height:inherit;
    z-index: -1;
    background: #58a;
    transform: skew(45deg);
}

 


三 棱形圖片

1.難題
使用rotate()

2.基於變形的方案
需要把圖片用一個<div> 包裹起來,然後對其應用相反的rotate()
變形樣式:

<div class="picture">
<img src="adam-catlace.jpg" alt="..." />
</div>

 

.picture {
    width: 400px;
    transform: rotate(45deg);
    overflow: hidden;
}
.picture > img {
    max-width: 100%;
    transform: rotate(-45deg);
}

 

以上產生一個 八角形 的圖片 並沒有產生棱形

可以使用scale()解決:

.picture {
    width: 400px;
    transform: rotate(45deg);
    overflow: hidden;
}
.picture > img {
    max-width: 100%;
    transform: rotate(-45deg) scale(1.42);
}

 

3.裁切路徑方案
上面的方法確實可以奏效,但它基本上是一個hack。這個方法需要一層
額外的HTML 標簽,這不夠簡潔;代碼本身也不夠直觀;它甚至還不夠健
壯——如果我們碰巧要處理一張非正方形的圖片,這個小把戲就會原形畢露

事實上,我們還有一個更好的辦法來完成這個任務。它的主要思路是
使用clip-path 屬性。

裁切路徑允許我們把元素裁剪為我們想要的任何形狀。在這個例子
中,我們將會使用polygon()(多邊形)函數來指定一個菱形。實際上,它
允許我們用一系列(以逗號分隔的)坐標點來指定任意的多邊形。我們甚至
可以使用百分比值,它們會解析為元素自身的尺寸。代碼如下所示:

-webkit-clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);

 


四 切角效果

1.難題

2.解決方案
1> 利用漸變
右下角:

#box {
    background: #58a;
    background:
    linear-gradient(-45deg, transparent 15px, #58a 0);
}

 


四角:

#box {
    background: #58a;
    background:
    linear-gradient(135deg, transparent 15px, #58a 0)
    top left,
    linear-gradient(-135deg, transparent 15px, #58a 0)
    top right,
    linear-gradient(-45deg, transparent 15px, #58a 0)
    bottom right,
    linear-gradient(45deg, transparent 15px, #58a 0)
    bottom left;
    background-size: 50% 50%;
    background-repeat: no-repeat;
}

 

3.弧形切角
可以用來創建弧形切角(很多人也把這種
效果稱為“內凹圓角”,因為它看起來就像是圓角的反向版本)。唯一的區別
在於,我們會用徑向漸變來替代上述線性漸變:

#box {
    background: #58a;
    background:
    radial-gradient(circle at top left,
    transparent 15px, #58a 0) top left,
    radial-gradient(circle at top right,
    transparent 15px, #58a 0) top right,
    radial-gradient(circle at bottom right,
    transparent 15px, #58a 0) bottom right,
    radial-gradient(circle at bottom left,
    transparent 15px, #58a 0) bottom left;
    background-size: 50% 50%;
    background-repeat: no-repeat;
}

 

五 梯形標簽頁

1.難點
一直以來,梯形
都是眾所周知難以用CSS 生成的形狀,

2.解決方案

transform: perspective(.5em) rotateX(5deg);

 

整個元素應用3D 變形的,因此它上面的文字也變形了。對元素使用了3D
變形之後,其內部的變形效應是“不可逆轉”的,這一點跟2D 變形不同
(在2D 變形的體系之下,內部的逆向變形可以抵消外部的變形效應)
唯一可行的途徑就是把變形效果作用在偽元
素上。

.tab {
    position: relative;
    display: inline-block;
    padding: .5em 1em .35em;
    color: white;
}
.tab::before {
    content: ''; /* 用偽元素來生成一個矩形 */
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    z-index: -1;
    background: #58a;
    transform: perspective(.5em) rotateX(5deg);
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 問:我們在使用Vue時,實際上幹了什麼? 答:實際上只幹了一件事——new了一個Vue對象。後面的事,都交由這個對象自動去做。就好像按了下開關,機器跑起來了,剩下的事就不用我們再操心了。 各位看官先別不服,FEer在基於Vue開發項目時,確實寫了很多代碼,但本質上,這些代碼都是在往這台機器的固定工作 ...
  • WebSocket線上測試工具 http://ws.douqq.com/ 1、連接格式為 ws://IP/功能變數名稱:埠(示例ws://119.29.3.36:5354) 2、對於內網的測試環境,只需填入服務端的內網IP和埠 3、可連接我上面提供的服務端ws地址來測試您自己的客戶端 本站支持QQ機器人 ...
  • 今天對Jquery中 isPlainObject 源碼分析。 1. isPlainObject 方法的作用: 用來判斷傳入參數,是否是對象。 2. 源碼分析:isPlainObject: function( obj ) { ...
  • jQuery實現身份證輸入添加空格 表單驗證身份證輸入,並且輸入時前6位添加一個空格,中間8位後添加一個空格,及身份證格式驗證 參考:基於jquery實現的銀行卡號每隔4位自動插入空格的實現代碼 參考網址: http://www.jb51.net/article/97966.html 源碼代碼如下: ...
  • 今年工作進度到這裡結束,整理一下今年收集的自用js庫,後期會更新,代碼已貼github=>https://github.com/lpg-kobe/personal-github /** * @param {long} //通用函數庫 * @param {onerror} //js錯誤調試 * @au ...
  • 最近學習vue時看到了let,const變數定義,查閱相關資料整理了一下,所以就總結下加深印象,js中三種變數方式var、const、let的區別 1.var定義的變數是可以修改,如果不初始化會輸出undefined,不會報錯。 2.const定義變數不可修改,而且必須初始化,const聲明一個只讀 ...
  • 前段時間開發中,遇到一個父元素和子元素都有事件時,發現會出現事件冒泡現象,雖然知道ev.stopPropagation()和ev.stopPropagation()其中一個是阻止事件冒泡,卻不知ev.preventDefault()和ev.stopPropagation()以及return fals ...
  • /* 定義替換對象鍵值 */var setReferArgs = function(){ var referArgs = new Object(); referArgs['#userID\#'] = userId; referArgs['\#userName\#'] = userName; retu ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...