当前位置: 首页 > news >正文

CSS 盒子模型与元素定位

CSS 盒子模型与元素定位

一、元素类型与转换

1. 基本元素类型

块级元素 (block)

  • 特点:独占一行,可设置宽高,默认宽度100%
  • 示例:<div>, <p>, <h1>-<h6>, <ul>, <li>

行内元素 (inline)

  • 特点:不独占一行,不可设置宽高,大小由内容决定
  • 示例:<span>, <a>, <strong>, <em>

行内块元素 (inline-block)

  • 特点:不独占一行但可设置宽高
  • 示例:<img>, <input>, <button>

2. 元素类型转换

/* 行内元素转块元素 */
span {display: block;width: 200px;height: 100px;
}/* 块元素转行内元素 */
div {display: inline;/* 此时设置宽高无效 */
}/* 转换为行内块元素 */
a {display: inline-block;width: 120px;height: 40px;
}

二、盒子模型详解(图示版)

1. 标准盒子模型 (W3C Box Model)

盒子模型

假设盒子为下列所述

.box {width: 300px;height: 200px;padding: 20px;border: 10px solid #333;margin: 30px;
}

计算公式

  • 元素总宽度 = width + padding-left + padding-right + border-left + border-right + margin-left + margin-right
    = 300 + 202 + 102 + 30*2 = 420px
  • 元素总高度 = width + padding-left + padding-right + border-left + border-right + margin-left + margin-right
    = 200 + 202 + 102 + 30*2 = 320px

2. 怪异盒子模型 (border-box)

盒子模型

.box {box-sizing: border-box; /* 关键声明 */width: 300px; /* 现在包含padding和border */height: 200px;padding: 20px;border: 10px solid #333;margin: 30px;
}

这种条件下width的宽度就相当于内容加上左右内边距和左右边框,内容的宽度会根据你设置的左右边框和左右内边距而调整.
计算公式

  • 内容区宽度 = width - padding-left - padding-right - border-left - border-right
    = 300 - 202 - 102 = 240px
  • 元素总宽度 = width + margin-left + margin-right = 300 + 30*2 = 360px

3. 两种模型对比图示

标准模型:       |---margin---||-border-||--padding--|| content |||--------------------总宽度---------------------|border-box模型: |---margin---||-border/padding-|| content |||--------width (包含padding+border)---------|

关键区别总结表

特性标准模型 (content-box)怪异模型 (border-box)
width定义范围仅内容区域内容+padding+border
实际内容宽度width值width-padding-border
新增元素是否影响布局
默认值所有现代浏览器传统IE浏览器

如果在CSS开头加上这段声明:

* {box-sizing: border-box; 
}

这样我们的盒子会始终统一按照这样的模式来布局,不必设置内边距和边框之后再手动减少盒子宽度.

三、定位(position)系统

1. position属性值

static (默认)

  • 特点:元素正常流排列,top/right/bottom/left无效

relative (相对定位)

  • 特点:相对于自身原始位置偏移,保留原空间
.box {position: relative;top: 20px;left: 30px;
}

absolute (绝对定位)

  • 特点:相对于最近的非static定位祖先元素,脱离文档流
.parent {position: relative;
}
.child {position: absolute;top: 0;right: 0;
}

fixed (固定定位)

  • 特点:相对于视口定位,不随滚动条滚动
.header {position: fixed;top: 0;left: 0;width: 100%;
}

sticky (粘性定位)

  • 特点:在阈值范围内表现为relative,超过后表现为fixed
.nav {position: sticky;top: 0;/* top要设为0 */
}

固定定位和粘性定位便可以和之前学习的页面中的返回顶部联系.

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>返回顶部</title><style>/*粘性定位*/* {padding: 0px;margin: 0px;}a {text-decoration: none;color: rgb(207, 154, 154);}a:hover {text-decoration: underline;color: pink;}.sticky {position: sticky;top: 0;padding: 10px;background-color: pink;/* border: 5px solid red; */}.contain {padding-bottom: 3000px;/*设置一个大盒子,让我们实践返回顶部的功能*/}</style>
</head><body><a href="https://www.w3school.com.cn/css/css_positioning.asp" target="_blank">position : absolute sticky</a><!-- sticky粘性定位 --><a href="https://www.w3school.com.cn/tiy/t.asp?f=css_position_sticky" target="_blank" style="padding-left: 30px;">粘性定位实践 </a><!--返回顶部按钮 ---><div class="sticky"><a href="#top">返回顶部</a></div><div class="contain">我是内容</div>
</body></html>

2. z-index 堆叠顺序

  • 仅对定位元素(position非static)有效
  • 数值越大越靠前,可负值

示例练习

<!DOCTYPE html>
<html>
<head>
<style>
.container {position: relative;background: pink;height: 104px;margin: 0px;
}.black-box {position: relative;z-index: 1;border: 2px solid black;height: 100px;margin:  20px;
}
​
.gray-box {position: absolute;z-index: 2; /* 灰色框将位于绿色框和黑色框之上 */background: lightgray;height: 60px;  width: 70%;top: 0px;left: 0px;
}
​
.green-box {position: absolute;z-index: 2; /* 绿色框将位于黑色框之上 */background: lightgreen;width: 35%;height: 100px;top: 0px;left: 270px;
}
</style>
</head>
<body><h1>Z-index 实例</h1><p>堆叠顺序较高的元素始终位于堆叠顺序较低的元素之上。</p><div class="container"><div class="black-box">黑色框 (z-index: 1)</div><div class="green-box">绿色框 (z-index: 2)</div><div class="gray-box">灰色框 (z-index: 3)</div>
</div></body>
</html>

加载的页面如下:

在这里插入图片描述
练习总结

  1. 这里的z-index控制盒子的堆叠次序数值越大的盒子就在上面.
  2. 在外部div元素中,先前并没有给出相应的高度,而通过调整灰色的框的绝对定位(它的父级元素定位就是粉色背景)和通过设置相应的背景颜色,说明没有设定高度的外部盒子会从它的内部盒子相应的水平位置开始绘制(不包括这个内部盒子的外边距).
  3. 这里要注意的是设置了position:absolute属性后,比如这里的灰色盒子,如果不设定它的top等等的值,例如top=0,那么他开始绘制的位置将是黑色框的下面20px(黑色框设定了margin值),它的绝对定位没起作用.

四、元素嵌套与定位处理

1. 常见嵌套场景

块元素包含块元素

<div class="parent"><div class="child"></div>
</div>
  • 子元素默认从上到下排列

行内元素包含行内元素

<p>这是一段<span>特殊</span>文本</p>
  • 保持在同一行显示
  • 注意行内元素不能直接包含块元素

混合嵌套

<div class="card"><img src="..." alt=""><h3>标题</h3><p>描述文本<span>更多</span></p><a href="#">链接</a>
</div>

2. 嵌套中的定位处理

相对定位父元素 + 绝对定位子元素

.parent {position: relative;width: 300px;height: 200px;
}
.child {position: absolute;bottom: 10px;right: 10px;
}

多层绝对定位

.grandparent {position: relative;
}
.parent {position: absolute;top: 50px;left: 50px;
}
.child {position: absolute;top: 20px;left: 20px;
}
/* child相对于parent定位 */

3. 定位与文档流的影响

  • absolute/fixed 完全脱离文档流
  • relative 不脱离文档流,原位置保留

五、实用技巧

居中技巧

/* 绝对定位元素水平垂直居中 */
.center {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);
}

MDN Web Docs实践链接

  1. 通过绝对定位将子盒子的左上角对其父盒子的中心点.
  2. 然后通过translate值(translate的百分比是相对于元素自身尺寸)将子盒子移动自身高宽的一半实现中心对齐.
http://www.xdnf.cn/news/396235.html

相关文章:

  • 汽车诊断简介
  • 【Linux高级全栈开发】2.1高性能网络-网络编程——2.1.1 网络IO与IO多路复用——select/poll/epoll
  • 1、虚拟人物角色聊天 AI Agent 设计方案
  • FME处理未知或动态结构教程
  • FPGA生成随机数的方法
  • 2505d,d的一些疑问
  • all-in-one方式安装kubersphere时报端口连接失败
  • C++.变量与数据类型
  • 单片机调用printf概率性跑飞解决方法
  • Go语言实现分布式锁:从原理到实践的全面指南
  • 网络编程(一)网络编程入门
  • LLMs之Mistral Medium 3:Mistral Medium 3的简介、安装和使用方法、案例应用之详细攻略
  • 使用 Java 反射打印和操作类信息
  • Typora输入文字卡顿的问题(原因过长上万字)
  • Spyglass:默认配置文件
  • VMware安装CentOS Stream10
  • ArtStation APP:全球艺术家的创作与交流平台
  • 九、STM32入门学习之WIFI模块(ESP32C3)
  • 轻量级高性能推理引擎MNN 学习笔记 01.初识MNN
  • 跟我学c++高级篇——模板元编程之十三处理逻辑
  • E+H流量计profibus协议如何转换成profinet协议
  • C语言_函数调用栈的汇编分析
  • 【AI论文】作为评判者的感知代理:评估大型语言模型中的高阶社会认知
  • 二分查找的理解
  • Object类
  • wordpress自学笔记 第三节 独立站产品和类目的三种展示方式
  • RabbitMQ的工作队列模式和路由模式有什么区别?
  • 2. cef 及 cefcapi
  • 全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷七及详细答案解析
  • Qt开发经验 --- 避坑指南(13)