平行四邊形

2018-02-24 15:42 更新

原文出處: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-blockblock,否則應(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í)例中都可以使用,如:

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)