深入理解CSS變形transform(3d)

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/04/07/5351477.html
-Advertisement-
Play Games

× 目錄 [1]坐標軸 [2]透視 [3]變形函數 [4]透視函數 [5]變形原點 [6]背景可見 [7]變形風格 前面的話 本文將詳細介紹關於transform變形3D的內容,但需以瞭解transform變形2D為基礎。3D變形涉及的屬性主要是transform-origin、transform、 ...


×
目錄
[1]坐標軸 [2]透視 [3]變形函數 [4]透視函數 [5]變形原點 [6]背景可見 [7]變形風格

前面的話

  本文將詳細介紹關於transform變形3D的內容,但需以瞭解transform變形2D為基礎。3D變形涉及的屬性主要是transform-origin、transform、transform-style、perspective、perspective-origin、backface-visibility

 

坐標軸

  在瞭解透視之前,首先要先瞭解坐標軸。3D變形與2D變形最大的不同就在於其參考的坐標軸不同。2D變形的坐標軸是平面的,只存在x軸和y軸,而3D變形的坐標軸則是x、y、z三條軸組成的立體空間,x軸正向、y軸正向、z軸正向分別朝向右、下和屏幕外

透視

  透視是transform變形3D中最重要的內容。如果不設置透視,元素的3D變形效果將無法實現。

//下麵以rotateX()旋轉函數為例,rotateX(45deg)表示元素以X軸方向為軸沿順時針旋轉45角度
//左圖是無變形和透視樣式的原始效果,中圖是設置變形和透視樣式的效果,右圖是設置變形但未設置透視樣式的效果

  由以上三個圖可說明,如果不設置透視,那麼瀏覽器會將元素的3D變形操作投射垂直到2D視平面上,最終呈現出來的只是元素的寬高變化

  要深入瞭解透視,需要瞭解觀察者、被透視元素和變形元素這幾個概念。

  首先變形元素,顧名思義,就是進行transform3D變形的元素,主要進行transform、transform-origin、backface-visibility等屬性的設置。

  觀察者是瀏覽器模擬出來的用來觀察被透視元素的一個沒有尺寸的點,觀察者發出視線,類似於一個點光源發出光線。

  被透視元素也就是被觀察者觀察的元素,根據屬性設置的不同,它有可能是變形元素本身,也可能是它的父級或祖先其元素(後面會詳細介紹),主要進行perspective、perspective-origin等屬性的設置

 

透視距離

  透視距離perspective是指觀察者沿著平行於z軸的視線與屏幕之間的距離,簡稱視距

perspective

  值: none | <length>

  初始值: none

  應用於: 非inline元素(包括block、inline-block、table、table-cell等)

  繼承性: 無

  [註意]透視perspective不可為0和負數,因為觀察者與屏幕距離為0時或者在屏幕背面時是不可以觀察到被透視元素的正面的

  [註意]透視perspective不可取百分比,因為百分比需要相對的元素,但z軸並沒有可相對的元素尺寸

【1】一般地,物體離得越遠,顯得越小。反映在perspective屬性上,就是該屬性值越大,元素的3d效果越不明顯。(就像離一個人很近,甚至可以看到他的毛孔;如果離一個人很遠,可能只看到一個輪廓)

【2】設置透視perspective屬性的元素就是被透視元素。一般地,該屬性只能設置在變形元素的父級或祖先級。因為瀏覽器會為其子級的變形產生透視效果,但並不會為其自身產生透視效果

<!-- 在本身元素上設置透視無效果 -->
<div style="float:left;margin-right: 10px;border:2px solid gray;">
    <div style="perspective: 200px;width: 100px;height: 100px;border:1px solid black;background-color: pink;transform: rotateX(45deg);"></div>
</div>

<!-- 在父級元素上設置透視有效果 -->
<div style="perspective: 200px; float:left;margin-right: 10px;border:2px solid gray;">
    <div style="width: 100px;height: 100px;border:1px solid black;background-color: lightblue;transform: rotateX(45deg);"></div>
</div>

透視原點

  透視原點perspective-origin是指觀察者的位置,一般地,觀察者位於與屏幕平行的另一個平面上,觀察者始終是與屏幕垂直的。觀察者的活動區域是被觀察元素的盒模型區域

perspective-origin

  值: x軸 y軸

  初始值: 50% 50%

  應用於: 非inline元素(包括block、inline-block、table、table-cell等)

  繼承性: 無

x軸: left | right | center | <percentage> | <length>
y軸: top | bottom | center | <percentage> | <length>

【1】關鍵字

x軸
    left: 0% center: 50% right: 100%
y軸
    top: 0% center: 50% bottom: 100%

【2】數值

  x軸數值表示在x軸上離0點(元素邊框外側左上角)的偏移量;y軸數值表示在y軸上離0點的偏移量

【3】百分比

  其中x軸的百分比相對於被透視元素的寬度和(width+橫向padding+橫向border),而y軸的百分比相對於被透視元素的高度和(height+縱向padding+縱向border)

【4】單個值

  當只有一個值時,預設第二個值為center

[註意]perspective-origin必須定義在設置perspective的元素上,也就是說必須設置在元素的父元素或祖先元素上

 

變形函數

  介紹完透視之後,接下來詳細介紹關於變形3d的變形函數和變形原點。上篇博文詳細介紹了2d變形函數。而3d變形函數也類似,包括位移、旋轉和縮放,沒有傾斜。

  [註意]傾斜skew()是二維變形,不能在三維空間變形,元素可能會在x軸和y軸傾斜,但不能在z軸傾斜

矩陣matrix3d

  3d變形函數位移、旋轉和縮放都是通過矩陣設置不同的參數而實現的。相比於2d矩陣martrix()的6個參數而言,3d矩陣matrix3d卻有12個參數。其變形規則與2dmatrix()類似,只不過是從3*3矩陣,變成了4*4矩陣

matrix3d(a,b,c,0,d,e,f,0,g,h,i,0,j,k,l,1)

3d位移

  3d位移函數主要包括traslateZ()和translate3d()

translate3d(x,y,z)

  [註意]其中,x和y可以是長度值,也可以是百分比,百分比是相對於其本身元素水平方向的寬度和垂直方向的高度和;z只能設置長度值

traslateZ(z)相當於translate3d(0,0,z)

  [註意]常用-webkit-transform: translateZ(0);來開啟硬體加速

  [註意]3d位移函數相當於matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,x,y,z,1) 

3d縮放

  3d縮放函數主要包括scaleZ()和scale3d()

scale3d(x,y,z)

  預設值為scale3d(1,1,1),當參數為負值時,先翻轉再縮放

scaleZ(z)相當於scale3d(1,1,z)

  [註意]3d位移函數相當於matrix3d(x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1)

  [註意]scaleZ()和scale3d()單獨使用時沒有任何效果

.box1 .in{
    transform: translateZ(-500px);
}
.box2 .in{
    transform: translateZ(-100px);
}
.box3 .in{
    transform: scaleZ(5) translateZ(-100px);
}
//下圖中從左到右分別是box1,box2,box3。由此得知,box3也相當於向z軸移動了-500px

  所以transform: scaleZ(5) translateZ(-100px)和transform: translateZ(-500px)是等價的

3d旋轉

  3d旋轉函數主要包括rotateX()、rotateY()、rotateZ()、rotate3d()

rotate3d(x,y,z,Ndeg)

  x、y、z分別用來描述圍繞x、y、z軸旋轉的矢量值。最終變形元素沿著由(0,0,0)和(x,y,z)這兩個點構成的直線為軸,進行旋轉。當N為正數時,元素進行順時針旋轉;當N為負數時,元素進行逆時針旋轉

rotateX(Ndeg)相當於rotate3d(1,0,0,Ndeg)

rotateY(Ndeg)相當於rotate3d(0,1,0,Ndeg)

rotateZ(Ndeg)相當於rotate3d(0,0,1,Ndeg)

 

透視函數

  上面詳細介紹了透視屬性perspective,但透視屬性應用在變形元素的父級或祖先級。而透視函數perspective()是transform變形函數的一個屬性值,應用於變形元素本身

  [註意]由於透視原點perspective-origin只能設置於設置了perspective透視屬性的元素。若為元素設置透視函數perspective(),則透視原點不起使用,觀察者使用預設位置,即元素中心點對應的平面上

perspective(<length>)

  透視函數perspective(<length>)的參數只能是長度值,長度值只能是正數

  [註意]由於transform屬性是從前向後的順序解析屬性值的,所以一定要把perspective()函數寫在其他變形函數前面,否則將沒有透視效果 

 

變形原點

  變形2d時已經講過變形原點,2d變形原點由於沒有z軸,所以z軸的值預設為0。而3d變形原點的z軸是一個可以設置的變數

transform-origin

  值: x軸 y軸 z軸

  初始值: 50% 50%

  應用於: 非inline元素(包括block、inline-block、table、table-cell等)

  繼承性: 無

  [註意]IE9-瀏覽器不支持,safari3.1-8、android2.1-4.4.4、IOS3.2-8.4都需要添加首碼,其他更高版本瀏覽器可使用標準寫法

x軸: left | center | right | <length> | <percentage>
y軸: top | center | bottom | <length> | <percentage>
z軸: <length>

  對於x軸和y軸來說,可以設置關鍵字和百分比,分別相對於其本身元素水平方向的寬度和垂直方向的高度和;z只能設置長度值

//變形元素預設樣式是 transform:rotate3d(1,1,1,45deg);

 

背景可見

  元素的背面預設是可見的。但有時需要讓元素背面不可見,這就要用到屬性backface-visibility

backface-visibility: 設置元素背面是否可見

visible:可見,預設
hidden:不可見

//設置一個元素包含兩個半透明子元素絕對定位重疊,內容分別為A和B,來表示一個元素的正面和背面

  [註意]若一個元素覆蓋於另一個元素上,不僅僅是正面覆蓋,背面也是覆蓋的

 

變形風格

  變形風格transform-style允許變形元素及其子元素在3d空間中呈現。變形風格有兩個值。flat是預設值,表示2d平面;而perserve-3d表示3d空間

  [註意]當設置了overflow:非visible或clip:非auto時,transform-style:preserve-3d失效

transform-style: flat | preserve-3d


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、IDE介紹 ① 什麼是IDE? 1、 IDE全稱是”Integrated Development Environment”,中文稱為“集成開發環境”; 2、是用於提供程式開發環境的應用程式,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面工具。就是集成了代碼編寫功能、分析功能、編譯功能、調試功能 ...
  • 一.攔截器與過濾器的區別: 1.filter基於回調函數,我們需要實現的filter介面中doFilter方法就是回調函數,而interceptor則基於Java本身的反射機制,這是兩者最本質的區別。 2.filter是依賴於servlet容器的,即只能在servlet容器中執行,很顯然沒有serv ...
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】A 集成代碼生成器(開發利器); 技術:313596790 增刪改查的處理類,ser ...
  • 適配器模式(Adapter) 適配器模式有兩種形式:類的適配器模式和對象的適配器模式。 一、類的適配器模式 類圖 描述 類的適配器模式: Target,目標介面,可以是具體的或抽象的類,也可以是介面; Adaptee,需要適配的類; Adapter,適配器類,把源介面轉換成目標介面;Adapter類 ...
  • 我們可以試驗一下,JS類的繼承 children.constructor==father 返回的是true,而原型繼承children.constructor==father 返回的是false; ...
  • 1.解決HTML頁面中的中文問題: 為了使HTML頁面很好地支持中文,就必須在每個HTML頁面的頭部增加如下代碼: <HEAD> ... <META http-equiv=Content-Type content="text/html;charset=gb2312"> ... <HEAD> 2.解決 ...
  • 本文內容 Angular JS 實現模式對話框。基於 AngularJS v1.5.3 和 Bootstrap v3.3.6。 項目結構 圖 1 項目結構 運行結果 圖 1 運行結果:大模態 index.html Angul... ...
  • 本文要介紹的是網頁中常見的圖片上傳後直接在頁面生成小圖預覽的實現思路,考慮到該功能有一定的適用性,於是把相關的邏輯封裝成了一個ImageUploadView組件,實際使用效果可查看下一段的git效果圖。在實現這個組件的過程中,有用到前面幾篇博客介紹的相關內容,比如繼承庫class.js,任意組件的事... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...