原文出處:http://www.w3cplus.com/css3/css-secrets/parallelograms.html
平行四邊形是矩形的一個(gè)超集:它的邊是平行的,但是角不一定是直角。
圖注:一個(gè)平行四邊形
在視覺設(shè)計(jì),它們往往可以使設(shè)計(jì)顯得更具活力,傳達(dá)運(yùn)動(dòng)感。
圖注:eb設(shè)計(jì)中的平行四邊形(design by Martina Pitakova)
我們嘗試用CSS創(chuàng)建按鈕樣式的鏈接。從普通的扁平按鈕開始,帶一些簡單的樣式,如圖下圖所示:
然后,我們應(yīng)用skew()
變換創(chuàng)建出傾斜的矩形,如下:
transform: skewX(-45deg);
但是,這也會(huì)導(dǎo)致平行四邊形中的內(nèi)容被傾斜,這使得它看起來很丑而且沒有可讀性。
圖注:傾斜后的按鈕,文本變得難以閱讀
有什么辦法可以只傾斜外邊的形狀容器,而不傾斜里邊的內(nèi)容嗎?
我們可以給內(nèi)容應(yīng)用一個(gè)相反的skew()
變換,把外邊的變換抵消,這樣就可以得到我們想要的結(jié)果。但是,這也意味著我們必須使用額外的HTML元素來包裹內(nèi)容,如一個(gè)div
:
<a href="#yolo" class="button">
<div>Click me</div>
</a>
.button { transform: skewX(-45deg); }
.button > div { transform: skewX(45deg); }
如果你是給默認(rèn)內(nèi)聯(lián)的元素應(yīng)用這個(gè)效果,記得把它的
display
屬性設(shè)置為inline-block
或block
,否則應(yīng)用的變換不會(huì)生效。內(nèi)部元素也一樣。
正如下圖的效果:
如如你看到,它運(yùn)行沒有問題,但是我們使用了一個(gè)額外的HTML元素。如果修改標(biāo)簽不是一個(gè)可選的方案,或者你真的希望保持標(biāo)簽純度,別擔(dān)心,這里還有一個(gè)純CSS的解決方案。
另一個(gè)方案是把所有的樣式應(yīng)用在偽元素上(背景、邊框等等),然后為其應(yīng)用變換。因?yàn)槲覀兊膬?nèi)容不是被包裹在偽元素中的,它不會(huì)被變換影響。我們嘗試使用這種技術(shù)給一個(gè)鏈接添加樣式,跟前一節(jié)一樣的方法。
我們需要讓偽元素保持靈活性,并自動(dòng)繼承父元素的尺寸,即使它們的大小由內(nèi)容決定。一個(gè)簡單的方法時(shí)是父元素應(yīng)用position: relative
,然后給生成的元素應(yīng)用position: absolute
,然后把所有的偏移量都設(shè)置為0
,這樣它的水平和垂直方向都會(huì)繼承父元素的大小。代碼如下:
.button {
position: relative;
/* text color, paddings, etc. */
}
.button::before {
content: '';
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
}
此時(shí),生成的盒子是懸浮在內(nèi)容上邊的,一旦給它應(yīng)用了背景,它將會(huì)覆蓋住內(nèi)容:
圖注:我們的偽元素當(dāng)前是懸浮在內(nèi)容上邊的,所以應(yīng)用background: #58a
來覆蓋
我們可以給偽元素應(yīng)用一個(gè)z-index: -1
,這樣它就會(huì)移動(dòng)到父元素下方了。
現(xiàn)在,終于可以給我們的主要元素應(yīng)用變換,然后查看結(jié)果了。最后的代碼如下,生成的效果和前面的方案生成的效果完全一樣:
.button {
position: relative;
/* text color, paddings, etc. */
}
.button::before {
content: ''; /* To generate the box */
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
z-index: -1;
background: #58a;
transform: skew(45deg);
}
這些技術(shù)不僅對(duì)skew()
變換有效。它們還可以結(jié)合其它變換使用,這樣既可以改變元素的形狀,但又不會(huì)對(duì)它的內(nèi)容造成影響。例如,給一個(gè)方形元素使用rotate()
變換,可以很容易地生成一個(gè)鉆石( 菱形)形狀。
還有,使用偽元素和定位來生成一個(gè)盒子,并添加樣式,然后放置在父元素之下的方法,在很多其它的不同類型的效果實(shí)例中都可以使用,如:
opacity
這樣的屬性,由Nicolas Gallagher首創(chuàng)。
更多建議: