首頁 >web前端 >css教學 >如何利用css3中的transform skewX實現平行四邊形的導覽選單

如何利用css3中的transform skewX實現平行四邊形的導覽選單

不言
不言轉載
2018-10-09 15:07:062925瀏覽

這篇文章帶給大家的內容是關於如何利用css3中的transform skewX實現平行四邊形的導航選單,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

平行四邊形其實是矩形的超集:它的各邊是兩兩平行的,但各個角則不一定都是直角。在視覺設計中,平行四邊形往往可以傳達出一種動感。
讓我們試著用 CSS 建立一個按鈕狀的平行四邊形連結。我們的起點就是一個普通的塊狀按鈕,輔以一些簡單的樣式,然後,我們可以透過skew() 的變形屬性來對這個矩形進行斜向拉伸:

transform: skewX(-45deg);

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

很多人會想到嵌套元素方案,那麼我們可以對內容再應用一次反向的 skew() 變形,從而抵消容器的變形效果,最終產生我們所期望的結果。不幸的是,這意味著我們將不得不使用一層額外的HTML 元素來包裝內容,例如用一個span:

<a href="www.php.cn" class="button">
 <span>www.php.cn</span>
</a>
.button { transform: skewX(-45deg); }
.button > span { transform: skewX(45deg); }

我們可以看到,這個方法的表現很不錯,但它也意味著我們不得不加入額外的HTML 元素。如果結構層的變更是不允許的,或者你希望嚴格保持結構層的純度,別擔心,我們還有一個純 CSS 的解決方案。

偽元素方案

另一個想法是把所有樣式(背景、邊框等)應用到偽元素上,然後再對偽元素進行變形。因為我們的內容並不是包含在偽元素裡的,所以內容並不會受到變形的影響。下面來看看這個技巧能否得到與前面相同的連結樣式。

我們希望偽元素保持良好的靈活性,可以自動繼承其宿主元素的尺寸,甚至當宿主元素的尺寸是由其內容來決定時仍然如此。一個簡單的辦法是給宿主元素應用position: relative 樣式,並為偽元素設定position:absolute,然後再把所有偏移量設為零,以便讓它在水平和垂直方向上都被拉伸至宿主元素的尺寸。程式碼看起來是這樣的:

.button {
 position: relative;
 /* 其他的文字颜色、内边距等样式…… */
}
.button::before {
 content: '';
 position: absolute;
 top: 0; right: 0; bottom: 0; left: 0;
}

此時,用偽元素產生的方塊是重疊在內容之上的,一旦給它設定背景,就會遮住內容。為了修復這個問題,我們可以為偽元素設定z-index: -1 樣式,這樣它的堆疊層次就會被推到宿主元素之後。現在我們要做的最後一步,就是盡情地對它設定變形樣式,並享受美好的結果。最終版的程式碼如下所示,它產生的視覺效果跟前文所述技巧是完全一致的:

.button {
 position: relative;
 /* 其他的文字颜色、内边距等样式…… */
}
.button::before {
 content: ''; /* 用伪元素来生成一个矩形 */
 position: absolute;
 top: 0; right: 0; bottom: 0; left: 0;
 z-index: -1;
 background: #58a;
 transform: skew(45deg);
}

這個技巧不僅對skew() 變形來說很有用,還適用於其他任何變形樣式,當我們想變形一個元素而不想變形它的內容時就可以用到它。舉個例子,我們把這個技巧針對 rotate() 變形樣式稍稍調整一下,再用到一個正方形元素上,就可以很容易地得到一個菱形。

這個技巧的關鍵在於,我們利用偽元素以及定位屬性產生了一個方塊,然後對偽元素設定樣式,並將其放置在其宿主元素的下層。這種想法同樣可以運用在其他場景中,從而得到各種各樣的效果。

#

以上是如何利用css3中的transform skewX實現平行四邊形的導覽選單的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除