[CSS]一起來畫立方體: CSS transform屬性

在學習transition, transform和translate這三個屬性的時候,發(fā)現(xiàn)了一個例子包括了以下幾個屬性狂秘,覺得挺有意思磅甩,對學習這三個屬性也很有幫助玷氏。

  • transform
  • translate
  • rotate
  • perspective
  • perspective-origin

先看看MDN上一個CSS屬性 perspective 的一個例子
https://developer.mozilla.org/zh-CN/docs/Web/CSS/perspective-origin

<div class="container">
  <div class="cube pers">
    <div class="face front">1</div>
    <div class="face back">2</div>
    <div class="face right">3</div>
    <div class="face left">4</div>
    <div class="face top">5</div>
    <div class="face bottom">6</div>
  </div>
</div>
<style>
  .pers {
    perspective: 350px;
  }

  .container {
    width: 200px;
    height: 200px;
    margin: 100px 0 0 100px;
    border: none;
  }

  .cube {
    width: 100%;
    height: 100%;
    backface-visibility: visible;
    perspective-origin: 150% 150%;
    transform-style: preserve-3d;
  }

  .face {
    display: block;
    position: absolute;
    width: 100px;
    height: 100px;
    border: none;
    line-height: 100px;
    font-family: sans-serif;
    font-size: 60px;
    color: white;
    text-align: center;
  }

  /* Define each face based on direction */
  .front {
    background: rgba(0, 0, 0, 0.3);
    transform: translateZ(50px);
  }

  .back {
    background: rgba(0, 255, 0, 1);
    color: black;
    transform: rotateY(180deg) translateZ(50px);
  }

  .right {
    background: rgba(196, 0, 0, 0.7);
    transform: rotateY(90deg) translateZ(50px);
  }

  .left {
    background: rgba(0, 0, 196, 0.7);
    transform: rotateY(-90deg) translateZ(50px);
  }

  .top {
    background: rgba(196, 196, 0, 0.7);
    transform: rotateX(90deg) translateZ(50px);
  }

  .bottom {
    background: rgba(196, 0, 196, 0.7);
    transform: rotateX(-90deg) translateZ(50px);
  }
</style>

效果圖:


立方體.png

這個例子是HTML+CSS畫出來的一個正方體,它是怎么做的呢?

HTML代碼非常簡單赂苗,一個container裝了一個cube愉耙,這個cube有6個face。

CSS部分拌滋,每個face都是100×100 px的正方形朴沿,每個face的transform屬性不一樣,由不同的translate和rotate的值組成败砂。嘗試把每個face的transform屬性去掉赌渣,來看看效果。

把transform屬性去掉后的效果.png

6個面堆疊在一起了昌犹,由些可見坚芜,正方體就是6個平面正方形經(jīng)過旋轉(zhuǎn)和平移,構(gòu)成一個正方體祭隔,這個我們實際的操作也很一致货岭。

先來看看立體的x y z坐標系:


坐標系.png

結(jié)合坐標系:

  1. 正面front:把正方形沿z軸平移50px
transform: translateZ(50px);
  1. 背面back:把正方形沿z軸平移50px,并以y軸旋轉(zhuǎn)順時針180度
transform: rotateY(180deg) translateZ(50px);
  1. 右面right:把正方形沿z軸平移50px疾渴,并以y軸旋轉(zhuǎn)順時針90度
transform: rotateY(90deg) translateZ(50px);
  1. 左面left:把正方形沿z軸平移50px千贯,并以y軸逆時針旋轉(zhuǎn)90度
transform: rotateY(-90deg) translateZ(50px);
  1. 上面top:把正方形沿z軸平移50px,并以x軸順時針旋轉(zhuǎn)90度
transform: rotateX(90deg) translateZ(50px);
  1. 底面bottom:把正方形沿z軸平移50px搞坝,并以x軸逆時針旋轉(zhuǎn)90度
transform: rotateX(-90deg) translateZ(50px);

只看概念是不是還是有點難想象呢搔谴?這時候,我們可以加上transition屬性桩撮,用動畫效果還幫我們看看敦第。

每一個face加一個觸發(fā)事件,加上"transition : '2s'"

添加button.png

依次點擊每個button店量,可以看到face從開始的位置變換到正方體的位置芜果。transiton的作用就是給一個2s的時間,讓我們看到變化的過程融师。


效果.png

完整代碼

<div class="container">
  <div class="cube pers">
    <div class="face front">1</div>
    <div class="face back">2</div>
    <div class="face right">3</div>
    <div class="face left">4</div>
    <div class="face top">5</div>
    <div class="face bottom">6</div>
  </div>
</div>
<button onclick="changeFront()">Front</button>
<button onclick="changeBack()">Back</button>
<button onclick="changeRight()">Right</button>
<button onclick="changeLeft()">Left</button>
<button onclick="changeTop()">Top</button>
<button onclick="changeBottom()">Bottom</button>
<style>
  .pers {
    perspective: 350px;
  }
  .container {
    width: 200px;
    height: 200px;
    margin: 100px 0 0 100px;
    border: none;
  }
  .cube {
    width: 100%;
    height: 100%;
    backface-visibility: visible;
    perspective-origin: 150% 150%;
    transform-style: preserve-3d;
  }
  .face {
    display: block;
    position: absolute;
    width: 100px;
    height: 100px;
    border: none;
    line-height: 100px;
    font-family: sans-serif;
    font-size: 60px;
    color: white;
    background-color: thistle;
    text-align: center;
  }

  /* Define each face based on direction */
</style>

<script>
  function changeFront() {
    let face = document.querySelector(".face.front");
    face.style.background = 'rgba(0, 0, 0, 0.3)';
    face.style.transform = 'translateZ(50px)';
    face.style.transition = '2s'
  }
  function changeBack() {
    let face = document.querySelector(".face.back");
    face.style.background = 'rgba(0, 255, 0, 1)';
    face.style.transform = 'rotateY(180deg) translateZ(50px)';
    face.style.transition = '2s'
  }
  function changeRight() {
    let face = document.querySelector(".face.right");
    face.style.background = 'rgba(196, 0, 0, 0.7)';
    face.style.transform = 'rotateY(90deg) translateZ(50px)';
    face.style.transition = '2s'
  }
  function changeLeft() {
    let face = document.querySelector(".face.left");
    face.style.background = 'rgba(0, 0, 196, 0.7)';
    face.style.transform = 'rotateY(-90deg) translateZ(50px)';
    face.style.transition = '2s'
  }
  function changeTop() {
    let face = document.querySelector(".face.top");
    face.style.background = 'rgba(196, 196, 0, 0.7)';
    face.style.transform = 'rotateX(90deg) translateZ(50px)';
    face.style.transition = '2s'
  }
  function changeBottom() {
    let face = document.querySelector(".face.bottom");
    face.style.background = 'rgba(196, 0, 196, 0.7)';
    face.style.transform = 'rotateX(-90deg) translateZ(50px)';
    face.style.transition = '2s'
  }
</script>

總結(jié)一下右钾,rotate和translate都是transform的子屬性,后面加上X Y Z代表以x軸旱爆、y軸舀射、z軸為基礎(chǔ)旋轉(zhuǎn)/平移。

  • transform: CSS變換函數(shù)怀伦,可以旋轉(zhuǎn)脆烟,縮放,傾斜或平移給定元素房待。
    • rotate:正數(shù)時順時針旋轉(zhuǎn)邢羔,負數(shù)時逆時針旋轉(zhuǎn)
    • translate: 正數(shù)時正方向平移驼抹,負數(shù)時反方向平移
  • transition: CSS過渡函數(shù)

另外,perspective屬性:[CSS]一起來畫立方體: CSS perspective屬性

參考:
https://www.w3.org/TR/css-transforms-2
https://drafts.csswg.org/css-transitions
https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform
https://developer.mozilla.org/zh-CN/docs/Web/CSS/transition

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末张抄,一起剝皮案震驚了整個濱河市砂蔽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌署惯,老刑警劉巖左驾,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異极谊,居然都是意外死亡诡右,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門轻猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆吻,“玉大人,你說我怎么就攤上這事咙边〔轮螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵败许,是天一觀的道長王带。 經(jīng)常有香客問我,道長市殷,這世上最難降的妖魔是什么愕撰? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮醋寝,結(jié)果婚禮上搞挣,老公的妹妹穿的比我還像新娘。我一直安慰自己音羞,他們只是感情好囱桨,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗅绰,像睡著了一般蝇摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上办陷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音律歼,去河邊找鬼民镜。 笑死,一個胖子當著我的面吹牛险毁,可吹牛的內(nèi)容都是我干的制圈。 我是一名探鬼主播们童,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲸鹦!你這毒婦竟也來了慧库?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤馋嗜,失蹤者是張志新(化名)和其女友劉穎齐板,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛菇,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡甘磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眯停。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片济舆。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖莺债,靈堂內(nèi)的尸體忽然破棺而出滋觉,到底是詐尸還是另有隱情,我是刑警寧澤齐邦,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布椎侠,位于F島的核電站,受9級特大地震影響侄旬,放射性物質(zhì)發(fā)生泄漏肺蔚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一儡羔、第九天 我趴在偏房一處隱蔽的房頂上張望宣羊。 院中可真熱鬧,春花似錦汰蜘、人聲如沸仇冯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛坚。三九已至,卻和暖如春色难,著一層夾襖步出監(jiān)牢的瞬間泼舱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工枷莉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娇昙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓笤妙,卻偏偏與公主長得像冒掌,于是被迫代替她去往敵國和親噪裕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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