transform你不知道的那些事

transform是諸多css3新特性中最打動我的,因為它讓方方正正的box module變得真實了。

transform通過一組函數實現了對盒子大小、位置、角度的2D或者3D變換。不過很長時間內,我對以下問題都想不太明白:

1、尺寸縮放scalezoom變換有何不同,為什么被scale的盒子里的內容不會錯位,但zoom不是。

2、位移(transform:translate)與相對定位、絕對定位(position:relative | absolute)有何關系?

3、在實際項目中發現,位圖(無論是background-image還是img)在被transform后會模糊掉,尤其是scale;不僅如此,在一些網站,比如tmall.com,即使是矢量的svg文件在使用transform后,依然模糊了,transform是否對作用的盒子進行了類似柵格化的操作?

4、在實際項目中發現,如果父級元素使用了transform且其中的子元素進行了position:fixed定位,那么設置了position:fixed的子元素將不再基于窗口定位。

5、這種場景暫時未能重現,在chrome下:父級元素使用了position:fixed,子元素<a href=".."></a>設置了:hover偽類、transition過渡動畫、并使用javascript動態添加/刪除其class,此時會出現:hover樣式失效或添加的class樣式失效且transition過渡動畫失效的現象。

等等。

先說原理吧。

在網上查看了一些大神的博客,transform是通過一系列矩陣變換完成的,scale等transform-function都是對matrix的封裝,w3c里沒找到有關說明。對于線性代數里的東西,博主表示非常小白,其中的數學原理,還是交給其他人去解釋吧o(︶︿︶)o

w3里的解釋是,transform基于可視化格式模型(visual formatting model,這樣翻譯對不對啊)并為其繪制出一個坐標系,而且所有在這個坐標系內進行的操作,如向右向下,都是在這個坐標系內以像素方式表示,原文:

The CSS visual formatting model describes a coordinate system within each element is positioned. Positions and sizes in this coordinate space can be thought of as being expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

那是不是意味著scale縮放,是否只是像素意義上的縮放呢?由此,因縮放導致的svg等矢量內容模糊失真是情理之中了??_?

個人猜測,應該先轉換成像素,然后進行渲染,這應該和每個瀏覽器具體渲染過程有關,相關文檔我沒有查,如果有知道的,請給我留言。

要理解transform,還有一個事情要搞清楚,就是visual formatting model,借助谷歌度娘,找到了w3chelp上的中文版解釋:

可視化格式模型是非常抽象的概念。它是 CSS 布局的核心,通過它,框( box )可以獲得應有的尺寸,放到需要的位置。

我們通常所看到的頁面都是平面 2D 的效果,但可視化模型卻是 3D 的,除了 X 軸,Y 軸,還有決定元素顯示順序1的 Z 軸。 Z 軸垂直穿過計算機屏幕,面向用戶的一側是正軸,框在 Z 軸方向上離用戶越近,顯示越是靠前。

可視化格式模型的官方說法是,它規定了用戶端在媒介中如何處理文檔樹( document tree )

……

本部分會涉及很多新概念,如包含塊、元素的類型、定位體系、塊級格式化上下文、行內格式化上下文、浮動、絕對定位和 z-index,以及可視化格式模型的細節部分,自動寬度高度的計算等。

博主第一次聽到visual formatting model這個概念,但看了解釋應該知道,這不是一個新概念,姿勢水平捉急了?_?

根據這個解釋,元素設置了transform并不會改變元素所在的文檔流,其布局仍然受盒模型支配,因此這里的變換的效果是可以與浮動、定位并存的。

  • 當元素設置了transform后,會為該元素定義一個坐標系,并且在該坐標系內進行矩陣變換,將變換結果映射到用戶坐標系(也就是實際上的上下文)中。

  • 多個矩陣變換函數將依次從左到右計算,如transform:translate(80px, 80px) scale(1.5, 1.5),瀏覽器會先計算位移,再縮放1.5倍。以下兩種代碼效果相同:

    html <div style="transform: translate(80px, 80px)"> <div style="transform: scale(1.5, 1.5)"> <div style="transform: rotate(45deg)"></div> </div> </div>

    html <div style="transform: translate(80px, 80px) scale(1.5, 1.5) rotate(45deg);"> </div>

  • 坐標原點的位置受屬性 transform-origin的影響。

  • 如果是3D變換,則還會將其加入一個3D渲染上下文(3D rendering context)。根據個人理解,無論有多少個轉換為3D的元素,其將始終在這個上下文內并可能相互影響,類似一個文檔中的多個被絕對定位的元素。

  • 任何非none的transform值都會導致一個堆疊上下文(stacking context)和包含塊(containing block)的創建。

不過,并不意味著和諧,不然怎么會有那么多坑問題嘛!(,,?▽?,,)

如果元素因為transform而撐開了父級元素,父級元素會根據自身的overflow屬性決定是否出現滾動條、隱藏溢出的部分或是別的什么。

另外,根據規范,由于堆疊上下文的創建,該元素會影響其子元素的固定定位:被設置position:fixed的子元素將不會基于viewport定位,而是基于這個父元素。

我們知道,一般情況下,所有的position值不為static的元素都會被放到同一個堆疊上下文內(ie不高級瀏覽器不算),也就是說,只存在 一個堆疊上下文。而設置了transform的元素則不同,由于它創建了一個新的堆疊上下文,也就是說,其內部被定位的元素的z-index會放在一個完 全獨立的空間內。

但是這個堆疊上下文不包含被定義transform的元素本身,它仍被放在更大的堆疊上下文(如果有的話)里。

說到這,開篇提到的問題2、4都已經找到答案了,但目前,Chrome還存在一個bug:rendering bug : position:fixed AND -webkit-transform。

上面提得另一個問題重現場景比較麻煩,先不討論了。

留幾個坑回頭填:

  • transform 遇見 display:table | table-row | table-cell
  • 3D渲染上下文是個什么玩意
  • 陌生又熟悉的backface-visibility
  • transform 與 css3動畫
  • transform 與 canvas
  • transform 與 svg

轉載于:https://www.cnblogs.com/gyjWEB/p/4832998.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258290.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SVM】簡單介紹(三)

我們考慮SVM的對偶問題&#xff0c;我們通常是在對偶空間中進行求解的。 1、Lagrange Multipliers 對于一個很一般的問題 Minimize f(x)subject to {a(x)≥0b(x)≤0c(x)0\begin{aligned} \text { Minimize } & f(x) \\ \text { subject to } \quad & \left\{\begin{a…

玩轉iOS開發:NSURLSession講解(三)

文章分享至我的個人技術博客: https://cainluo.github.io/14986211698053.html 前言 雖然前面兩講都是說了NSURLSession的一些理論上的知識, 但我們現在起碼對NSURLSession有個大概的了解, 并不會像一開始的那樣, 一臉懵逼的看著, 這個請求是什么鬼, 那個方法是什么鬼, Task是什…

輕松搞定面試中的二叉樹題目

版權全部&#xff0c;轉載請注明出處&#xff0c;謝謝&#xff01;http://blog.csdn.net/walkinginthewind/article/details/7518888 樹是一種比較重要的數據結構&#xff0c;尤其是二叉樹。二叉樹是一種特殊的樹&#xff0c;在二叉樹中每一個節點最多有兩個子節點&#xff0c;…

李倩星r語言實戰_《基于R的統計分析與數據挖掘》教學大綱

《基于R的統計分析與數據挖掘》課程教學大綱課程代碼&#xff1a;090542009課程英文名稱&#xff1a;R Language and Data Mining課程總學時&#xff1a;32講課&#xff1a;32實驗&#xff1a;0上機&#xff1a;0適用專業&#xff1a;應用統計學大綱編寫(修訂)時間&#xff1a;…

自動化測試小結

最近差不多一年從事自動化的測試工作&#xff0c;從開始對自動化一點都不了解到現在能從實現用例、手動命令行執行用例、自制工具來執行用例&#xff0c;感覺進步還是有的。 自動化測試對于手動測試應該是有不小的優勢的&#xff0c;雖然在自動化的用例實現中剛開始的時候會顯得…

python地理可視化_【Python教程】地理可視化之二

Basemap是Matplotlib的一個子包&#xff0c;負責地圖繪制。昨天的推送對如何繪制風向圖進行了描述&#xff0c;本文再次利用該包簡單介紹如何繪制海洋及海冰溫度彩色圖示&#xff0c;該圖常見于NOAA官網。具體操作如下&#xff1a;導入命令1)設置工作環境并導入程序包%cd "…

尋找白板上的便簽條

問題來源&#xff1a;http://answers.opencv.org/question/162480/contour-detection-for-gray-stickers-on-white-background/ 題目的大概意思就是這樣的白板&#xff0c;尋找上面的各種便簽條。我找到了橘色的&#xff0c;結果是這樣代碼是這樣Mat src imread("gray-st…

LeetCode Permutations

原題鏈接在這里&#xff1a;https://leetcode.com/problems/permutations/ 題目&#xff1a; Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2]…

去除內存上的警告,避免程序崩掉

# pragma clang diagnostic push # pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:callFunc withObject:array[1]]; # pragma clang diagnostic pop 使用原理&#xff1a;將出現警告的代碼加入內存棧中轉載于:https://www.c…

opengl2 vtk 編譯_編譯和使用VTK時值得注意的點(待續)

最近的一個項目中需要使用VTK&#xff0c;于是開始了VTK的漫漫編譯之路。長篇大論的編譯步驟網上數不勝數&#xff0c;在這里不再細說&#xff0c;可自行google。這里主要說一些在編譯過程中需要注意的地方&#xff0c;以免走歪路。1、使用cmake進行第一次configure的時候需要選…

gg

轉載于:https://www.cnblogs.com/lyzuikeai/p/7091206.html

二:Go編程語言規范-類型

1.類型 布爾值&#xff0c;數值與字符串類型的實例的命名是預聲明的。 數組&#xff0c;結構&#xff0c;指針&#xff0c;函數&#xff0c;接口&#xff0c;切片&#xff0c;映射和信道這些復合類型可由類型字面構造。 每個類型 T 都有一個 基本類型&#xff1a;若 T 為預聲明…

HDU 1728 逃離迷宮

這道題做的我想哭啊。。WA了將近十次了吧 一開始我用數組模擬的隊列&#xff0c;后來和老大代碼對拍&#xff0c;感覺改的是基本都一模一樣了&#xff0c;還是WA 實在沒有辦法了&#xff0c;改用queue了 題目里的x是列y是行&#xff0c;和代碼里的反過來的&#xff0c;要注意&a…

Nginx(六)-- 配置文件之Gzip

1.概念及作用 Gizp主要對內容、靜態文件做壓縮&#xff0c;用來提升網站訪問速度&#xff0c;節省帶寬。 2.使用方法 gzip既可以配置在server中&#xff0c;也可以配置在server外&#xff0c;此處配置在server中&#xff0c;如下&#xff1a; 說明&#xff1a;  gizp on|off 是…

誤碼率越高越好還是越低越好_夜間護理步驟越多越好還是越少越好?NFF

現在很多人都知道了夜晚是護膚的黃金護膚時間&#xff0c;有些很聰明的姐妹就從夜晚著手&#xff0c;使用很多種護膚品&#xff0c;希望達到事半功倍的效果&#xff0c;但好皮膚不常有&#xff0c;皮膚問題卻常有&#xff01;既然如此&#xff0c;不少人就問了&#xff0c;夜間…

【隨機森林】random forests 簡單介紹

Random Forest&#xff0c;顧名思義 Random 就是隨機抽取&#xff1b; Forest 就是說這里不止一棵樹&#xff0c;而由 一群決策樹組成的一片森林 &#xff0c;連起來就是用隨機抽取的方法訓練出一群決策樹來完成分類任務。RF用了兩次隨機抽取, 一次是對訓練樣本的隨機抽取; 另一…

側邊工具開發2

1.使用圖片的形式會出現大量的圖片&#xff0c;影響性能&#xff0c;而且不易修改&#xff0c;所有使用圖標加文字的形式進行 <a href"javacript:;" class"toolbar-item"><span class"toolbar-btn"><i class"toolbar-icon&q…

斐波那契?

斐波那契&#xff1f; Time Limit: 1000ms Memory limit: 32768K 有疑問&#xff1f;點這里^_^ 題目描述 給出一個數列的遞推公式&#xff0c;希望你能計算出該數列的第N個數。遞推公式如下&#xff1a; F(n)F(n-1)F(n-2)-F(n-3). 其中&#xff0c;F(1)2, F(2)3, F(3)5. 很熟…

clustalw序列比對_序列比對之Clustalx與Clustalw使用指南

相關專題這幾天實驗需要做多序列比對&#xff0c;很久不做了&#xff0c;一時之間不知道如何使用clustal這個工具了。在網上搜集了一些資料&#xff0c;做個整理&#xff0c;總結了Clustalx和Clustalw的使用&#xff0c;省得以后久不使用又生疏了&#xff0c;又要去整理了&…

信息安全系統設計基礎第三周學習總結—20135227黃曉妍

一.Vim編輯器 1.Vim的六種模式 2.Vim三種常用模式的使用方式&#xff0c;以及三者的切換。打開Vim即默認進入普通模式&#xff0c;按i進入插入模式&#xff0c;按esc從插入模式退出普通模式&#xff0c;再按&#xff1a;進入命令行模式。 普通模式下游標的移動 按鍵 說明 h …