使用CSS的margin属性在页面布局中的使用攻略介绍

margin属性可以决定很多html元素的宽高度,因而在布局方面也能够有很重要的作用,接下来我们就来看一下使用css的margin属性在页面布局中的使用攻略介绍

基础

1.元素containing-box宽高度等于内容宽度

HTML

立即学习“前端免费学习笔记(深入)”;

CSS

.wrap {      float: left;      border: 2px solid #000;    }   .item1 {      width: 100px;      height: 100px;      background: #fdf;      margin-left: 10px;      margin-top: 10px;      margin-right: 20px;      margin-bottom: 30px;   }   item2 {      width: 50px;      height: 50px;      background: #adf;   }

立即学习“前端免费学习笔记(深入)”;

使用CSS的margin属性在页面布局中的使用攻略介绍

能满足原理1的条件只有一种,元素不设宽度且不在文档流中,此时,父元素wrap产生的containing-box的宽高宽度等子元素border-box的宽高度加上外边距的宽高度,也就是说,子元素的margin值也是其containing-box的一部分。margin一共有两类参考线,第一类是margin-top与margin-left的参考线,第二类是margin-bottom与margin-right的参考线,第一类margin的参考线是以其所处的containing-box的边缘线为参考线,如上例所示,当调整元素.item1的margin-top与margin-left的值时,元素.item1所处的containing-box的大小也在发生变化因此其边缘线也在不断变化同时也就导致.item1元素自身的位置也在发生变化,看起来就是.item1自身发生了移动。第二类margin的参考线是以元素自身的边缘线(外边距的外侧为边缘线)为参考线,同样的,调整上例中的margin-bottom值,.item1的margin-bottom也在不断的发生变化,也就是说其自身边缘线在不断的移动,同时导致了.item2的移动。根据上面的论述,我们可以得出结论,外边距的调整也就等于让其自身相对的参考线的位置在发生移动,同时导致相对于参考线运动的元素发生移动。元素自身相对于containing-box的边缘线移动而移动,与元素自身为兄弟关系的元素相对于元素自身的边缘线移动而移动。参考线示意图如图所示,按箭头所指方向使参考线变化的margin值都为正值。
综上,我们可以利用margin对元素自身进行移动,同时也可让其相邻元素进行移动,移动的同时我们需要知道的是其所处的containing-box的大小也在发生变化。
使用CSS的margin属性在页面布局中的使用攻略介绍

综上,当元素宽高度等于内容宽高度时,可通过调整内容的margin值来调整其containing-box的大小,因为containing-box的变化也就会导致元素本身的移动,也就是说既可以移动元素,也可调整元素与元素之间的间距。

2.元素内容宽度等于其containing-box的宽度

.wrap {       width: 100px;       border: 2px solid #000;       margin: 0 auto;   }   .wrap-inner {       height: 50px;       background: #fdf;   }

立即学习“前端免费学习笔记(深入)”;

使用CSS的margin属性在页面布局中的使用攻略介绍

上例中,元素wrap-inner的border-box宽度加上margin的大小等于其containing-box的宽度,因此当containing-box宽度固定,根据公式’margin-left’ + ‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ + ‘margin-right’ = width of containing block,调整其自身margin-left或margin-right值,便会使wrap-inner自身大小发生变化,margin-left为正值且值逐渐变大,则wrap-inner自身宽度逐渐变小,若margin-left为负值且逐渐变小,则wrap-inner自身宽度逐渐变大,margin-right同理。一定要注意这里的宽度继承和width:100%是有本质区别的,因为width:100%就等于它的containing-box的100%和它的margin,border或者padding都木有关系,具体可看我的关于宽度与高度讨论的系列文章三里的例子,罗嗦了一点,但是这里是容易犯错误的地方。一定要注意,一定要注意,一定要注意!!!。重要的事情说三遍。

将margin-left和right调整为-10px,如图,根据计算,wrap-inner变宽
使用CSS的margin属性在页面布局中的使用攻略介绍

将margin-left和right调整为10px,如图,根据计算,wrap-inner变窄
使用CSS的margin属性在页面布局中的使用攻略介绍

综上,当元素宽或高度等于其containing-box的宽度或高度时,且containing-box的宽度固定我们便可以利用margin对其进行自身宽度大小的调整。也就是说宽高度和containing-box有关系时,我们利用margin可进行内里元素大小的调整。

不同元素margin的计算
行内级元素
Inline,非置换元素:如果margin值为auto,则margin-left和margin-right的计算值也就为0
Inline,置换元素:同上
Inline-block,置换元素在文档流中:同上
Inline-block,非置换元素在文档流中:同上
块级元素
块级非置换元素,在文档流中
‘margin-left’ + ‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ + ‘margin-right’ = width of containing block
下面的情况下,如果margin值为auto

如果width是auto值,那么其他值是auto的值就为0
如果margin-left和margin-right的值为auto,使用的值相等,那么就相对于包含块水平居中。
块级置换元素,在文档流中
同块级非置换元素一样。

小结
行内级置换元素和非置换元素,在margin值为auto时,margin-left和margin-auto的计算值都为0。
块级置换元素和非置换元素:
‘margin-left’ + ‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ + ‘margin-right’ = width of containing block
如果width是auto值,那么其他值是auto的值就为0
如果margin-left和margin-right的值为auto,使用的值相等,那么就相对于包含块水平居中。

利用Margin进行布局
通常在布局中我们会遇到那些问题呢?下面是我自己实践中遇到的一些问题

问题1
当我们拿到一份设计稿,然后这份设计稿有像下面这样的布局,整体居中,里面元素排一排,当然布局的方式会有很多种,那么如果我们采用浮动布局或者display:inline-block进行布局会出现什么问题呢,如图我们可以看出,若采用上述两种方式进行布局,那么每个块的宽度加上间隙,就会超出包含块的宽度,当然我们也可以将包含块的宽度进行增大以留下足够的位置供元素摆放,但是这种方法明显是不可取的,那么如何解决这个位置不够的问题呢,可以看下面的栗子1 。
使用CSS的margin属性在页面布局中的使用攻略介绍

栗子
html

立即学习“前端免费学习笔记(深入)”;

css

body {     margin: 0;   }   .container {     margin: 0 auto;     width: 980px;   }   .inner-wrap {     margin-left: -10px;   }   .inner {     float: left;     margin-left: 10px;     width: 320px;     height: 200px;     background: #2df;   }

立即学习“前端免费学习笔记(深入)”;

此布局便利用了原理2,利用负margin增加了inner-wrap的宽度,但不改变整体的宽的情况下,实现效果。如下
使用CSS的margin属性在页面布局中的使用攻略介绍

问题2
上面的例子仅仅只是实现了三列固定宽度的布局,这样的布局当屏幕宽度发生变化的时候便会出现问题。因此我们便会有如下需求。

左右列固定,中间列自适应

栗子
html

立即学习“前端免费学习笔记(深入)”;

css

.main {     float: left;     width: 100%;   }   .main-content {     height: 200px;     background: #2da;     margin: 0 200px;   }   .left,.rightright {     float: left;     width: 200px;     height: 200px;     background: #ccc;   }   .left {     margin-left: -100%;   }   .rightright {     margin-left: -200px;   }

立即学习“前端免费学习笔记(深入)”;

效果如下,当你缩小屏幕时,中间部分会随着屏幕的缩小而缩小,另外两部分宽度不变,同样也满足了主要内容优先加载的需求,可谓一举两得
使用CSS的margin属性在页面布局中的使用攻略介绍

分析:

可以看出上面的布局利用了原理2,但是这里仍然会有几个为什么要问。

首先,为什么main里面一定要嵌套main-content,为什么不能直接使用单个main(假设1)?
其次,为什么main上一定要设置float:left,可以设置其他值吗,如position:absolute(假设2)?
分析上面的布局之前,我们也要了解到上面的布局满足了我们的什么需求,这里有两点1.主要内容优先加载。2.主要内容自适应。这里我们可以分析一下,我们是怎样达到上述两个目的的。首先,要达到目的1,我们就的把p.main放在前面来写,因为浏览器是从下到下渲染页面的,放在前面的也就会先渲染。且由于p.main为文档流中的块级元素,因此会独占一行,因此我们需要使其脱离文档流,这样才能使下面的元素能有机会上的来(这里之所以不考虑display:inline-block是因为p.main的长度会独占一行,就算设置display:inline-block也没有任何作用,下面的元素仍然上不来)。而要达到目的2,需要用到原理2。同时在上面提出的两个问题中,有两个假设。

假设1,如果使用单个main可不可以满足上述两个需求?我们可以试试。
html

立即学习“前端免费学习笔记(深入)”;

css

body {     margin:0;   }   /*这里注意需要改掉main的流方式,下面的元素才上的来*/.main {     float:left  margin: 0 210px;     height: 200px;     background:#2da;   }   .left,.rightright {     float: left;     width: 200px;     height: 200px;     background: #ccc;   }   .left {     margin-left: -100%;   }   .rightright {     margin-left: -200px;   }

立即学习“前端免费学习笔记(深入)”;

使用CSS的margin属性在页面布局中的使用攻略介绍

从中线分开的黄色两部分为各自为main的左右外边距

从结果中,我们可以看出使用单个main是不行的,因为在不设宽度且元素不在文档流中时,元素的宽度为0,不能满足我们的需求,正因为我们同时要满足1.main元素不在文档流中2.元素不设宽度且在文档流中。这两个条件当然是不能同时在一个main元素下能达到的,因此我们需要再嵌套一个main-content让它来满足条件2。这也就解释了为什么一定要嵌套一个main-content。
解决了问题1,现在我们来说问题2。

假设2,main上的float值可以换为position:absolute吗?
同样的,我们试试
html

立即学习“前端免费学习笔记(深入)”;

css

body {     margin: 0;   }   .main {     position:absolute;     width:100%;   }   .main-content {     margin: 0 210px;     height: 200px;     background: #2da;   }   .left,.rightright {     width: 200px;     height: 200px;     background:#ccc;   }   .left {     float: left;   }   .rightright {     float: rightright;   }

立即学习“前端免费学习笔记(深入)”;

答案是可以的,只是我们需要改掉一些值,而当main为float之所以要给p.left与p.right要设置margin-left值是因为浮动元素浮动时,当它的外边缘碰到包含框或者另一个浮动框的边框为止。而为浮动元素的p.main占据了整整一行,因此下面的浮动元素p.left与p.right便被挤了下来,而设置它们的margin-left值便可以把它们移上去,这里便运用了原理1。而当我们把p.main的float值改为position:absolute时,便不会存在被挤下来的问题,可直接设置p.left与p.right的float的值。效果如下。
使用CSS的margin属性在页面布局中的使用攻略介绍

如若只需要达到宽度自适应的要求,那么,这时候便可以将p.main放在最后面且不用嵌套p.main-content,具体如何实现,大家可以自己试试。
问题3
如下所示设计稿,在我们进行布局的过程中,可能会出现border重合的情况,因为一方面我们需要对整个整体加上border,而另一方面我们又需要利用border隔开那三个小块。那么如果我们对每个小块都加上右边框,可以想象,最右边就会出现边框的堆叠而这不是我们希望看到的,所以,要如何解决这个问题,可以看如下例子给出的答案。
使用CSS的margin属性在页面布局中的使用攻略介绍

栗子
html

  • 1
  • 2
  • 3

立即学习“前端免费学习笔记(深入)”;

css

ul {     position:absolute;     margin: 0;     padding:0;     list-style:none;     border: 4px solid #c5c5c5;   }   li {     float:left;     width: 200px;     height: 50px;     line-height: 50px;     text-align: center;     border-right: 4px solid #c5c5c5;   }

立即学习“前端免费学习笔记(深入)”;

没在li上加margin-right:-4px;前,效果如图,发生了堆叠。
使用CSS的margin属性在页面布局中的使用攻略介绍

加了margin-right: -4px后,达到预期效果。因为加上了ul的右边框发生了移动与第三个li的右边框进行了重叠。因此效果上来看便符合了预期,如图
使用CSS的margin属性在页面布局中的使用攻略介绍

此布局便利用了原理1,通过元素对相邻元素位置的控制来达到预期的效果。
而利用原理1也可以实现元素居中的布局,先让元素上左各移50%,然后再让设置元素的上左margin值设置为元素自身宽度的一半长度,以对元素本身进行移动。便可达到元素居中放置的目的。

总结
1.元素宽度等于containing-box宽度时。
可以通过调整margin的值来调整元素的宽度。
2.元素宽度与containing-box无关时。
可以通过调整margin的值来移动元素的位置。

以上就是使用CSS的margin属性在页面布局中的使用攻略介绍的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1607832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
css3多列及瀑布流效果示例代码
上一篇 2025年12月23日 21:11:19
图解CSS3制作圆环形进度条的方法
下一篇 2025年12月23日 21:11:35

相关推荐

  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • css max-height属性怎么用

    max-height 属性设置元素的最大高度。 说明 该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。 注意:max-height 属性不包括外边距、边框和内边距。 立即学习“前端免费学习笔记(深入)”; 值描述none 默认。定义对元素被允许的最大高…

    2026年5月10日
    100
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    100
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    200
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200
  • html5怎么画实线_HTML5用CSS border-style:solid画元素实线边框【绘制】

    可通过CSS的border-style属性设为solid添加实线边框:一、内联样式用border:2px solid #000;二、内部样式表统一设置如div{border:1px solid #333};三、外部CSS文件定义.my-box{border:3px solid red}并引入;四、单…

    2026年5月10日
    200
  • css如何禁止滚动条

    css禁止滚动条的方法:1、完全隐藏,代码为【】;2、在不需要时隐藏,代码为【】;3、样式表方法。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 1、完全隐藏 在里加入scroll=”no”,可隐藏滚动条;   立即学习“前端免费学习笔记(深入)”;…

    2026年5月10日
    000
  • 动态更新圆形进度条:JavaScript成绩计算器集成指南

    本文档旨在指导开发者如何将JavaScript成绩计算系统与动态圆形进度条集成,实现可视化展示平均成绩。我们将详细讲解如何修改现有的JavaScript代码,使其在计算出平均分后,能够动态更新圆形进度条的进度,从而提供更直观的用户体验。本文档包含详细的代码示例和注意事项,帮助开发者轻松实现这一功能。…

    2026年5月10日
    000
  • React组件中动态属性值的管理与同步:利用状态实现受控组件

    本教程旨在解决react组件中动态属性值同步使用的问题。我们将探讨如何利用react的`usestate` hook来管理组件内部状态,从而实现一个属性的值动态地影响另一个属性,并构建出可预测、易于维护的受控组件。文章将通过具体代码示例,详细阐述从初始化状态到处理状态更新的完整过程,并强调受控组件在…

    2026年5月10日
    000
  • 如何讲html和css_讲解HTML与CSS结合使用基础【基础】

    需将HTML与CSS结合使用以实现网页结构与样式的分离:HTML定义标题、段落等语义结构,CSS控制颜色、字体等外观;可通过内联样式、内部样式表或外部CSS文件引入样式,并利用类选择器和ID选择器精准应用。 如果您希望网页不仅展示内容,还能具备基本的样式和结构布局,则需要将HTML与CSS结合使用。…

    2026年5月10日
    100
  • CSS伪元素与固定背景:移动友好的实现策略

    本文深入探讨了如何利用CSS的::before伪元素、position: fixed和z-index属性,创建一种在移动设备上表现更稳定的全屏固定背景效果,以替代传统background-attachment: fixed可能存在的兼容性问题。教程将详细解析这些核心CSS概念及其在构建响应式布局中的…

    2026年5月10日
    000
  • JavaScript计算器开发:解决数值显示与初始化问题

    本教程深入探讨了使用JavaScript构建计算器时常见的数值显示异常问题,特别是由于类属性未初始化导致的`Cannot read properties of undefined`错误。我们将详细分析问题根源,并通过在构造函数中调用初始化方法来解决该问题,同时优化显示逻辑,确保计算器功能稳定且界面显…

    2026年5月10日
    000
  • HTML表单如何实现PWA支持?怎样添加离线功能?

    答案是利用Service Worker缓存资源并结合Background Sync API实现离线提交与自动同步。通过注册Service Worker缓存表单相关文件,拦截提交行为,将离线数据存入IndexedDB,并注册后台同步任务,待网络恢复后由Service Worker自动发送数据,确保提交…

    2026年5月10日
    000
  • CSS技巧:在复杂悬停效果中确保图像始终可见

    CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见

    本教程探讨如何在包含悬停效果的CSS卡片布局中,确保图像始终显示在最顶层而不被裁剪或遮挡。通过调整HTML结构,利用CSS的position和z-index属性,以及引入pointer-events,我们将解决图像被overflow: hidden和扩展叠加层遮盖的问题,实现复杂的视觉交互效果。 在…

    2026年5月10日 用户投稿
    000
  • HTML文档如何工作?如何编辑HTML格式文件?

    HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?

    浏览器解析和渲染html的过程包括:1. 解析html构建dom树;2. 结合css构建渲染树;3. 布局计算元素位置;4. 绘制像素到屏幕。编辑html可使用记事本、vs code、sublime text等文本或代码编辑器,其中vs code因语法高亮、自动补全和插件生态成为主流选择。标准htm…

    2026年5月10日 用户投稿
    000
  • JavaScript 中使用多个 querySelector 更新页面元素

    本文旨在讲解如何在 JavaScript 的 if 语句中使用多个 querySelector 来更新不同的页面元素,并提供示例代码和注意事项,帮助开发者理解并应用此技术。通过该方法,可以根据特定条件动态修改页面内容,提升用户体验。 使用 querySelector 在 if 语句中更新多个元素 在…

    2026年5月10日
    100
  • HTTP客户端请求缓存与重用优化

    合理使用客户端缓存与连接复用可显著提升Web性能。通过Cache-Control、ETag和Last-Modified实现条件请求,避免重复传输;启用Keep-Alive并维护TCP连接池以减少握手开销;优先采用HTTP/2或HTTP/3实现多路复用与低延迟连接;针对静态资源设置长缓存,动态数据使用…

    2026年5月10日
    000
  • CodeIgniter在IIS环境下实现URL重写与index.php移除指南

    本教程详细指导如何在IIS服务器上部署的CodeIgniter应用中,移除URL中不必要的index.php。核心解决方案涉及修改CodeIgniter的config.php文件,将$config[‘index_page’]设置为空,并辅以正确的IIS web.config重…

    2026年5月10日
    100

发表回复

登录后才能评论
关注微信