CSS 3D 詳解+應用

我們平常前端編程都是在一個二維平面內(nèi)匆浙,那么如何做一個3D效果呢?比如創(chuàng)建一個立方體,像下面這樣:


立方體

我自己總結(jié)了一下圃郊,大概分為以下幾步:

  1. 創(chuàng)建一個3D窗口
  2. 確定觀察視角(比如我們是從正中間看甫男,還是從左上或右下看)
  3. 指明變換是在三維的維度上變換且改。
  4. 寫具體的變換內(nèi)容。

接下來板驳,我將會以上圖立方體為例子又跛,一步步地向大家演示如何實現(xiàn)。

一若治、創(chuàng)建一個3D窗口

請大家暫停思考一下:為什么需要創(chuàng)建一個3D窗口慨蓝?
先思考,先別往下看哦端幼!

Why

我們平常編程都是在瀏覽器窗口這個二維平面內(nèi)礼烈,瀏覽器默認的也是二維。如果想要寫3D效果婆跑,需要告訴瀏覽器:我現(xiàn)在要寫3D 的東西了此熬,所以創(chuàng)建一個3D的窗口。
如何創(chuàng)建?

perspective

CSS屬性 perspective指定了觀察者與 z=0 平面的距離滑进,使具有三維位置變換的元素產(chǎn)生透視效果犀忱。 z>0 的三維元素比正常大,而 z<0 時則比正常小郊供,大小程度由該屬性的值決定峡碉。

翻譯成人話就是:perspective屬性告訴瀏覽器,這塊里的內(nèi)容是3D的驮审,遵循近大遠小的透視原理鲫寄。

注意:當為元素定義 perspective 屬性時吉执,其子元素會獲得透視效果,而不是元素本身地来。

所以戳玫,我們的如果第一步是創(chuàng)建一個3D區(qū)域,上面那個正方體第一步代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cube</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        html,body,.wrap{
            width: 100%;
            height: 100%;
        }
        .wrap{
            background-color: pink;

            /* 使其子元素水平居中和垂直居中 */
            display: flex;  
            justify-content: center;
            align-items: center;
        }
        .cube{
            position: relative;
            width: 300px;
            height: 300px;

            /* 創(chuàng)建3D場景 */
            perspective: 800;           
            -webkit-perspective: 800;
        }
        .epage{
            list-style: none;

            width: 150px;
            height: 150px;
            background-color: #000;

            position: absolute;
            top: 0;
            left: 0;
            border: 1px solid #fff;
            font-size: 80px;
            font-weight: bold;
            text-align: center;
            color: #fff;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <ul class="cube">
            <li class="epage">1</li>
            <li class="epage">2</li>
            <li class="epage">3</li>
            <li class="epage">4</li>
            <li class="epage">5</li>
            <li class="epage">6</li>
        </ul>
    </div>
</body>
</html>

效果如下:


image.png

二未斑、確定觀察視角

觀察視角是指咕宿,觀察者(其實就是我們)看這個3D場景的視角,比如從上下左右還是中間看蜡秽。
這里的上下左右中間使相對于當前3D場景的角度府阀。(大家不必糾結(jié)在網(wǎng)上搜到的什么消失點之類的東西,透視原理的內(nèi)容芽突,沒必要摳那么細)

我們這里暫定觀察視角為正中間

perspective-origin: 50% 50%;

所以我們的css代碼變成了

.cube{
    position: relative;
    width: 300px;
    height: 300px;

    perspective: 800;
    -webkit-perspective: 800;
    perspective-origin: 50% 50%;
    -webkit-perspective-origin: 50% 50%;
}

三试浙、指明變換是在三維的維度上變換

做正方體肯定會用到變換transform,但是transform有二維的(比如rotate()),也有三維的(比如rotateX()寞蚌、rotateY()田巴、rotateZ())
所以,我們要告訴瀏覽器挟秤,在3D場景里的transform都是基于三維的transform壹哺。

transform-style: preserve-3d;

官方文檔:https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-style

所以我們代碼就變成

.cube{
    position: relative;
    width: 300px;
    height: 300px;

    perspective: 800;
    -webkit-perspective: 800;
    perspective-origin: 50% 50%;
    -webkit-perspective-origin: 50% 50%;
    transform-style: preserve-3d;
}

四、寫具體的變換內(nèi)容

.epage:nth-child(1){

}
.epage:nth-child(2){
    transform-origin: left;
    transform: rotateY(90deg);
}
.epage:nth-child(3){
    transform-origin: right;
    transform: rotateY(-90deg);
}
.epage:nth-child(4){
    transform-origin: top;
    transform: rotateX(-90deg);
}
.epage:nth-child(5){
    transform-origin: bottom;
    transform: rotateX(90deg);
}
.epage:nth-child(6){
    transform: translateZ(-100px);
}

最后可以看到如下效果:


image.png

為了更清楚地看到3D立方體艘刚,我們讓cube轉(zhuǎn)動一下管宵,

.cube{
    position: relative;
    width: 300px;
    height: 300px;

    perspective: 800;
    -webkit-perspective: 800;
    perspective-origin: 50% 50%;
    transform-style: preserve-3d;
      
    /* cube轉(zhuǎn)動角度 */
    transform: rotateX(30deg) rotateY(30deg) rotateZ(70deg);
}

然后就看到效果了:


image.png

完整版代碼指路:https://codepen.io/lilylaw/pen/PoPGgaz

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昔脯,隨后出現(xiàn)的幾起案子啄糙,更是在濱河造成了極大的恐慌,老刑警劉巖云稚,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧饼,死亡現(xiàn)場離奇詭異,居然都是意外死亡静陈,警方通過查閱死者的電腦和手機燕雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲸拥,“玉大人拐格,你說我怎么就攤上這事⌒谈希” “怎么了捏浊?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撞叨。 經(jīng)常有香客問我金踪,道長浊洞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任胡岔,我火速辦了婚禮法希,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靶瘸。我一直安慰自己苫亦,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布怨咪。 她就那樣靜靜地躺著屋剑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惊暴。 梳的紋絲不亂的頭發(fā)上饼丘,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音辽话,去河邊找鬼。 笑死卫病,一個胖子當著我的面吹牛油啤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟀苛,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼益咬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帜平?” 一聲冷哼從身側(cè)響起幽告,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裆甩,沒想到半個月后冗锁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤栓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年冻河,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉帅。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡叨叙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堪澎,到底是詐尸還是另有隱情擂错,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布樱蛤,位于F島的核電站钮呀,受9級特大地震影響桃犬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜行楞,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一攒暇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧子房,春花似錦形用、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至解愤,卻和暖如春镇饺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背送讲。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工奸笤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哼鬓。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓监右,卻偏偏與公主長得像,于是被迫代替她去往敵國和親异希。 傳聞我的和親對象是個殘疾皇子健盒,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容