最近看到一篇讲解CSS 负边距的文章: http://segmentfault.com/a/1190000003750411?utm_source=Weibo&utm_medium=shareLink&utm_campaign=socialShare 看后感觉如沐春风。以下是我的一点理解:

首先是原文中的结论

  • margin为正时,top、left属性是以content上(左)或垂直上方相连元素margin的下(右)边为参考线垂直向下(右)位移。

  • margin为负且盒子static时,right、bottom属性是元素本身的border右(下)边为参考线水平向右(下)位移。

  • margin为负且盒子不为static时,按原有布局并向对应方向偏移。

  

  1. 盒子最后的显示大小等于盒子的border+padding+正margin,而负margin不会影响其大小。

  2. margin为负且盒子static时:

    • 若属性为top、left,盒子将被拉进指定的方向;

    • 若属性为bottom、right,将后续的元素拖拉进来,覆盖本来的元素。

    • 若width没有被设置,设定负margin-left/right会将元素拖向对应的方向,并增加宽度,此时的margin的作用就像padding一样

我们按照这个结论,对原文中提的两个demo,进行试验并进行详解。

选项卡demo

按照原文中的结论,如果对上面的块级元素的下边距设置为负值,那么下面的块级元素就会被拉上来,而且会覆盖上面的标签。等等,我们要的效果是你下面的内容区有边框,但是上面的菜单栏中的选中项会覆盖掉下面边框的一部分吗?

我一开始在这里也有一些疑惑,因为效果是上压下,但原文结论是下压上。这不就矛盾了吗。但是当我按照原文写出demo后,发现了玄机。首先说明结论是正确的。

一下是我的demo代码:

html:

       <div class="tap-wrap">
<ul class="tap-group">
<li class="tap-item"><a class="btn-tap" href="javascript: void(0);">前端</a></li>
<li class="tap-item"><a class="btn-tap" href="javascript: void(0);">实战</a></li>
<li class="tap-item"><a class="btn-tap" href="javascript: void(0);">交互</a></li>
<li class="tap-item"><a class="btn-tap" href="javascript: void(0);">优化</a></li>
</ul>
<ul class="content-group">
<li class="content-item active"><p class="content-txt">这是第一个选项卡的内容。</p></li>
<li class="content-item"><p class="content-txt">这是第二个选项卡的内容。</p></li>
<li class="content-item"><p class="content-txt">这是第三个选项卡的内容。</p></li>
<li class="content-item"><p class="content-txt">这是第四个选项卡的内容。</p></li>
</ul>
</div>

css:这里我为了说明问题,加入了一些辅助的CSS

 a{ text-decoration: none; }

 .main-wrap{
margin: 50px auto 0 auto;
width: 700px;
height: 500px;
border: 1px solid #000;
} .tap-group{
list-style: none;
overflow: hidden;
margin-bottom: -1px;
background-color: #999; /********************************************辅助颜色*/
} .tap-item{
float: left;
width: 100px;
height: 50px;
line-height: 50px;
text-align: center;
border-top: 1px solid red;
border-right: 1px solid red;
} .tap-item.active{ background-color: #fff;}
.tap-item:first-child{ border-left: 1px solid red; } .content-group{
width: 403px;
height: 200px;
border: 1px solid red;
overflow: hidden;
background-color: #eee;
}
.content-item{width: 100%; height: 100%; display: none;}
.content-item.active{ display: block; }

js:

 $(document).ready(function(){
$('.tap-item').on('click', function(){
var index = $(this).index();
$(this).add('.content-item:eq('+index+')').addClass('active').siblings().removeClass('active');
});
});

我们打开调试器,将菜单栏(.tap-group)原来的  margin-bottom: -1px; 改成 -18px  这样你就会看到这样的效果:

也就是说原文中覆盖内容区边框的其实不是菜单栏,而是tab选项自身(.tap-item),那么为什么下面的内容区覆盖上面的菜单栏,但是菜单栏中的tab选项却覆盖了下面的内容去呢(tab选项   覆盖-->  内容区  覆盖-->  菜单栏)?

下面来进行几种猜想:

猜想1: z-index

这和菜单栏的tab选项布局有关,因为我们采用的是浮动,浮动后<li>标签脱离了文档流,z-index高于正常的元素。

我们验证一下,将浮动改成display: inline-block;这样每一个tab选项都是未脱离文档流的,但是此例中,仍能实现这个效果。

因此这种猜想不成立。

猜想2:    BFC

既然float:left;和display: inline-block; 都可以完成这种效果(tab选项   覆盖-->  内容区  覆盖-->  菜单栏)。那么我们是不是可以抽出这个问题把思路放在单纯的负边距覆盖问题上;看看是不是每种BFC触发条件都能做到。

我们不受到横向布局的限制,因此我打算再下一个demo,专门来测试BFC对负边距布居中覆盖关系的影响。

html:

 <div class="main-wrap">
<div class="box1">
<p class="txt">负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距负边距</p>
</div>
<div class="box2"></div>
</div>

不加入BFC,仅仅加入负边距。

css:

     .main-wrap{
margin: 50px auto 0 auto;
width: 700px;
height: 500px;
border: 1px solid #000;
} .box1{
background-color: #453453;
width: 100px;
height: 100px;
border: 1px solid red;
margin: 0px 0px -34px 0px;
} .box1 .txt{
background-color: #fff;
height: 100px;
} .box2{
background-color: #453453;
height: 100px;
border: 1px solid red;
margin: 0px -30px 0px -40px;
}

我们来看一下效果:

我们打开调试器: 分别测试加入BFC的触发条件,看看是不是会出现预期的效果(.box .txt)的背景色覆盖下面的块级元素。

发现可以达到预期效果的有: position: absolued 或 relative; float: left; display:inline-block   -webkit-inline-box   inline-flex  背景大小为我们设定的100px ,见效果图 3。 (虽然不是bfc,但也一起看一下 inline  inline-table 白色背景包裹文本内容大小, 见效果图 4。)

效果图3:          效果图4: 

但是BFC条件中: 我设置overflow: hidden;  display :  table-cell, table-caption, flex;均没有效果。

因此这个效果和BFC没有直接的关系,同时我们也进一步发现了一些条件:

position: absolued 或 relative; float: left; display:inline-block   -webkit-inline-box   inline-flex

因此得出: 如果设置margin-bottom后下方元素会被拉上来,并覆盖自身,但是,如果对自身内部元素(有背景色和高度)进行一下设置position: absolued 或 relative; float: left; display:inline-block   -webkit-inline-box   inline-flex中的一项,内部元素会覆盖下方被吸上来的元素。

负margin实现两列等高布局

对于这个demo原文中没有做出解释,简单运行了一下,发现这里的等高,其实是利用background-color包含padding的特点利用一个较大的padding填充补齐空间再用负的margin拉回文档流中的占位,最后父级元素overflow: hidden;进行截断。

CSS 负边距读后感的更多相关文章

  1. css负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> ...

  2. css负边距之详解

    自从1998年CSS2作为推荐以来,表格的使用渐渐退去,成为历史.正因为此,从那以后CSS布局成为了优雅代码的代名词. 对于所有设计师使用过的CSS概念,负边距作为最少讨论到的定位方式要记上一功.这就 ...

  3. css 负边距 小记

    水平格式化 当我们在元素上设置width的时候,影响的是内容区的宽度  但是当我们又为元素指定指定了内边距 边框 外边距 还是会增加宽度值  (IE传统盒模型 内边距 边框 会在元素的宽度内扩展 ma ...

  4. 浅析CSS负边距

    本文主要讨论两点,1.左右负边距对元素宽度的影响:2.负边距对浮动元素的影响. 在讨论这两点前,首先要理解盒模型.文档流. 盒模型,见下图,简单明了. 文档流,将窗体自上而下分成一行行, 并在每行中按 ...

  5. CSS负边距margin的应用

    原文 简书原文:https://www.jianshu.com/p/75a178e65207 相关文章 CSS负margin的影响:https://www.cnblogs.com/shcrk/p/93 ...

  6. css负边距之详解(子绝父相)

    来源 | http://segmentfault.com 原文 |  The Definitive Guide to Using Negative Margins   自从1998年CSS2作为推荐以 ...

  7. css 负边距

    负边距 可以改变 他在文档流中的尺寸 当块级元素设置 margin: -10px;  这个快 的大小没变但是他的定位的位置向上串了,压住了上面的文字   而且在他后面的文字  会爬到他身上 而前面的文 ...

  8. CSS 负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head>     <meta charset="UTF-8"& ...

  9. CSS负边距自适应布局三例

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset=”UTF-8″> <title& ...

随机推荐

  1. 电量分析工具 Battery Historian 的配置及使用

    1.Building from source code(通过各种配置后从源码构建) 官方流程看似很麻烦,但一上手,很快就搞定,让我情何以堪. ps:以下均是参考官方及网友做的 copy https:/ ...

  2. 3d Max 2012安装失败怎样卸载3dsmax?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. Mac 系统变量

    vim .bash_profile ========================= MAVEN_HOME = < ... > export MAVEN_HOME =========== ...

  4. centOS和redHat防火墙开放端口

    发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...

  5. 性能测试工具Jmeter10-Jmeter集合点与关联

    集合点 操作步骤: 注意:集合点要放在需要集合的元件前面 关联 正则表达式提取器 配置说明 引用名称:下一个请求要引用的参数名称,如token,则可用${token}引用它 正则表达式: () 括起来 ...

  6. [转]href="#"与javascript:void(0)的区别

    本文转自:http://www.cnblogs.com/suizhikuo/p/3928411.html 如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href=&qu ...

  7. Spring Boot实战(3) Spring高级话题

    1. Spring Aware Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器替换成别的容器. 实际项目中,不可避免地会用到Spring容 ...

  8. [转]javascript之数组操作

    javascript之数组操作 .数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个 ...

  9. FragmentPagerAdapter 与 FragmentStatePagerAdapter的区别。通过验证证明的。

    在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希 ...

  10. JAVA的图片文字识别技术

    从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...