内元素宽度设为100%为什么会超出外元素

前言

一个元素(外元素)嵌套着另一个元素(内元素),外元素固定宽度,内元素宽度设置为 100%,但是内元素却溢出了,如图:
在这里插入图片描述
看下代码,来分析下什么原因造成的:

	<style type="text/css">
		.wrap {
			width: 500px;
			height: 500px;
			background-color: #ccc;
			margin: 30px auto;
		}
		.inner {
			width: 100%;
			height: 300px;
			background-color: skyblue;
			padding: 20px;
		}
	</style>
	<div class="wrap">
		<div class="inner">我是 内元素 。</div>
	</div>

1.外元素用的是 .wrap 类;内元素用的是 .inner 类。
2.外元素固定宽度 500px ;内元素宽度为 100% ,同时还设置了 padding: 20px;

凭借着做了多年切图仔的经历,内元素溢出的部分就是左右 padding 的那 40px!

一、解决方法

其实这里涉及到了 css盒子模型 的知识点,解决方法就是在 .inner 里加上 box-sizing: border-box; 如下:

	<style type="text/css">
		.wrap {
			width: 500px;
			height: 500px;
			background-color: #ccc;
			margin: 30px auto;
		}
		.inner {
			width: 100%;
			height: 300px;
			background-color: skyblue;
			padding: 20px;
			box-sizing: border-box;
		}
	</style>
	<div class="wrap">
		<div class="inner">我是 内元素 。</div>
	</div>

效果如下:
在这里插入图片描述

二、css盒子模型

来自官方的解释::当对一个文档进行布局(lay out)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box)。CSS 决定这些盒子的大小、位置以及属性(例如颜色、背景、边框尺寸…)。
每个盒子由四个部分(或称区域)组成,其效用由它们各自的边界(Edge)所定义(原文:defined by their respective edges,可能意指容纳、包含、限制等)。如图,与盒子的四个组成区域相对应,每个盒子有四个边界:内容边界 Content edge、内边距边界 Padding Edge、边框边界 Border Edge、外边框边界 Margin Edge。

也就是说,我们可以把一个元素看作是一个盒子,这个盒子由四部分组成:内容 + 内边距 + 边框 + 外边距。

  1. 内容就是元素存放文本等等区域。
  2. 内边距就是 padding 的间距。
  3. 边框就是 border 的间距。
  4. 外边距就是 margin 的间距。

如下图:
在这里插入图片描述
最中间 500x300 的浅蓝区域就是内容区域,以此向外依次为,内边距、边框、外边距。

而在标准的盒子模型下,元素的宽度 = 内容宽度 + 内边距 + 边框宽度

三、内元素超出外元素的原因

所以之前内元素溢出的原因就是:

  • 设置了 width:100%; 此时的 内容宽度 已经等于外元素的宽度,即 500px
  • 因为设置了 padding: 20px;,所以此时内元素的实际宽度为 500px + 20px + 20px = 540px,比外元素 500px 的宽度超出了 40px,所以就溢出了。

四、box-sizing

box-sizing 是用来定义如何计算元素的宽度和高度,属性值如下:

  1. box-sizing: content-box; 这是默认值,标准盒子模型。width 与 height 只包括内容的宽和高, 不包括边框(border),内边距(padding),外边距(margin)。
  2. box-sizing: border-box; width 和 height 属性包括内容,内边距和边框,但不包括外边距。

所以用 box-sizing: border-box; 就可以解决内元素宽度为100%时超出外元素的问题了。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用HTML5中的draggable属性和JavaScript中的drag事件来实现内部的div可拖动。 首先,在内部的div中添加draggable属性,将其设置为true,表示可拖动。 ```html <div class="outer"> <div class="inner" draggable="true"></div> </div> ``` 然后,在JavaScript中,为内部的div添加dragstart、drag、dragend事件,分别表示拖动开始、拖动中和拖动结束。 ```javascript var inner = document.querySelector('.inner'); inner.addEventListener('dragstart', function(event) { // 拖动开始时 // 设置拖动的数据和效果 event.dataTransfer.setData('text/plain', '拖动的文本'); event.dataTransfer.effectAllowed = 'move'; }); inner.addEventListener('drag', function(event) { // 拖动中 // 可以在这里实现拖动的效果 }); inner.addEventListener('dragend', function(event) { // 拖动结束 // 可以在这里处理拖动结束后的逻辑 }); ``` 此,还可以在部的div中添加dragover、dragenter、dragleave和drop事件,来实现拖放的效果。 ```javascript var outer = document.querySelector('.outer'); outer.addEventListener('dragover', function(event) { // 阻止默认的拖放行为 event.preventDefault(); // 设置允许的拖放效果 event.dataTransfer.dropEffect = 'move'; }); outer.addEventListener('dragenter', function(event) { // 在拖动进入时添加样式 outer.classList.add('dragover'); }); outer.addEventListener('dragleave', function(event) { // 在拖动离开时移除样式 outer.classList.remove('dragover'); }); outer.addEventListener('drop', function(event) { // 阻止默认的拖放行为 event.preventDefault(); // 获取拖动的数据 var data = event.dataTransfer.getData('text/plain'); // 在drop事件中处理拖放的逻辑 }); ``` 通过以上的代码,就可以实现内部的div可拖动的效果了。当然,还可以根据具体的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值