CSS3 transform 对HTML文档流带来的影响
html 总是那么的惊奇
来源于“硬件加速”
年初的一个笔记,闲时整理出来。
很多网上文章都说建议打开浏览器的硬件加速,这样页面渲染速度、动画流畅性会提高。这几乎成了很多人页面制作的标配,管实际有没有用都来一个:
html,body { transform: translate3d(0,0,0); }
但这在很多情况下会引起 html 层级文档流的“异常”。
W3C spec 中有如下描述:
In the HTML namespace, any value other than none for the transform results in the creation of both a stacking context and a containing block.
The object acts as a containing block for fixed positioned descendants.
意思是:
在 HTML 内,没有比对一个即是层叠对象又是容器块的 DOM 进行 transform
变换更没有意义的了。
这类对象也扮演着 positioned
(主要是 absolute/fixed ) 子孙元素容器的角色。
。。。翻译能力有限,不理解的人估计这句话看了后更晕,下面详述。
标准文档流
页面中的 dom 元素按照其在 HTML 中的标签位置顺序进行从上到下、从左往右的排布过程
想必大家对这个基础的定义已经很熟悉了吧。但是,这个究竟在实际中有什么体现呢?
如果你在页面中放置一大堆 display: inline-block
的元素,它们会很乖巧的 上 -> 下 左 -> 右 排的很整齐。这就是标准文档流
的基础体现。
当你用position
、float
等属性使其脱离文档流时,就会又产生一个页面 层级
的概念。(扯远了...)
transform 改变定位默认属性
例子代码如下:
<body> <header style="position: fixed; top: 0; width: 100%; background: red;">header</header> <p style="height: 2000px;"></p> <footer style="position: fixed; bottom: 0; width: 100%; background: blue;">footer</footer> </body>
点击查看例子
dom 元素的默认定位属性是 position: static;
这也是标准文档流的标准定位方式。
例子中,不管 p 怎么上下滚动,header 和 footer 会永远置于屏幕的最上和最下部。
但是如最初所述,给 body
或 html
加上一个 transform: translate3d(0,0,0);
,你再去试,就会发现,原本 position: fixed;
的两个元素都不听话了,会随着屏幕进行滚动。
实际上,position: fixed;
的参考对象并不是大家所说的屏幕,而是一个 viewport
的html对象,一般地一个页面(document.documentElement
)会生成一个 viewport。
你用 document.documentElement.clientHeight
就可以的看到实际 viewport 的高度,其中 fixed
的元素都是以此为容器进行定位的。
body(或html) 加了 transform
属性以后,整个 body
DOM 既会产生相应的变换,但此时的“整个”仅是指 body 下标准文档流元素,对于那些 position: absolute;
/ position: fixed;
元素,因为已经脱离了 body 所属的文档流,所以无法凭借 body 的变换使自己也自然的达到相应的变换效果。
此时,浏览器为了让此类 DOM 得到相应的变化,会产生一个新的 viewport,这个 viewport 作为定位元素的容器存在,会响应 body 的 transform
变换效果,从而让里面那些脱离文档流的 positioned
元素也能进行变换。
这个 viewport 会严重影响 position: fixed;
的定位,当它随着“本尊”dom同步滚动的时候,会带着 fixed
元素一块滚,此时会产生一种类似 absolute
的诡异效果:
fixed
元素似乎变成了 absolute
,存在于一个和document.documentElement
大小一致的“看不见”容器内。
引申情况
在一些移动端设备(或APP)上,给 <video>
标签的播放默认开启的硬解码,此时也会产生上述现象,视频会"浮"在页面上面,不会随页面元素正常滚动。
还有一些低版本移动端浏览器上,也会出现类似的情况,可按此思路尝试解决。
总结
其实上面的情况不只会发生在 body
上,一个任意的 dom 添加了 transform
之后都会生产一个类似 viewport 的效果,有兴趣可以去尝试。
引用:
http://www.php.cn/
html 总是那么的惊奇
来源于“硬件加速”
年初的一个笔记,闲时整理出来。
很多网上文章都说建议打开浏览器的硬件加速,这样页面渲染速度、动画流畅性会提高。这几乎成了很多人页面制作的标配,管实际有没有用都来一个:
html,body { transform: translate3d(0,0,0); }
但这在很多情况下会引起 html 层级文档流的“异常”。
W3C spec 中有如下描述:
In the HTML namespace, any value other than none for the transform results in the creation of both a stacking context and a containing block.
The object acts as a containing block for fixed positioned descendants.
意思是:
在 HTML 内,没有比对一个即是层叠对象又是容器块的 DOM 进行 transform
变换更没有意义的了。
这类对象也扮演着 positioned
(主要是 absolute/fixed ) 子孙元素容器的角色。
。。。翻译能力有限,不理解的人估计这句话看了后更晕,下面详述。
标准文档流
页面中的 dom 元素按照其在 HTML 中的标签位置顺序进行从上到下、从左往右的排布过程
想必大家对这个基础的定义已经很熟悉了吧。但是,这个究竟在实际中有什么体现呢?
如果你在页面中放置一大堆 display: inline-block
的元素,它们会很乖巧的 上 -> 下 左 -> 右 排的很整齐。这就是标准文档流
的基础体现。
当你用position
、float
等属性使其脱离文档流时,就会又产生一个页面 层级
的概念。(扯远了...)
transform 改变定位默认属性
例子代码如下:
<body> <header style="position: fixed; top: 0; width: 100%; background: red;">header</header> <p style="height: 2000px;"></p> <footer style="position: fixed; bottom: 0; width: 100%; background: blue;">footer</footer> </body>
点击查看例子
dom 元素的默认定位属性是 position: static;
这也是标准文档流的标准定位方式。
例子中,不管 p 怎么上下滚动,header 和 footer 会永远置于屏幕的最上和最下部。
但是如最初所述,给 body
或 html
加上一个 transform: translate3d(0,0,0);
,你再去试,就会发现,原本 position: fixed;
的两个元素都不听话了,会随着屏幕进行滚动。
实际上,position: fixed;
的参考对象并不是大家所说的屏幕,而是一个 viewport
的html对象,一般地一个页面(document.documentElement
)会生成一个 viewport。
你用 document.documentElement.clientHeight
就可以的看到实际 viewport 的高度,其中 fixed
的元素都是以此为容器进行定位的。
body(或html) 加了 transform
属性以后,整个 body
DOM 既会产生相应的变换,但此时的“整个”仅是指 body 下标准文档流元素,对于那些 position: absolute;
/ position: fixed;
元素,因为已经脱离了 body 所属的文档流,所以无法凭借 body 的变换使自己也自然的达到相应的变换效果。
此时,浏览器为了让此类 DOM 得到相应的变化,会产生一个新的 viewport,这个 viewport 作为定位元素的容器存在,会响应 body 的 transform
变换效果,从而让里面那些脱离文档流的 positioned
元素也能进行变换。
这个 viewport 会严重影响 position: fixed;
的定位,当它随着“本尊”dom同步滚动的时候,会带着 fixed
元素一块滚,此时会产生一种类似 absolute
的诡异效果:
fixed
元素似乎变成了 absolute
,存在于一个和document.documentElement
大小一致的“看不见”容器内。
引申情况
在一些移动端设备(或APP)上,给 <video>
标签的播放默认开启的硬解码,此时也会产生上述现象,视频会"浮"在页面上面,不会随页面元素正常滚动。
还有一些低版本移动端浏览器上,也会出现类似的情况,可按此思路尝试解决。
总结
其实上面的情况不只会发生在 body
上,一个任意的 dom 添加了 transform
之后都会生产一个类似 viewport 的效果,有兴趣可以去尝试。
更多CSS3 transform 对HTML文档流带来的影响相关文章请关注PHP中文网!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Bagaimana untuk mencapai kesan gelombang dengan CSS3 tulen? Artikel ini akan memperkenalkan kepada anda cara menggunakan animasi SVG dan CSS untuk mencipta kesan gelombang Saya harap ia akan membantu anda!

Cara menggunakan CSS untuk melaksanakan kesan animasi imej latar belakang yang berputar bagi elemen kesan animasi imej latar belakang boleh meningkatkan daya tarikan visual dan pengalaman pengguna halaman web. Artikel ini akan memperkenalkan cara menggunakan CSS untuk mencapai kesan animasi latar belakang elemen yang berputar dan memberikan contoh kod khusus. Pertama, kita perlu menyediakan imej latar belakang, yang boleh berupa gambar yang anda suka, seperti gambar matahari atau kipas elektrik. Simpan imej dan namakannya "bg.png". Seterusnya, buat fail HTML dan tambahkan elemen div dalam fail, tetapkan kepada

Artikel ini akan menunjukkan kepada anda cara menggunakan CSS untuk melaksanakan pelbagai butang berbentuk pelik yang kerap muncul. Saya harap ia akan membantu anda!

Dua kaedah: 1. Menggunakan atribut paparan, cuma tambah gaya "display:none;" pada elemen. 2. Gunakan kedudukan dan atribut teratas untuk menetapkan kedudukan mutlak elemen untuk menyembunyikan elemen. Cuma tambahkan gaya "position:absolute;top:-9999px;".

Dalam CSS, anda boleh menggunakan atribut imej sempadan untuk mencapai sempadan renda. Atribut imej sempadan boleh menggunakan imej untuk membuat sempadan, iaitu, menambah imej latar belakang ke sempadan Anda hanya perlu menentukan imej latar belakang sebagai gaya renda; lebar sempadan imej ke dalam. Sama ada permulaan diulang;".

Kaedah pelaksanaan: 1. Gunakan pemilih ":aktif" untuk memilih keadaan klik tetikus pada gambar 2. Gunakan atribut transform dan fungsi skala() untuk mencapai kesan pembesaran gambar, sintaks "img:active {transform; : skala(pembesaran paksi-x, y Pembesaran paksi);}".

Bagaimana untuk mencipta karusel teks dan karusel imej? Perkara pertama yang semua orang fikirkan ialah sama ada untuk menggunakan js Malah, karusel teks dan karusel imej juga boleh direalisasikan menggunakan CSS tulen. Saya harap ia akan membantu semua orang.

Bagaimana untuk memampatkan dan memformat imej dalam Vue? Dalam pembangunan bahagian hadapan, kami sering menghadapi keperluan untuk memampatkan dan memformat imej. Terutamanya dalam pembangunan mudah alih, untuk meningkatkan kelajuan memuatkan halaman dan menjimatkan trafik pengguna, adalah penting untuk memampatkan dan memformat imej. Dalam rangka kerja Vue, kita boleh menggunakan beberapa perpustakaan alat untuk memampatkan dan memformat imej. Mampatan menggunakan perpustakaan compressor.js compressor.js ialah JavaS untuk memampatkan imej
