1. 程式人生 > >關於CSS3中transform屬性對元素佈局的影響。

關於CSS3中transform屬性對元素佈局的影響。

今天瞭解transform屬性時發現一個奇怪的現象,就是使用transform屬性的時候,無論是translate,rotate,skew還是scale,對於偽元素:after和:before,都會產生影響。具體的這個影響體現在哪裡呢?我們通過一個例子來看一看(以下程式碼均針對webkit核心瀏覽器,其它瀏覽器鄙人還未去嘗試):

先貼程式碼:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .drop-shadow {
                width: 300px;
                height: 150px;
                position: relative;
                background: #ccc; 
                margin-left: 100px;       
                /* -webkit-transform: translate(20px,30px); */

            }

            .drop-shadow:before,
            .drop-shadow:after {
                content: "";
                position: absolute;
                z-index: -1;
                bottom: 15px;
                left: 10px;
                width: 50%;
                max-width: 150px;
                height: 20%;
                /*add box-shadow*/
                -webkit-box-shadow: 0 15px 10px rgba(125,125,125,0.8);
                -moz-box-shadow: 0 15px 10px rgba(125,125,125,0.8);
                box-shadow: 0 15px 10px rgba(125,125,125,0.8);
                /*add css3 transform*/
                -webkit-transform: rotate(-3deg);
                -moz-transform: rotate(-3deg);
                -o-transform: rotate(-3deg);
                transform: rotate(-3deg);

            }

            .drop-shadow:after {
                right:10px;
                left: auto;
                -webkit-transform:rotate(3deg);
                -moz-transform:rotate(3deg);
                -o-transform:rotate(3deg);
                transform:rotate(3deg);

            }
        </style>
    </head>
    <body>
        <div class="drop-shadow">drop shadow effect</div>
    </body>
</html>
以上程式碼中,.drop-shadow樣式中的transform屬性被註釋掉了,大家可以看看效果。這個效果是我在w3cplus中大漠的程式碼中改編出來的。類似於一個資訊展示板,巧妙地利用了:after和:before兩個偽元素。此時:after和:before給我們設定了z-index屬性,因此可以很好地遮蓋。


當我們加入了transform屬性後,會發現,:after和:before居然是暴露在drop-shadow的上面!


於是乎,鄙人就提出了一個問題,到底transform屬性是否會給元素佈局帶來影響呢?雖然此處:after和:before兩個偽元素的位置和佈局都沒受影響,但是不可否認的是在視覺上(或者專業點說是在檢視的渲染上)已經造成了影響。

那麼我們接下來繼續尋找問題的答案:

且看程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .board {
            position: relative;
            overflow: hidden;
            width: 500px;
            height: 500px;
            /*-webkit-transform: skew(2deg);*/
            background: grey;
            float: left;
        }
        .main {
            list-style: none;
        }
        .main li:nth-child(1) {
            z-index: 2;
            position: absolute;
            width: 60px;
            height: 20px;
            background: blue;
            /*-webkit-transform: rotate(-45deg);*/
        }
        .main li:nth-child(2) {
            position: absolute;
            z-index: 1;
            width: 400px;
            height: 100px;
            padding: 30px;
            background: green;
        }
        .right {
            float: left;
            
        }
    </style>
</head>
<body>
    <div class="board">
        <ul class="main">
            <li>part1</li>
            <li>part2</li>
        </ul>
    </div>
    <div class="right">
        <ul class="side">
            <li>part3</li>
            <li>part4</li>
        </ul>
    </div>
</body>
</html>

效果圖:


當將board樣式中transform樣式去掉時,效果如下:


比較明顯地看出佈局並未受明顯地影響。如果覺得還不夠明顯,我們接著把.main li:nth-child(1)中transform的註釋去掉:


由於transform變換預設以元素中心為基點,所以可以很明顯看出元素中心點並未偏移。故transform對元素佈局的影響並不存在。