教你分清margin和padding


前言

对于新入手前端的小白有没有以下场景?

margin和padding的用法常常搞不清,想给元素之间加点距离,好像加padding也行,加margin也能实现,但是如果页面中元素很多的时候,每个元素的占位却和你想象的不一样,只能再一个个排查。

我们来讨论一下关于CSS盒模型和这几个属性的使用。

一、CSS盒模型是什么?

页面是由一个个元素组成的,这些元素我们也可以称为盒子。关于盒模型的定义,MDN官网的定义是这样的:

在这里插入图片描述
我们翻译成人话。

就是说一个块级元素(block)在页面上占位的总面积是由外边距,边框,内边距和内容组成的,这个内容我们也可以是说width和height组成的部分,因为行内元素(inline)没有宽高(width和height)所以只有盒模型的一部分。

那么这个元素在页面的占位实际是这样的:
在这里插入图片描述
很明显的发现,肉眼直观的看见这个元素的大小是没有外边距margin的,也就是说一个元素实际大小不包含外边距。面试如果问一个元素的实际大小,不要算外边距这一块,但是要问盒模型的大小,要计算外边距,来算道题。

在这里插入图片描述

二、属性应用

1.margin

margin是一个复合属性,是包含四个属性(上外边距,右外边距,下外边距,左外边距)的合并,简记"上右下左",用这个比较方便,当然你如果怕搞混,也可以分着用。
在这里插入图片描述
现在有一个width400px,height200px的元素在网页中我们看到的样子,

在这里插入图片描述
给它设置margin: 10px 20px 30px 40px;通过检查元素,实际它的占位是这样:

在这里插入图片描述

2.padding

padding也是复合属性,具体和margin差不多,不做过多赘述。

padding:padding-top,padding-right,padding-bottom,padding-left;

同样刚才那个元素,我们把margin设置的值改成padding,元素就变大了,因为内边距是占元素实际显示大小里面的。

在这里插入图片描述

在这里插入图片描述

3.border

border也是个复合属性,它是由边框宽度(border-width),边框样式(border-style)和边框颜色组成的(border-color),边框样式有这些可选值。

在这里插入图片描述
同样,刚才那个元素加一个边框,宽度10px,边框样式实线,边框颜色黑色(也可以用16进制表示颜色),设置border: 10px solid black;就是这样。

在这里插入图片描述

三、为什么布局总用div

这里提出一个小问题,有没有想过,为什么我们页面布局中,最常用的标签是div? p 标签不行吗?ul标签不行吗?span不行吗?

首先,span是行内元素,所以很难用它去布局整个页面。

而只有div标签是没有语义的。就是说没有原始样式。

我们把一段文字用一个p标签和ul 标签包裹,会发现ul很明显有原始样式,而p标签有自己的边距。

<p>hhhhhhhhhhhhhhhhhhhhhhhhhhhhh</p>
<ul>
   <li>hhhhhhhhhhhhhhhhhhhhhhhhhhhhh</li>
</ul>
<div>hhhhhhhhhhhhhhhhhhhhhhhhhhhhh</div>

在这里插入图片描述
在这里插入图片描述

当然你可以手动去掉这些,但是对于空白的页面来说,没有语义的元素对于布局来说会更加可控。

总结

好了,就讨论到这里,如果还有不懂的地方,可以查看MDN文档,具体属性忘记了也可以随时去上边查看。

在I2C通信协议中,主机从机的角色区分主要基于其对总线的控制能力以及功能特性。I2C协议支持多主控(multi-mastering)架构,这意味着多个设备都可以充当主机角色,但在任何时刻只能有一个设备作为主机来控制总线。 主机的主要功能包括: - **控制时钟信号(SCL)**:主机负责生成时钟信号,该信号决定了数据传输的速度[^2]。 - **生成起始停止信号**:主机通过在SDA线上发送特定的信号序列来启动或结束一次通信过程。起始信号是在SCL为高电平时,SDA从高电平跳变到低电平;而停止信号则是在SCL为高电平时,SDA从低电平跳变到高电平[^1]。 - **发送地址信息**:主机发送从机地址以选择特定的从机进行通信,地址信息包含在起始信号之后发送的第一个字节中,其中最低位表示数据传输方向(读或写)[^2]。 - **管理数据传输**:主机决定数据传输的方向,并在数据传输过程中发送或接收数据字节,同时处理应答(ACK)非应答(NACK)信号[^1]。 从机的主要功能包括: - **响应地址**:从机监听总线上的地址信息,并仅当接收到自己的地址时才会参与通信过程[^2]。 - **根据主机指令进行操作**:从机根据主机发送的读写命令执行相应的数据发送或接收操作[^1]。 - **产生应答信号**:在每个接收到的字节后,从机会发送一个应答信号(ACK)表示成功接收,或者发送一个非应答信号(NACK)表示未能正确接收数据[^2]。 I2C协议的这一设计允许灵活地连接多个设备,并确保在复杂系统中实现高效的数据交换。通过这种方式,主机从机之间的角色明确,确保了通信过程的有序性可靠性。 ### I2C通信示例代码 以下是一个简单的I2C通信示例代码,演示了如何使用Python的`smbus`库与I2C设备进行基本的读写操作: ```python import smbus # 初始化I2C总线 bus = smbus.SMBus(1) # 使用I2C总线1 # 定义从机地址 slave_address = 0x50 # 假设从机地址为0x50 # 向从机写入数据 def write_data(data): bus.write_byte(slave_address, data) # 从从机读取数据 def read_data(): return bus.read_byte(slave_address) # 示例:写入一个字节的数据 write_data(0xA5) # 示例:读取一个字节的数据 received_data = read_data() print(f"Received data: {received_data}") ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值