博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子元素要绝对定位时,父元素应该怎么办?
阅读量:6409 次
发布时间:2019-06-23

本文共 2034 字,大约阅读时间需要 6 分钟。

问题:

         如果子元素设置绝对定位(absolute),父元素需要设置相对定位(relative),否则子元素就不知道会飘到哪去了。

本着知其然还要知其所以然的学习态度,就去Google了,得到了一些见解,以下:

 

一、表


 

实现子元素在父元素中的绝对定位必须满足以下两个条件:

1、父元素要有相对定位属性(position:relative),

2、子元素设置绝对定位(position:absolute),并且同时加四个方向(top,bottom,left,right)的任意方向的属性值

1
2

这个理解应该是从代码的书写形式总结的,虽然能满足页面要求,但其实是有谬误的。具体看下面分析。

 

二、里


 

子元素的绝对定位是包含块“containing block”的知识,

在 10.1 节 () 提到:
The position and size of an element's box(es) are sometimes calculated relative to a certain rectangle, called thecontaining block of the element. 
在下面的详细定义中,分情况说明了具有不同 position 属性的元素如何确定 containing block,其中第 4 点是绝对定位元素的情况:
If the element has 'position: absolute', the containing block is established bythe nearest ancestor with a 'position' of 'absolute', 'relative' or 'fixed', in the following way:
  1. In the case that the ancestor is an inline element, the containing block is the bounding box around the padding boxes of the first and the last inline boxes generated for that element. In CSS 2.1, if the inline element is split across multiple lines, the containing block is undefined.
  2. Otherwise, the containing block is formed by the padding edge of the ancestor.
If there is no such ancestor, the containing block is theinitial containing block.
从这里可以看到,一个元素的 containing block 是由其最近的 position 为 absolute / relative / fixed 的祖先元素决定的。
如果没有找到,则为 initial containing block。需要注意 initial containing block 并不是所谓的以 <body> 或是 <html> 定位的。
对这个 initial containing block 规范前文有描述:
The containing block in which the root element lives is a rectangle called the initial containing block. For continuous media,
it has the dimensions of the viewport and is anchored at the canvas origin; ...
这就是说,initial containing block 是以整个 canvas (渲染内容的空间, ) 的坐标原点(左上)为基准,以 viewport (也就是浏览器视窗内渲染 HTML 的空间)为大小的矩形。
所以平时说的 position:absolute 元素相对最近的 position 为 absolute / relative / fixed 的祖先元素,或在找不到时基于根元素定位,这后面一半是错误的。
 

 
综上,子元素的绝对定位是相对于最近的position为absolute/relative/fixed的祖先元素,找不到时就相对于初始块(initial containing block)定位。
 

转载于:https://www.cnblogs.com/qjqcs/p/5034269.html

你可能感兴趣的文章
[Android]Bluetooth Smart Android application code
查看>>
android动画 对fillBefore 和 fillAfter的理解
查看>>
如何更新npm至最新版本
查看>>
token 验证失败 可能的问题分析
查看>>
二进制字符串转换为int类型
查看>>
js 调用 dll
查看>>
js页面跳转整理
查看>>
cpptest学习之CurrentLanguageTest
查看>>
iOS学习之Tab Bar的使用和视图切换
查看>>
PHP简单获取及判断提交来源的方法
查看>>
Apache配置站点与虚拟目录大全
查看>>
rsync命令基础
查看>>
springboot 之 小项目入门
查看>>
利用SolrJ添加索引
查看>>
Jenkins在Linux下的安装与配置
查看>>
RMAN 备份详解 (一)
查看>>
PHP error_reporting() 函数
查看>>
EhCache和memcached介绍
查看>>
jQuery ajax()使用serialize()提交form数据
查看>>
程序框架的作用
查看>>