侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

CSS margin全面了解

技术  /  管理员 发布于 8年前   476

一、margin可以为负值

在盒模型中,内容区的width/height、padding、border都不能为负值,但是margin例外,它可以为负值。

关于margin负值的使用技巧,了解不多,日后有机会再补充,此处先贴一个经典应用,margin-left负值结合浮动实现不改变DOM结构的流体布局。

此demo与CSS float浅析篇中的是同一个。

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>不改变DOM结构的流体布局</title>  
  6.         <style>  
  7.             .container {   
  8.                 width:600px;   
  9.                 margin-left: auto;   
  10.                 margin-right: auto;   
  11.                 background-color: orange;   
  12.                 font-size: 16px;   
  13.                 line-height: 1.5;   
  14.             }   
  15.   
  16.             .box1 {   
  17.                 width:100%;   
  18.                 float:left;   
  19.             }   
  20.   
  21.             .box2 {   
  22.                 margin-right: 220px;   
  23.                 padding-left: 20px;   
  24.             }   
  25.   
  26.             img {   
  27.                 width:200px;   
  28.                 float:left;   
  29.                 margin-left:-200px;   
  30.             }   
  31.   
  32.             .clearfix:after {   
  33.                 content: "";   
  34.                 display: table;   
  35.                 clear: both;   
  36.             }   
  37.   
  38.             .clearfix {   
  39.                 *zoom: 1;   
  40.             }   
  41.   
  42.         </style>  
  43.     </head>  
  44.     <body>  
  45.         <div class="container clearfix">  
  46.             <div class="box1">  
  47.                 <div class="box2">  
  48.                 <h3>不改变DOM位置的流体布局</h3>  
  49.                 <p>假如有一段文本和一幅图像,在DOM节点中,文本在前,图像在后,怎么能把图像定位到右边呢?</p>  
  50.                 <p>通常的做法是,调换DOM节点中图像与文本的位置,让图像在前,文本在后,然后将图像浮动到右边即可。</p>  
  51.                 <p>但这样改变DOM节点顺序始终不妥,还有什么更好的方法呢?</p>  
  52.                 <p>下面就介绍一种新的思路来完成布局。</p>  
  53.                 <ul>  
  54.                     <li>将文本用div包起来,定义为box1;现在的结构是一个box1和一个img。</li>  
  55.                     <li>将box1宽度设为100%,左浮动;将img设置一个宽度,也左浮动,然后margin-left设为负的宽度值;此时图像就定位到文本的右边啦。</li>  
  56.                     <li>但是有一个问题,图像盖住了文本内容,这可怎么办?</li>  
  57.                     <li>重点来了,在box1中增加一个box2,box2把文本全部包起来,然后margin-right设为图像的宽度(+额外的间距),这样就解决问题啦!</li>  
  58.                 </ul>  
  59.                 </div><!--关闭box2-->  
  60.             </div><!--关闭box1-->  
  61.             <img src="http://imgsrc.baidu.com/forum/w%3D580/sign=0c101fe665380cd7e61ea2e59145ad14/f9a3492762d0f7032de1758a08fa513d2797c542.jpg" alt="a picture" style="width:200px;height:300px" />  
  62.         </div><!--关闭container-->  
  63.     </body>  
  64. </html>  

二、margin的百分比数值

当margin属性的值为百分数时,其总是以父元素的width为基数进行计算。

请看下面这个demo,当初折磨了我N久的。。。只怪我知道得太晚了,说多了都是泪啊。。。

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>margin的百分数值</title>  
  6.         <style>  
  7.             .container {   
  8.                 width: 500px;   
  9.                 height: 300px;   
  10.                 margin: 50px auto;   
  11.                 background-color: orange;   
  12.                 border: 1px solid black;   
  13.             }   
  14.   
  15.             .box {   
  16.                 width: 250px;   
  17.                 height: 150px;   
  18.                 margin-left: auto;   
  19.                 margin-right: auto;   
  20.                 background-color: cyan;   
  21.             }   
  22.   
  23.             .box1 {   
  24.                 margin-top: 75px;   
  25.                 margin-bottom: 75px;   
  26.                 padding: 5px;   
  27.             }   
  28.                
  29.             .box2 {   
  30.                 margin-top: 25%;   
  31.                 margin-bottom: 25%;   
  32.                 padding: 5px;   
  33.             }   
  34.         </style>  
  35.     </head>  
  36.   
  37.     <body>  
  38.         <div class="container">  
  39.             <div class="box box1">  
  40.                 <p>父元素的高度为300px,子元素的高度为150px,只要margin-top和margin-bottom都为75px,这个盒子就能垂直居中。</p>  
  41.                 <p>OK,居中啦!!!</p>  
  42.             </div>  
  43.         </div>  
  44.         <div class="container">  
  45.             <div class="box box2">  
  46.                 <p>既然子元素的高度是父元素高度的50%,那么只要margin-top和margin-bottom都为25%,应该也能垂直居中。</p>  
  47.                 <p>额,这什么鬼?说好的居中呢?</p>  
  48.             </div>  
  49.         </div>  
  50.     </body>  
  51. </html>  

三、垂直方向上margin的合并

这个问题经常造成一些困惑,不过只需要记住一句话即可,垂直方向上的margin只要亲密接触就会合并,也只有亲密接触才会合并。

垂直方向上margin的合并,如果发生在相邻元素,其实是很好理解的;但是如果发生在父元素与子元素之间,就有些怪异了。

来看例子:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>垂直方向上的margin合并</title>  
  6.         <style>  
  7.             .container {   
  8.                 width: 500px;   
  9.                 height: 300px;   
  10.                 margin: 50px auto;   
  11.                 background-color: orange;   
  12.             }   
  13.   
  14.             .box {   
  15.                 width: 300px;   
  16.                 height: 200px;   
  17.                 margin-left: auto;   
  18.                 margin-right: auto;   
  19.                 background-color: cyan;   
  20.                 margin-top: 25px;   
  21.                 padding: 5px;   
  22.             }   
  23.   
  24.             .border {   
  25.                 border: 1px solid black;   
  26.                 /*padding: 1px;*/   
  27.             }   
  28.         </style>  
  29.     </head>  
  30.   
  31.     <body>  
  32.         <div class="container">  
  33.             <div class="box">  
  34.                 <p>父元素的margin-top为50px,子元素的margin-top为25px;</p>  
  35.                 <p>咦,子元素的margin-top呢?为什么都顶到父元素上边界了?</p>  
  36.                 <p>额,因为父元素与子元素的margin-top亲密接触了呀,所以它们合并在一起了啊。</p>  
  37.             </div>  
  38.         </div>  
  39.         <div class="container border">  
  40.             <div class="box">  
  41.                 <p>可是我就是想让子元素距离父元素的上边界25px啊,我不想让它们合并呀。</p>  
  42.                 <p>很简单,给父元素加个边框,它们就无法亲密接触了,就不会合并了啊。</p>  
  43.                 <p>或者给父元素设置padding也是可以的喔。</p>  
  44.             </div>  
  45.         </div>  
  46.     </body>  
  47. </html>  

消除垂直方向上margin合并的方法:给父元素加border或者加padding,打破父元素与子元素margin之间的亲密接触即可。

margin合并的规则:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>margin合并规则</title>  
  6.         <style>  
  7.             .container {   
  8.                 width: 300px;   
  9.                 height: 500px;   
  10.                 margin: 50px;   
  11.                 background-color: orange;   
  12.                 float: left;   
  13.                 border: 1px solid black;   
  14.             }   
  15.   
  16.             .box1,.box2,.box3,   
  17.             .box4,.box5,.box6 {   
  18.                 width: 200px;   
  19.                 height: 150px;   
  20.                 margin: 30px auto;   
  21.                 background-color: cyan;   
  22.                 text-align: center;   
  23.                 line-height: 150px;   
  24.             }   
  25.   
  26.             .box1 {   
  27.                 margin-bottom: 30px;   
  28.             }   
  29.   
  30.             .box2 {   
  31.                 margin-top: 20px;   
  32.             }   
  33.   
  34.             .box3 {   
  35.                 margin-bottom: 30px;   
  36.             }   
  37.   
  38.             .box4 {   
  39.                 margin-top: -30px;   
  40.             }   
  41.   
  42.             .box5 {   
  43.                 margin-bottom: -30px;   
  44.             }   
  45.   
  46.             .box6 {   
  47.                 margin-top: -50px;   
  48.                 background-color: green;   
  49.             }   
  50.   
  51.             p {   
  52.                 width: 220px;   
  53.                 margin:10px auto;   
  54.                 font-size: 16px;   
  55.                 line-height: 1.5;   
  56.             }   
  57.   
  58.         </style>  
  59.     </head>  
  60.   
  61.     <body>  
  62.         <div class="container">  
  63.             <div class="box1">box1</div>  
  64.             <div class="box2">box2</div>  
  65.             <p>box1的margin-bottom为30px,box2的margin-top为20px,两个margin都是正数,取绝对值大的。</p>    
  66.         </div>  
  67.         <div class="container">  
  68.             <div class="box3">box3</div>  
  69.             <div class="box4">box4</div>  
  70.             <p>box3的margin-bottom为30px,box4的margin-top为-30px,两个margin一正一负,相加。</p>    
  71.         </div>  
  72.         <div class="container">  
  73.             <div class="box5">box5</div>  
  74.             <div class="box6">box6</div>  
  75.             <p>box5的margin-bottom为-30px,box6的margin-top为-50px,两个margin都是负数,取绝对值大的。</p>    
  76.         </div>  
  77.     </body>  
  78. </html>  

1.    两个margin都是正数,取绝对值大的;

2.    一个margin是正数,另一个margin是负数,相加;

3.    两个margin都是负数,取绝对值大的。

以上这篇CSS margin全面了解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

原文地址:http://www.cnblogs.com/cc156676/archive/2016/07/21/5690270.html


  • 上一条:
    Ruby的面向对象方式编程学习杂记
    下一条:
    Lua时间转化的几个小例子
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客