Note 8
CSS3 定位
positon属性指定了元素的定位类型(静态的,相对的,绝对的或固定的),默认值:static
JavaScript语法:object.style.position="absolute"
| 值 | 描述 |
|---|---|
| static | 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 |
| absolute | 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于 <html>元素的位置通过 left, top, right 以及 bottom 属性进行规定。能很准确的将元素移动到想要的位置。使元素的位置与文档流无关,因此不占据空间。 |
| fixed | 生成固定定位的元素,相对于浏览器窗口进行定位。 元素的位置通过 left, top, right 以及 bottom 属性进行规定。Fixed定位使元素的位置与文档流无关,因此不占据空间。 |
| relative | 生成相对定位的元素,相对于元素默认的位置进行定位(相对其正常位置)。 因此, left:20 会向元素的 LEFT 位置添加 20 像素。同样通过top、bottom、left以及bottom来明确元素的位置。移动相对定位元素,但它原本所占的空间不会改变。 |
| sticky | 粘性定位,该定位基于用户滚动的位置。 它的行为就像 position:relative; 而当页面滚动超出目标区域时,它的表现就像 position:fixed;,它会固定在目标位置。粘性定位的元素依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。它的行为就像 position:relative; 而当页面滚动超出目标区域时,它的表现就像 position:fixed;,它会固定在目标位置。元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。 这个特定阈值指的是 top, right, bottom 或 left 之一,换言之,指定 top, right, bottom 或 left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。 |
| inherit | 规定应该从父元素继承 position 属性的值。 |
| initial | 设置该属性为默认值,详情查看 CSS initial 关键字。 |
PPI & DPI & DPR
PPI (Pixels Per Inch,每英寸像素数)
- 定义:
PPI是指在一英寸长度内可以容纳的像素数量。它是一个度量单位,用来衡量显示设备的像素密度。PPI通常用于屏幕显示设备,如手机、电视和电脑显示器 - 应用:
PPI常用于描述屏幕的清晰度。PPI越高,屏幕显示的图像就越细腻,细节也就越丰富。
DPI (Dots Per Inch,每英寸点数)
- 定义:
DPI是一个更通用的术语,通常用来描述打印分辨率,即每英寸长度内可以打印的点(墨点)数量。 - 应用:
DPI用于衡量打印机、扫描仪等输出设备的分辨率。DPI越高,打印或扫描的图像质量就越高。 - 显示DPI:图像在屏幕上显示时的分辨率,取决于屏幕的尺寸和分辨率
DPR (Device Pixel Ratio,设备像素比)
- 定义:
DPR是指显示设备的物理像素与CSS像素的比率。CSS像素是一种虚拟的像素单位,用于网页设计中。 - 应用:
DPR用于处理高分辨率显示设备上的图像缩放问题。例如,一个具有2倍DPR的设备,其物理像素是CSS像素的两倍。
区别说明
- 应用领域:
PPI主要用于屏幕显示设备的像素密度,而DPI主要用于打印和扫描设备的分辨率。DPR是一个与Web设计相关的术语,用于处理不同分辨率设备上的图像和布局。 - 度量单位:
PPI和DPI都是以英寸为单位来度量像素或点的数量,但它们分别用于不同的设备和场景。 - 与设备分辨率的关系:
PPI是设备固有的属性,而DPI通常与打印质量相关。DPR是一个比率,用来调整Web内容在不同设备上的表现。
CSS 兄弟选择器(+ & ~)
在 CSS 中,兄弟选择器(Sibling Selectors)用于选择与某个元素具有相同父元素的相邻或后续兄弟元素。以下是两种常见的兄弟选择器及其用法:
1. 相邻兄弟选择器(Adjacent Sibling Selector)
语法:element1 + element2
作用:选择紧跟在 element1 之后的第一个 element2 元素。
示例:
<div>
<h2>标题</h2>
<p>段落1(被选中)</p> <!-- 紧跟在 h2 后的第一个 p -->
<p>段落2</p>
</div>h2 + p {
color: red; /* 仅段落1变为红色 */
}2. 通用兄弟选择器(General Sibling Selector)
语法:element1 ~ element2
作用:选择 element1 之后的所有 element2 兄弟元素(不要求直接相邻)。
示例:
<div>
<h2>标题</h2>
<p>段落1(被选中)</p>
<div>分隔块</div>
<p>段落2(被选中)</p> <!-- 所有 h2 后的 p 均被选中 -->
</div>h2 ~ p {
color: blue; /* 段落1和段落2均变为蓝色 */
}核心区别
| 特性 | +(相邻兄弟) | ~(通用兄弟) |
|---|---|---|
| 选择范围 | 仅紧邻的下一个元素 | 后续所有符合条件的元素 |
| 间隔元素 | 不允许中间有其他元素 | 允许中间有其他元素 |
| 严格性 | 严格(直接相邻) | 宽松(后续任意位置) |
实际应用场景
表单验证提示:
cssinput:invalid + span.error { display: block; /* 输入框无效时显示紧邻的错误提示 */ }列表项样式控制:
li.active ~ li {
opacity: 0.5; /* 激活项之后的所有列表项变半透明 */
}- 标题与段落间距:
h2 + p {
margin-top: 0; /* 消除标题后第一个段落的上边距 */
}注意事项
- 顺序敏感: 兄弟选择器仅对目标元素之后的兄弟生效。例如:
<p>段落A</p>
<h2>标题</h2>
<p>段落B</p>h2 + p 会选中 段落B,但 p + h2 无效(因 h2 在 p 之后)。
- 兼容性:
- 所有现代浏览器均支持
+和~(包括 IE8+)。
- 性能影响:
兄弟选择器的性能通常较好,但应避免在深层嵌套或超大文档中滥用。
总结
+:用于精准控制直接相邻的兄弟元素。~:用于批量选择后续所有符合条件的兄弟元素。
合理使用兄弟选择器可以减少冗余的类名定义,提升代码可维护性。
width: 100% 的百分比参考什么?
在 CSS 中,width: 100% 的百分比是相对于元素的包含块(Containing Block)的宽度计算的,但具体参考的是包含块的 内容区域(content box) 还是 边框盒(border box),取决于元素的定位方式和包含块的定义。
一、包含块(Containing Block)的定义
包含块是 CSS 布局中计算元素尺寸和位置的参考基准,其确定规则如下:
| 元素定位方式 | 包含块的定义 |
|---|---|
| 静态定位(static) | 最近的块级祖先元素的内容区域(content box)。 |
| 相对定位(relative) | 同静态定位,但元素自身可通过 top/right/bottom/left 偏移。 |
| 绝对定位(absolute) | 最近的非 static 定位祖先元素的内边距区域(padding box)。 |
| 固定定位(fixed) | 视口(viewport)的内边距区域(通常等同于视口尺寸)。 |
| 粘性定位(sticky) | 最近的滚动祖先的内容区域,若没有则同相对定位。 |
二、width: 100% 的具体行为
默认行为:
若未显式设置box-sizing,元素的width: 100%是相对于包含块的 内容区域宽度(content box) 计算的。css.parent { width: 200px; /* 内容区域宽度为 200px */ padding: 20px; /* 内边距增加 40px(左右各 20px) */ border: 5px solid; /* 边框增加 10px(左右各 5px) */ } .child { width: 100%; /* 实际宽度为 200px(父元素内容区域宽度) */ }- 子元素的
width: 100%仅覆盖父元素的内容区域,不包含父元素的 padding 和 border。 - 若子元素自身有
padding或border,可能导致溢出父容器(需结合box-sizing调整)。
- 子元素的
绝对定位的特殊情况:
绝对定位元素的width: 100%是相对于包含块的 内边距区域宽度(padding box) 计算的(即包含padding的宽度)。css.parent { position: relative; width: 200px; padding: 20px; /* 内边距增加 40px */ } .child { position: absolute; width: 100%; /* 实际宽度为 240px(父内容区域 200px + 内边距 40px) */ }
三、box-sizing 的影响
通过 box-sizing 属性,可以改变 width 的参考基准:
box-sizing 值 | width: 100% 的参考基准 |
|---|---|
content-box(默认) | 包含块的内容区域宽度(不包含 padding/border)。 |
border-box | 包含块的边框盒宽度(包含 padding 和 border)。 |
示例:
.parent {
width: 200px;
padding: 20px;
border: 5px solid;
}
.child {
box-sizing: border-box; /* 宽度包含 padding 和 border */
width: 100%; /* 实际宽度为 200px(父内容区域宽度) */
padding: 10px; /* 内边距从 200px 中扣除 */
border: 2px solid; /* 边框从 200px 中扣除 */
}四、常见问题与场景
1. 子元素溢出父容器
<div class="parent">
<div class="child">内容</div>
</div>.parent {
width: 200px;
padding: 20px;
}
.child {
width: 100%; /* 200px */
padding: 20px; /* 总宽度变为 200px + 40px = 240px → 溢出父容器 */
}解决方案:
- 为子元素设置
box-sizing: border-box,使其宽度包含内边距和边框。
2. 绝对定位元素的宽度适配
.parent {
position: relative;
width: 200px;
padding: 20px;
}
.child {
position: absolute;
width: 100%; /* 240px(父内容区域 200px + 内边距 40px) */
}五、总结
width: 100%默认相对于包含块的content-box宽度。- 绝对定位元素的
width: 100%相对于包含块的padding-box宽度。 - 使用
box-sizing: border-box可让width包含padding和border,避免布局溢出。
理解包含块的定义和 box-sizing 的作用,是控制元素尺寸和实现精准布局的关键。