搜索
首页web前端css教程深入理解CSS中margin的使用方法

1.css margin可以改变容器的尺寸
  元素尺寸
  可视尺寸--标准盒子模型中盒子的宽度是不包括margin值的,clientWidth
  占据尺寸--包括margin的宽度 outWidth不在标准之中,jquery中有相对应的方法

  margin与可视尺寸
    1.1使用那个与没有设定width/height的普通block水平元素
    2.2只适用于水平方向尺寸
    background-color:#1a2b3c">
      


        文字

        文字

      


    
    当改变margin值时盒子的宽度会变化。

    应用 :实现一侧定宽的自适应布局
      float:left;">
      

margin-left:170px">图片浮动

    margin与占据尺寸
    1.block/inline-block水平元素均适用
    2.与没有设定width/height值无关
    3.适用于水平方向和垂直方向
    例
      
        
      
    可以看到容器占据的尺寸变小了。
    利用这一特性
    滚动容器内上下留白
      

padding:50px 0;">
        300">
      


    里面盒子撑开外面盒子显示滚动条,当然这在非chrome浏览器中是没有留白效果的(上面有下面没有)。
    正确的做法是
    


      
    

第二话:css margin与百分比单位——了解margin百分比单位
      水平方向百分比/垂直方向百分比
      普通元素百分比/绝对元素百分比


      百分比margin的计算规则
        img{margin :10%;with:600px;heigth:200px;}
      普通元素的百分比margin都是相对于容器的宽度计算的!所以这里的margin:10%;---->top:60px,left:60px;都是相对与容器的宽度来计算的。

      绝对定位元素的百分比margin
        img{margin:10%; position:absolute;}
      绝对元素的百分比margin是相对与第一个定位元素的祖先元素具有(relative/absolute/fixed)的宽度计算的。普通元素的是相对与父元素的来计算的。
        


           


            

           


        


      利用特性
         宽高2:1自适应矩形
           .box{background-color:olive; overflow:hidden;}
           .box > p{margin:50%}
         这里还涉及一个只是点就是margin重叠。这里设置overflow 也是因为防止margin重叠

第三话 margin重叠通常特性
  1.block水平元素(不包括float和absolute元素)
  2.不考虑writing-mode(文字书写方向是从上到下的),只发生在垂直方向的(margin-top/margin-bottom

  margin重叠3种情境
     1.相邻的兄弟元素
      p{line-height:2em;margin:1em 0;background:#f0f3f9;}
        

第一行


        

第二行


      这里就会发生margin重叠了
     2.父级和第一个/最后一个子元素
      .father{background:#f0f3f9}
      


         

son


      


      给子第一个或最后一个子元素设置margin等同于给父元素设置相同的margin值,子元素相同margin,子元素和父元素一样的margin值
     3.空的block元素
      .father{background:#f0f3f9}
      


         


      


      这里son的高度只有1em,不是2em
      空block元素margin重叠其他条件
        1.元素没有border设置
        2.元素没有padding值
        3.里面没有inline元素
        4.没有height,或者min-height


      margin-top重叠
        1.1父元素非块状格式化上下文元素
        1.2父元素没有border-top设置
        1.3父元素没有padding-top
        1.4父元素和第一个子元素之间没有inline元素分隔

      margin-bottom重叠
        1.1父元素非块状格式化上下文元素
        1.2父元素没有border-bottom设置
        1.3父元素没有padding-bottom
        1.4父元素和最后一个子元素之间没有inline元素分隔
        1.5父元素没有height,min-height,max-height限制
      干掉margin-top重叠
         .father{background:#f0f3f9}
        


           

son


        


         1.父元素非块状格式化上下文元素 .father:overflow:hidden;
         2.父元素没有border-top设置
        .father:border:4px solid #ccc;
         3.父元素没有padding-top值
         4.父元素和第一个子元素之间没有inline元素分隔
        


           

son


        


        干掉margin-bottom重叠
        前面四个和margin-top一样,
          


             

son


          

    margin重叠的计算规则
      1.正正取大值
        .a{margin-bottom:50px;}
        .b{margin-top:20px;}
        


        

          .father{margin-top:20px;}
          .son{margin-top:50px;}
      


         


      

      .a{margin-top:20px;margin-bottom:50px}
      

      上面的结果都是margin:50px;
    2.正负值相加
      .a{margin-bottom:50px;}
      .b{margin-top:-20px;}
      


      

      .father{margin-top:-20px;}
      .son{margin-top:50px;}
      


         


      

      .a{margin-top:-20px;margin-bottom:50px}
      


      上面的结果都是30px
  3.负负最负值
    .a{margin-bottom:-50px;}
    .b{margin-top:-20px;}
    


    

    .father{margin-top:-20px;}
    .son{margin-top:-50px;}
    


       


    

    .a{margin-top:-20px;margin-bottom:-50px}
    


    上面的结果都是-50px
    margin重叠的意义是?
     网页诞生之初…………只是排版文字布局用,没有现在这么复杂。
       1.连续段落或列表之类,如果没有margin重叠首尾项间距会和其他兄弟标签1:2关系,排版不自然;
       2.web中任何地方嵌套或直接放入任何裸p都不会影响原来的布局
       3.遗落的空人一个p元素,不要影响原来的阅读排版

    实践:
      善用margin重叠
        .list{margin-top:15px;}
      更好实现
        .list{
           margin-top:15px;
           margin-bottom:15px;
         }
      更具有健壮性,最后一个元素移除或位置调换,均不会破坏原来的布局。
第4话:理解CSS中的margin:auto
    margin:auto 的机制
    元素有时候,就算没有设置width或height,也会自动填充
      p{background:#f0f3f9}

    如果设置width或height,自动填充特性就会被覆盖
      p{width:500px;background:#f0f3f9;}
      此时的margin值是0px
    如果设置值width或height,自动填充特性就会被覆盖。

    原来应该填充的尺寸被width/height强制变更,而margin:auto就是为了填充这个变更的尺寸设置的;
      p{width:500px;marign-right:100px;margin-left:auto;}

    如果一侧定值,一侧auto,auto为剩余空间大小,如果两侧均是auto,则平分剩余空间

    为什么图片img{width:200px;marign:0 auto}不居中
    因为图片是inline水平的,就算没有width,也不会占据整个容器。
    设置img{display:block;width:200px;marign:0 auto;}
    因为此时图片是block水平的,就算没有width,也会占据整个容器不能在一行显示。


    为什么明明容器定高,元素定高margin:auto 0 无法垂直居中

    .father{height:200px;background:#f0f3f9;}
    .son{height:100px; width:500px;margin:auto;}
    水平居中了,垂直不居中。

    解释:如果.son没有设置height:100px;高度会自动200px高吗?——NO 所以margin谈不上自动填充,强制设置宽度高度, 所以是不会自动填充的。
    注意:水平方向上如果子大于父,计算结果为负值的时候也是不居中的。


    实现垂直方向margin居中
      更改流为垂直方向,实现垂直方向的margin:auto
      writing-mode与垂直居中(css3)
      .father{height:200px; width:100%; wiriting-mode:vertical-lr;}
      .son{height:100px;width:500px;margin:auto;}
    absolute与margin居中
       .father{height:200px;position:relative;}
       .son{position:absolute; top:0px right:0px bottom:0px;left:0px}
       .son没有width/height,absolute元素自动填满了容器。

    当设置了width和高度
        .father{height:200px;position:relative;}
       .son{position:absolute; top:0px right:0px bottom:0px;left:0px;width:500px;height:100px;}
     原来拉伸铺满现在缩回来了。
       被拉伸的空间设置margin:auto;平均分配就会实现水平垂直居中了
        .father{height:200px;position:relative;}
       .son{position:absolute; top:0px right:0px bottom:0px;left:0px;width:500px;height:100px;margin:auto;}

    IE8+以上支持!
第五话:css margin负值定位
    1.margin负值下的两端对齐(margin改变元素尺寸)
    例子
      .box{
        width:1200px; margin:auto;background:orange;
        .ul{overflow:hidden;}
        .li{
          width:380px;height:300px;
          margin-right:20px;
          background:green;
          float:left;
        }
      }
    实现的列表最后一个留有间隙。
      而通过margin负值来改变容器的大小,让容器变宽。能完美解决这个问题
    .box{
      width:1200px; margin:auto;background:orange;
    .ul{overflow:hidden;margin-right:-20px;}
    .li{
      width:386.66px;height:300px;
      margin-right:20px;
      background:green;
      float:left;
     }
    }
    2.margin负值下的等高布局 margin改变元素占据空间
    margin与上下留白
    


      
    


    .box{overflow:hidden;resize:vertical;}
    .child-orange,
    .child-green{margin-bottom:-600px;padding-bottom:600px;}
    .child-orange{float:left;background:orange;}
    .child-green{float:left;background:green;}

    通过设置很大的margin-bottom负值,和很大的padding-bottom填充缺失的空间,实现等高布局。原理:内容块状元素可以在padding中显示.只要没有设置    

    background:clip,box-sizing:content
    3.margin负值下的两栏自适应布局,元素占据空间跟随margin移动

    


       

图片右浮动


    


    

第六话 css marign无效情形解析
  1.inline水平元素的垂直margin无效
    2个前提 1.非替换元素,例如不是img元素;2.正常书写模式
    例
      marign:0px
      给span设置margin233px;
      水平上有效的,垂直方向是无效的。
      2.margin重叠
      3.display:table-cell
         display:table-cell/display:tab-row等声明margin无效!

         例外的替换元素img,button

    4.position与margin
           绝对定位元素非定位方向的margin值“无效”
           绝对定位的margin值一直有效,不只是像普通元素那样。
        5.鞭长莫及的margin失效
      bfc内容块中如果前面有浮动元素那下一个元素的margin是相对与外层的p计算的。
        6.内联导致的margin失效
      p[style="height:200px;background-color:#f0f3f9;"]>img[style="marign-top:30;"]
      当margin-top足够大的时候失效了。
      解释:内联元素要实现和基线对齐,在图片后加x可以看出,无论margin-top有多远,他都不会脱离容器外面。

第七话margin-start和margin-end
    margin-start
    img{
      margin-left:100px;
      -webkit-margin-start:100px;
      -moz-margin-start:100px;
      margin-sart:100px;
    }
    1.正常的流向,margin-sart等同于margin-left,两者重叠不累加;
    2.如果水平流失从右往左,margin-start等同与margin-right;direction:ltr(rtl)
    3.在垂直流下(writring-mode:vertical-lr),margin-sart等同于margin-top
    webkit下的其他margin相关属性
      margin-before
        img{-webkit-margin-before:100px;} 默认流向的情况下,等同于marign-top
      margin-after
        img{-webkit-marign-after:100px;} 默认流向的情况下,等同于margin-bottom;
      margin-collapse 外边框重叠
        -webkit-margin-collapse: collapse|discard|separate
         控制margin重叠
         collapse默认-重叠
         discard 取消
         separate 分隔 没有重叠

以上是深入理解CSS中margin的使用方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
' CSS4”更新' CSS4”更新Apr 11, 2025 pm 12:05 PM

自从我第一次介绍了CSS4面中的事情以来,就已经进行了更多的讨论。我将在这里从其他人那里汇集我最喜欢的想法。有

三种代码三种代码Apr 11, 2025 pm 12:02 PM

每次启动一个新项目时,我都会将我正在查看的代码分为三种类型,或者如果您愿意的话。我认为这些类型可以应用于

https很容易!https很容易!Apr 11, 2025 am 11:51 AM

我对公开哀悼HTTPS的复杂性感到内gui。过去,我从第三方供应商那里购买了SSL证书,并且遇到了麻烦

HTML数据属性指南HTML数据属性指南Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

了解JavaScript中的不变性了解JavaScript中的不变性Apr 11, 2025 am 11:47 AM

如果您以前从未在JavaScript中使用不变性,则可能会发现很容易将其与为新值或重新分配分配变量的混淆。

具有现代CSS功能的定制样式表单输入具有现代CSS功能的定制样式表单输入Apr 11, 2025 am 11:45 AM

如今,可以在语义上且易于访问的同时构建自定义的复选框,无线电按钮和切换开关。我们甚至不需要

脚注字符脚注字符Apr 11, 2025 am 11:34 AM

有特殊的超级数字字符有时非常适合脚注。他们在这里:

如何使用HTML,CSS和JavaScript创建动画倒计时计时器如何使用HTML,CSS和JavaScript创建动画倒计时计时器Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能