translate元素中的Position: fixed

最近写奇葩的布局遇到了奇葩的问题,想给一个父元素加上translate3d来实现GPU加速,发现加上tranlate3d之后,fixed定位的自元素不是相对于viewport了,二是相对于有translate3d的父元素。

查了查fixed的定义,按照标准定位确实是相对于viewport
- https://www.w3.org/TR/css-position-3/#fixed-pos

Fixed positioning is similar to absolute positioning. The only difference is that for a fixed positioned box, the containing block is established by the viewport.

于是又查了查fixed和translate,找到了答案
- transfomr会生一个层叠上下文和一个包含块(containing block),这个东东会成为fixed定位的子元素的包含块。
- https://www.w3.org/TR/css-transforms-1/#transform-rendering

For elements whose layout is governed by the CSS box model, 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.
- 然后下面提了个issue

Is this effect on position: fixed necessary? If so, need to go into
more detail here about why fixed positioned objects should do this,
i.e., that it’s much harder to implement otherwise. See Bug 16328.

最后曲线救国,用will-change去实现新图层加速,但是使用will-change也要注意

用 3D 变换开启硬件加速,这个方法其实是个 hack 手段,每个 hack 的背后都有各种惊心动魄的坑。will-change 则是一个更加符合人类逻辑的方法。这个属性意在告诉浏览器,什么元素将发生什么变化,这样浏览器可以提前做好优化准备,就像起跳前的助跑一样。

文档建议是通过 js 来控制 will-change,如果把 will-change 常驻在某个元素上,比如在 css 文件中有一行 .ele { will-change:transform; },那么浏览器会一直处于“警备状态”,也就是说浏览器始终会分配资源给这个元素。所以,最好是动态地控制这个属性,保证浏览器资源不会被浪费,特别是在 CPU GPU 处理能力和内存吃紧的移动设备上。当动画结束的时候,及时将 will-change 属性值变回 auto,释放资源。

上文说到了当动画结束时,will-change 的值要及时被更新为 auto,这个通过 js 可以掐准时间。但现在,要抛出一个早该问出的问题了:结束时要改变,开始时也需要变呀,那什么时候添加这个属性呢?可不能动画执行了一半,才加上这个属性。要在动画发生之前,给浏览器足够的反应时间才行。这篇文章中的作者提到了一个场景,如果一个元素在 hover 时如果会出现动画,那么就要在它的父级元素 hover 时,就给这个元素加上 will-change;

PS,关于启动GPU加速可以戳http://blog.csdn.net/u010552788/article/details/52186108,虽然写的很少搓搓的,可以继续戳参考文献 233333

### 回答1: 要让一个 position: fixed 的 div 元素在页面,可以使用如下的 CSS 样式: ```css div { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); } ``` 这样设置后,div 元素将会以页面心为基准点进行定位。其,top 和 left 分别设置为 50%,表示相对于父元素心点进行定位;transform 属性translate(-50%, -50%) 表示将元素自身的心点向左上方移动 50%,这样就可以实现完全居的效果。 ### 回答2: 在使用`position: fixed`之后,要让`div`居,可以通过以下两种方式实现。 方法一:使用`left`和`top`属性结合`transform`属性。 ```css .div-class { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); } ``` 以上代码将`div`的左上角定位在屏幕的心位置。通过`left: 50%`和`top: 50%`将`div`的起始位置定位在屏幕的心点,然后使用`transform: translate(-50%, -50%)`将`div`自身向左上方移动自身宽度和高度的一半,实现居效果。 方法二:使用flexbox布局。 ```css .container { display: flex; justify-content: center; align-items: center; } .div-class { position: fixed; } ``` 以上代码将包含`div`的容器设置为`display: flex`,并在容器使用`justify-content: center`和`align-items: center`让`div`居。这种方法更加灵活,可以适应不同尺寸和样式的`div`。 以上两种方法都可以让`div`在使用`position: fixed`后实现居效果,具体选择哪种方法取决于项目需求和布局结构。 ### 回答3: 在使用position: fixed之后,想要让div居,可以通过以下步骤实现: 1. 首先,确保div的父元素具有相对定位(position: relative)属性。这是因为,固定定位(position: fixed元素的定位是相对于最近的具有定位属性的父元素。 2. 给父元素设置以下CSS属性: display: flex; // 将父元素设置为弹性盒子 justify-content: center; // 将子元素在父元素的水平方向上居 align-items: center; // 将子元素在父元素的垂直方向上居 3. 确保div本身也具有一些样式,例如设置宽度(width)和高度(height),以便它在屏幕上可见。 通过上述步骤,可以将固定定位的div元素显示在页面上。同时,您还可以根据需要进行相应的微调,例如在父元素上设置padding或margin属性,以获取更满意的布局效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值