祖先元素transform非none时在Iphone6上引起后代fixed/absolute元素的怪异表现及解决方案
如题,祖先元素transform
非none
时,记录一下Iphone6
中引起后代元素fixed
参考视图怪异表现和解决方案。
- 层叠关系及参考视图
层叠上下文是
HTML
元素的三维概念,这些HTML
元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML
元素依据其自身属性按照优先级顺序占用层叠上下文的空间。
文档中的层叠上下文由满足以下任意一个条件的元素形成:
- 根元素 (
HTML
), z-index
值不为 "auto
"的 绝对/相对定位,- 一个
z-index
值不为 "auto"的flex
项目 (flex item
),即:父元素display: flex|inline-flex
, opacity
属性值小于 1 的元素,transform
属性值不为 "none
"的元素,mix-blend-mode
属性值不为 "normal
"的元素,filter
值不为“none
”的元素,perspective
值不为“none
”的元素,isolation
属性被设置为 "isolate
"的元素,position: fixed
- 在
will-change
中指定了任意 CSS 属性,即便你没有直接指定这些属性的值(参考 这篇文章) -webkit-overflow-scrolling
属性被设置 "touch
"的元素
关于层叠上下文的层级及创建,可以参考下张鑫旭大神的深入理解CSS中的层叠上下文和层叠顺序,相当详细;在今天讨论的问题中,知道position:fixed
和transform
非none
都会创建新的层叠上下文,至于层级,在同一层叠上下文中,取决于后来居上及孰大孰上两个规则。
至于参考视图,两句话
absolute
:不为元素预留空间,通过指定元素相对于最近的非static
定位祖先元素的偏移,来确定元素位置。fixed
: 不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport
)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed
属性会创建新的层叠上下文。当元素祖先的transform
属性非none
时,容器由视口改为该祖先。
- 祖先元素transform属性不为none对子元素fixed的影响
不考虑其他因素的前提下,祖先元素的transform
属性不为none
时,按照规范,后代元素的表现应为:
absolute
元素依然保持以最近的非position: static;
的元素为参考,其中祖先元素也会被视为非position: static;
fixed
元素默认的参考视图是屏幕视口,在这里,祖先元素transform被设置为非none时,后代元素的参考视图应该是祖先元素;
Iphone6(未排查IOS版本)当中,不管祖先元素定位属性,子代元素定位属性为absolute/fixed
时,子代的子代及再往后的子代,定位属性为fixed时,定位视图并不是祖先元素- 祖先元素的子元素:定位视图是祖先元素;
正常
- 祖先元素的子元素的子元素:定位视图是祖先元素;
正常
- 祖先元素的子元素的子元素的子元素:以父级元素的左上角坐标为起点,祖先元素的长宽为长宽,画一个虚拟的视图,定位视图就是这个虚拟的视图;
异常
- 祖先元素的子元素的子元素的子元素的往后每一代,都沿袭第三代开始的表现,依当前元素的父元素左上角坐标为起点,祖先元素长宽为长宽的虚拟视图为定位视图;
异常
看代码及图:
- 祖先元素的子元素:定位视图是祖先元素;
/* html */
<div class="red">1
<div class="green">2
<div class="yellow">3
<div class="black">4
<div class="aquamarine">5
<div class="blue">6</div>
</div>
</div>
</div>
</div>
</div>
/* css */
.red{
width: 150px;
height: 150px;
background: red;
text-align: center;
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
.green{
position: absolute;
width: 120px;
height: 120px;
left: 0px;
top: 0px;
background: green;
}
.yellow{
position: fixed;
width: 80px;
height: 80px;
left: 0px;
bottom: 0px;
background: yellow;
}
.black{
position: fixed;
width: 50px;
height: 50px;
right: 0px;
top: 0px;
background: black;
}
.aquamarine{
position: fixed;
width: 30px;
height: 30px;
right: 0px;
bottom: 0px;
background: aquamarine;
}
.blue{
position: fixed;
width: 10px;
height: 10px;
right: 0px;
bottom: 0px;
background: blue;
}
左边图为正常情况下的表现,transform所有后代元素的fixed
参考视图都是transform
的祖先元素,而右边的是iphone6
上的表现,从第三代开始,参考视图变更为以父级元素左上角位置为起点,祖先元素长宽为长宽的虚拟视图为参考视图。因此情况变得不可控。
- 解决方案
- 既然事情因
transform
引起,就在fixed
定位嵌套三层以上时慎用transform
,这个为最基本的解决方案。 - 好吧,我没找到其他办法
祖先元素transform非none时在Iphone6上引起后代fixed/absolute元素的怪异表现及解决方案的更多相关文章
- absolute元素 text-align属性
text-align属性的元素可以有效作用于inline/inline-block水平的子元素,但是,text-align属性对应用了position:absloute/fixed声明的元素无效! ...
- CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景
全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 CSS样式设置语法全解: 样式优先级 1. !important标记的样式 > 内联样式(sty ...
- CSS float与clear & 替换元素与非替换元素
css3盒模型(box)中的一个概念,在css这种,每个元素生成了包含内容的框,有内联元素和块级元素之分.也可以区分为替换元素与非替换元素. 替换元素:浏览器根据标签的元素与属性来判断显示具体的内容. ...
- js获取元素transform参数得出的个人理解
之前写页面的时候有试过想用js获取某些元素的translate的数值什么的,但是translate又是transform的子样式(勉强说说),理所当然就是先获取transform样式,再读里面的值. ...
- Chrome opacity非1时border-radius圆角边框剪裁问题
border-radius:50%可以让元素正方形元素表现为正圆. 如果元素设置了border边框,则会表现为一个正圆圈圈,类似这样: 但有时候,border边框的这个圈圈会在边缘处发生剪裁,个别浏览 ...
- Java运行时异常和非运行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...
- backface-visibility当元素不面向屏幕时是否可见
html代码 <h1>div1可见</h1> <div class="div1">div---1</div> <h1>d ...
- IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常
标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...
- jquery 的 ajax 在 非阻塞 时返回 XMLHttpRequest
jquery 的 ajax 在 非阻塞 时返回 是 [object XMLHttpRequest] 对象(firefox 下 alert(对象名) 也可以直接看到对象类型) 返回的内容用 reques ...
随机推荐
- selenium+python自动化105 - selenium 如何在已打开的浏览器上继续运行自动化脚本?
前言 使用selenium 做web自动化的时候,经常会遇到这样一种需求,是否可以在已经打开的浏览器基础上继续运行自动化脚本? 这样前面的验证码登录可以手工点过去,后面页面使用脚本继续执行,这样可以解 ...
- Qt:lambda表达式
说明 c11之后加入了lambda表达式,所以Qt也支持 加载项 CONFIG += c++11 用法 [ capture ] ( parameters ) mutable -> return_ ...
- WIN10:删除开始菜单栏中的文件夹
C:\ProgramData\Microsoft\Windows\Start Menu\Programs,找到想删除的文件夹删除即可 其中ProgramData为隐藏文件夹,显示方式见下
- TypeError
1.only size-1 arrays can be converted to Python scalars 问题来源:需要把一个float数组A转为int,于是直接在代码中写了 B=int(A), ...
- 设置vim永久显示编号
永久显示行号,需要我们设置配置文件,两种配置方式: 1. /etc/vimrc 是系统范围的初始化配置 2. -/.vimrc 个人的vim初始化配置 编辑配置文件,以个人为例: vi ...
- L2Dwidget二次元前端添加人物插件
如果想要在博客园上添加这个插件,只需要在设置的"页首html代码"中添加下面的js就行 <!-- 右下角live2d效果 --> <script src=&quo ...
- MySQL启动报错Failed to open log (file 'D:\phpStudy\PHPTutorial\MySQL\data\mysql_bin.000045', errno 2)
MySQL报错 191105 9:39:07 [Note] Plugin 'FEDERATED' is disabled. 191105 9:39:07 InnoDB: The InnoDB memo ...
- docker学习(三) - docker理解及命令
Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubunt ...
- KDT入门小讲
KDT入门小讲 为了搞讲课两天搞出来的PPT,质量不高,随便看看 附:讲课用PPT 链接: https://pan.baidu.com/s/1qHea0fEhscAsQh8-Yu_j_A 提取码: 4 ...
- Mysql-基础-DDL-数据定义语言
一.SQL通用语法 SQL 语法可以单行或者多行书写,以分号结尾. SQL 语句可以使用空格/缩进来增强语句的可读性. Mysql 数据库的 SQL 语句不区分大小写,关键字建议使用大写. 注释: 单 ...