1. 前言

在写这篇文章之前,我理解的fixed元素是这样的:(摘自CSS布局基础)

固定定位与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身。由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口的屏幕位置,或改变浏览器窗口的显示大小,因此固定定位的元素会始终位于浏览器窗口内视图的某个位置,不会受文档流动影响,这与background-attachment:fixed;属性功能相同。

但是直到我看到这篇文章CSS 为什么这么难学?,作者在文章中提到了一个“黑魔法”,如何让fixed元素不再以viewport为定位参考对象,而是以父容器为参考对象。这下子我算是get到了一个技能。唯一不认同作者的是,他提到的CSS“不正交”,不好学,其实我认为根本原因是知识基础不够扎实罢了。凡事都有个原理,不可能无缘无故冒出一个科学解释不了的对象的。

于是这里我们打算以这个知识点为基础,去探讨为什么会这样然后写了一个比较使用的例子,在移动端用的可能会比较多。

2. 为什么fixed元素的父元素加了transform就会以父元素为参考对象?

详细的demo如下:

查看这个demo发现,我们在父元素设置了transform: scale(1);这个属性,然后其子元素fixed-to-container便以父元素为参考对象了,而且不再固定在某个地方,而是会随着文档流的流动而流动。

这是为什么呢?

答案在设置了transform属性的元素上,在W3c文档上transform属性,文档的定义翻译如下:

对于布局受CSS盒子模型控制的元素,transform属性不会影响transformed元素周围的内容流。但是,溢出区域的范围将会考虑上transform元素。这种行为类似于元素通过相对定位发生偏移时的情况。因此,如果overflow属性的值是`scroll`或`auto`的,滚动条将显示为需要看到在可见区域外转换的内容。

对于布局受CSS盒子模型控制的元素,除了配置为`none`之外,其他的`transform`属性值都会创建堆栈上下文。绘制的实现必须在其父栈上下文中它所创建的层中,如果它是带有“z-index: 0”的定位元素,则使用相同的堆叠顺序。如果一个带有`transform`的元素还配置了`position`属性,那么“z-index”属性将按照[CSS2](https://www.w3.org/TR/css-transforms-1/#biblio-css2)描述的被应用,除非“auto”被视为“0”,因为会创建新的堆栈上下文。

对于布局受CSS盒子模型控制的元素,除了配置为`none`之外,其他的`transform`属性值都将导致元素成为一个包含块,而其固定定位的后代元素都是以此object作为他们的包含块。

根元素的[Fixed Backgrounds](https://www.w3.org/TR/css3-background/#fixed0)会受到该元素上配置的transform属性的影响。对于受transform影响的所有其他元素(例如,对它们应用transform属性,或者对它们的任何祖先元素应用transform属性),  `background-attachment`属性值为`fixed`的元素会被当做它好像有配置`scroll`属性一样。其他`background-attachment`的计算值不受影响.

在这段介绍中我们发现transform会对fixed属性造成影响。具体表现可以看上面的那个demo。

简单来说就是:应用了transform属性的元素会导致该元素形成一个新的包含块,然后其后代元素如果有fixed定位的属性,那么其元素将会以该父元素作为包含块,从而有了之前我们看到的现象。

除了上述说的,我还是发现了另外两个特征:

  1. fixed元素不在固定在某个位置,失去了fixed元素特有的性质
  2. fixed元素不会脱离文档流,但是top等属性依然可用。可以看例子中的top属性,配置了top:10px;整个文档流都往下走10px;

3. 真的fixed元素,但是不以viewport为参考

这里说的真的fixed元素,是真的可以固定在某个位置,其他元素可以从其下面穿梭过去。在实际的项目中有一个很常见的需求,如下面的demo:

在demo中,我们点击按钮会弹出一个面板,在面板的最上面会有一个fixed的头部,面板的其他地方可以自由滑动,这种案例相信很多童鞋都会用到。

按照我们之前的说法,形成了这么一个解决方案。

不过不清楚这种做法是否是最佳的?精通CSS的童鞋是否有更好的做法呢?不吝赐教。

transform与position:fixed的那些恩怨--摘抄的更多相关文章

  1. transform与position:fixed的那些恩怨

    1. 前言 在写这篇文章之前,我理解的fixed元素是这样的:(摘自CSS布局基础) 固定定位与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身.由于视图本身是固定的, ...

  2. 父节点使用css的transform: translate(0, 0)时position:fixed在chrome浏览器中无效

    今天在做移动端的页面,无意间发现了一个Chrome浏览器下的一个bug,在使用CSS3的transform: translate(0, 0)属性对节点A进行位置转化,此时A节点下面有一个字节点B,节点 ...

  3. transform 遇上 position: fixed

    最近遇到一个有意思的现象,以下 demo 中 fixed 的元素没有相对 viewport 定位,而是相对于它的父元素进行定位. <html> <head> <style ...

  4. position:fixed失效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 关于position:fixed;的居中问题

    通常情况下,我们通过操作margin来控制元素居中,代码如下: #name{ maigin:0px auto; } 但当我们把position设置为fixed时,例如: #id{ position:f ...

  6. 不受控制的 position:fixed

    本文为纯理论文章,没有 Demo,没有配图,可能会略微枯燥. 大家都知道,position:fixed 在日常的页面布局中非常常用,在许多布局中起到了关键的作用.它的作用是: position:fix ...

  7. 苹果手机对网页上样式为position:fixed的弹窗支持不好的解决办法

    在Web页面上,如果想模拟对话框效果,一般会给div元素添加position:fixed的样式来实现,然后给背景添加一个半透明的遮罩.如: .fixedDiv { position: fixed; t ...

  8. position:fixed not work?

    问题 在position:fixed的使用中,突然发现某个操作之后,fixed定位的位置变了?? bottom:0,left:0.本来应该在最下面,结果跑没影了. wtf?position:fixed ...

  9. position:fixed失效情况

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Bootstrap历练实例:可取消的警告

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. Spring XML配置文件无法自动提示 eclipse中XML配置文件open with打开方式选择 XML Editor:注意它的编辑方式也是有两种的design和source

    双击XML配置文件,如果打开方式不正确 则如下图: 都是灰色显示,不会有自动提示,也不会有颜色标注 右击XML配置文件,选择打开方式为XML Editor,则会有颜色标注 如果此时没有自动提示 则要手 ...

  3. 如何用VS2017用C++语言写Hello world 程序?

    1,首先,打开VS2017. 2,左上角按文件——新建——项目,或按ctrl+shift+n. 3,按照图片里的选,选完按“确定”. 4,右键“源文件”,再按添加——新建项. 5,剩下的就很简单了,只 ...

  4. [vijos]P1979 NOIP2015 信息传递

    描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 TiTi 的同学. 游戏开始时,每人都只知道 ...

  5. Linux基础学习-使用vsftpd服务传输文件

    使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...

  6. LeetCode(205)Isomorphic Strings

    题目 Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ch ...

  7. URAL - 2065 Different Sums (思维题)

    题意: 给n和k,让你用不小于 k 个不同的数字构成一个长度为n的序列,使得序列中不同的区间和的数目最小. n,k<=500 k-1个数填一些数字的一正一负,这样有些区间和为0. 剩下的都填0. ...

  8. Linux编程中链接库的使用

    链接库本质上是一段可执行的二进制代码,可以被操作系统载入内存执行.按加载的时机不同,链接库可以分为静态链接库和动态链接库. 静态链接库:编译过程中加载进可执行文件的库(静态库省去了运行时加载的消耗,但 ...

  9. bootstrap 弹出框(Popover)插件 修改title等属性选项值

    <button type="button" class="btn btn-default ht-btn" data-toggle="popove ...

  10. iphone使用keychain来存取用户名和密码

    1.在arc下系统提示使用__bridge   http://www.cnblogs.com/zzltjnh/p/3885012.html 参考文档:http://blog.csdn.net/jerr ...