transition transform 的rotate 和 translate的關係

Transform(3d):x軸向右是正方向,y軸向下是正方向,z軸垂直向外是正方向;注意transform:rotate(angle),可以使元素髮生旋轉,發生旋轉之後的元素,其對應的 x y z的方向指向會發生變化,本文重點講解;

在設置transition的前提下,transform變換纔會有類似動畫的效果

一:首先看一些有關3d的常用屬性:

  • transform-origin:參數1 參數2

    設置對象的圍繞的旋轉中心,默認值是50% 50%

參數1 取值:百分比 基準是元素自身寬度,length 值,left center right 分別旋轉中心是水平方向的左邊界 居中 和右邊界

參數2 取值:百分比 基準是元素自身高度,length 值,top center bottom 分別旋轉中心是水平方向的左邊界 居中 和右邊界

如果第二個值沒有設置默認是50%;

  • transform-style:flat | preserve-3d 默認是flat

    指定某元素的子元素是(看起來)位於三維空間內,還是在該元素所在的平面內被扁平化。

當該屬性值爲「preserve-3d」時,元素將會創建局部堆疊上下文。

決定一個變換元素看起來是處在三維空間還是平面內,需要該元素的父元素上定義 <’ transform-style ‘> 屬性。

  • perspective :none |length 默認是none

指定某元素距離瀏覽器窗口的垂直於瀏覽器窗口的距離,當length>0 的時候,會使得元素看起來比實際要大,length<0 的時候,會使得元素看起來比實際要小。

二 老司機帶帶我,不要走錯路

transform: rotate(angle) translate(length | percentage)之間的關係。translate的百分比取值基準元素自身的寬(x)和高(y)來確定移動的距離。

1 明確瀏覽器的解析過程,從上到下 從左到右

2 明確rotate()會使座標也跟着旋轉

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        img {
           /*transform: translateX(1000px) translateY(500px) rotateZ(90deg);*/
          transform: translateX(1000px) rotateZ(90deg) translateX(500px);
    </style>
</head>
<body>
<img src="img/car.jpg" alt="" />
</body>
</html>
  • 代碼執行過程1:

transform: translateX(1000px) translateY(500px) rotateZ(90deg);

對應的圖片如下:執行過程是先向x軸正方向移動1000px,在向y軸正方向移動500px,然後圖片圍繞元素中心旋轉90deg。

這裏寫圖片描述

執行完之後是

這裏寫圖片描述

  • 代碼執行2

    transform: translateX(1000px) rotateZ(90deg) translateX(500px);

最初狀態是 圖xy1 先向x軸正方向移動1000px 然後執行rotateZ(90deg),此時圖片變換爲 圖xy2 所以這一步還是對應translateX(500px)來移動飛車。

注意:一般建議將旋轉放在最後。不過還是眼看項目實際需求來

三 擼一段動畫大家體驗下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        img {
            width: 200px;
        }
        @keyframes autoMove{
            20%{
                /*0~40%的時候的變換過程,初始默認x向右 y向下 z垂直向外*/
                transform:translatex(1000px)
            }
            25%{
                /*40%~50%的時候的變換過程*/
                transform: translatex(1000px)  rotatez(90deg);
            }
            50%{
                /*50%~90%時候的變換過程*/
                transform: translatex(1000px) translatey(500px) rotatez(90deg) ;
            }
            55%{
                /*注意每次的變化都是在上一次的基礎上進行變化*/
                transform:translatex(1000px) translatey(500px)  rotatez(180deg);
            }
            75% {
                transform:translatex(0px) translatey(500px) rotate(180deg);
            }
            80% {
                transform: translatex(0px) translatey(500px) rotate(270deg);
            }
            95% {
                transform: translatex(0px) translatey(0px) rotate(270deg);
            }
            100%{
                transform:translatex(0px) translatey(0px) rotate(360deg);
            }

        }
        .autoMove{

            animation:autoMove 5s linear ;
        }

    /*注意,每次動畫都要保持上一步動畫的結果,才能繼續進行動畫,如果不保持上一步動畫的結果,那麼會導致動畫迴歸到原來的值*/
    </style>
</head>
<body>
<img src="img/car.jpg" alt="" class="autoMove"/>
</body>
</html>

1 建議將每個階段的動畫註釋掉,看下效果。

2 旋轉的效果都是放在了最後,避免混亂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章