CSS布局奇淫巧计之-强大的负边距

负的边距好像能减小元素在文档流中的尺寸一样,但事实上,它的尺寸大小并没变,只是文档流在计算元素位置的时候,会认为负边距把元素的尺寸减小了,因此位置也就发生变化了。

实例:

这里写图片描述

因为P为block元素且没有指定width,则p的width+padding+border+margin=父级div的width(这里都是说的水平方向)。这里假定padding,border为0。父级div的width为400px。p的width为inherit,如果不设置margin,则p的width为400px。正如text-block。当margin-left:-100px;,p.width + (-100px) = 400px。所以p的width就变成了500px。这里说的p都是假定为inherit width即没有指定确定的width值。相反如果指定了p的width,则margin-left,margin-right为负值则会引起的不是p元素的大小,而是会引起p元素位置的变化。这里和浮动元素上应用负的margin-left和margin-right得到的效果是相同的

1. 负边距在普通文档流中的作用和效果

那些没有脱离文档流的元素(指不是浮动元素也不是绝对定位、固定定位的元素等),其在页面中的位置是跟随者文档流的变化而变化的。看下面这幅图

这里写图片描述

负边距对这些由文档流控制的元素的作用是,会使它们在文档流中的位置发生偏移,但这种偏移不同于相对定位,通过相对定位偏移后,其仍然会坚守着它原来占据的空间,不会让文档流的其它元素乘虚而入。而通过负边距进行偏移的元素,它会放弃偏移前占据的空间,这样它后面文档流中的其它元素就会“流”过来填充这部分空间

还是通过例子来说明吧。现在我们把上图中的块状元素、行内元素以及inline-block元素都设一个负边距 margin:-10px; 看看会发生什么

这里写图片描述

我们看到,黑灰色的块状元素好像向左和向上都分别嵌入了浏览器窗口的边界里10px,然后块状元素下面的文字也爬到了它身上,行内元素向左移动盖住了它前面的一个字,它后面的文字也有一部分覆盖在了它身上,inline-block的位置变化也很明显

好了,这点相信大家早就心知肚明了,就是负的边距好像能减小元素在文档流中的尺寸一样,但事实上,它的尺寸大小并没变,只是文档流在计算元素位置的时候,会认为负边距把元素的尺寸减小了,因此位置也就发生变化了。这只是打个很形象的比喻,帮助大家理解一下。还要注意的是,文档流只能是后面的流向前面的,即文档流只能向左或向上流动,不能向下或向右移动

比如,一个没有设定高度的块状元素,其高度是自动的,具体来说就是由它里面的文档流最后的位置决定的。假设它里面有一个出于文档流中的子元素,高度为100px;那这时这个父元素的高度就等于子元素的高度100px了,如果子元素继续增高,那么父元素也会跟着增高。可是如果这时子元素设一个负的margin-bottom,比如-20px,因为负边距会影响到文档流,本来文档流的高度是从父元素的最顶端到子元素的最底端这段高度,现在子元素有一个margin-bottom:-20px;就相当于文档流要向上退后20px,这样整个文档流的高度就减少了20px了,那么父元素的高度也会跟着减少20px。在IE8+以及那些标准浏览器中,这还需要父元素拥有一个overflow:hidden的属性,因为父元素的高度变了,但子元素的高度并没有变,所以需要使子元素超出隐藏,但即使不设置overflow:hidden,父元素的高度也是变小了的,只不过这时子元素的高度会超出父元素。在IE6中则不需要,但需要触发它的hasLayout属性。所以以前所说的多列等高布局就是利用这个原理来实现的

2. 左和右的负边距对元素宽度的影响

负边距不仅能影响元素在文档流中的位置,还能增加元素的宽度!

这个作用能实现的前提是:该元素没有设定width属性(当然width:auto是可以的)

比如下图的黑灰色部分是一个块状元素,它没有设定宽度。它被包裹在一个宽度为400px,且水平居中的父元素中

这里写图片描述

现在给这个元素的设一个margin-right:-100px

这里写图片描述

我们看到它的宽度的确变长100px;然后再给它设一个margin-left:-100px

这里写图片描述

负的margin会改变元素的宽度,这的确很让人费解,如果说负边距会改变元素在文档流中的位置还是很好理解的话,那改变宽度这种现象还真的蛮让人不可思议的

那这货有什么用途呢?我就举一个例子吧

这里写图片描述

想要创建上图中黑框内的几个元素按顺序排下来,中间带些间隔的布局要怎么做?,当然最简单省事的方法就是利用浮动了。我们把黑框里面的子元素向左浮动,然后设一个合适的margin-right,是不是就办到了呢?但因为外边黑框的宽度是固定的,就是里面四个子元素的宽度加上三列间隔的宽度,所以靠近右边边界的子元素就不应该有正向的margin-right了,否则这一行就只能容纳三个子元素了。有人说那这还不简单,给靠近右边界的那些子元素加一个class,把它的margin-right设为0不就行了。这当然可以,但如果这些子元素是在模板中通过循环动态输出的,那在循环的时候还得判断哪些子元素是靠近右边边界的,如果是就加上一个class。这样做的话是不是就有点麻烦了?所以解决办法是加大子元素的父容器的宽度,让它能够容纳一行中有四个子元素加上四列间隔的宽度,然后最外面的的黑框的那个容器设一个overflow:hidden就行了。上面说了负的左右边距能加大元素的宽度,所以给子元素的父容器设一个合适的负的margin-right就可以了。当然你也可以直接在css中把子元素的父容器的宽度设宽一些,举这个例子只是为了说明负边距也是一种方法

3. 负边距对浮动元素的影响

负边距对浮动元素的影响与负边距对文档流中元素的影响其实是差不多的。文档流中元素的位置由文档流的走向决定,浮动的元素也可以看成有一个“浮动流”存在,不过浮动流既可以向左,也可以向右

比如下图是三个向左浮动的元素,宽高都是100px

这里写图片描述

现在把它们都设一个margin-right:-50px; 然后会变成这样子

这里写图片描述

我们看到后面的元素叠到了前面的元素上

这里写图片描述

我们把浏览器缩小了,然后因为宽度不够,元素3掉下来了。我们给元素3设一个margin-left:-80px;看看会怎么样

这里写图片描述

这时元素3完全覆盖住了元素2,当元素3设为:margin-left:-200px时

这里写图片描述

我们看到元素3继续向左移动并覆盖住了元素1

现在想必大家都明白了负边距对浮动元素位置的影响了吧。所以那些说得很好听的什么圣杯布局、双飞翼布局啊什么的,都是利用这个原理实现的。就是某个元素虽然是写在了后面,但可以通过负边距让它在浏览器显示的时候是在前面的

4. 负边距对绝对定位元素的影响

绝对定位的元素定义的top、right、bottom、left等值是元素自身的边界到最近的已定位的祖先元素的距离,这个元素自身的边界指的就是margin定义的边界,所以,如果margin为正的时候,那它的边界是向外扩的,如果margin为负的时候,则它的边界是向里收的。利用这点,就有了经典的利用绝对定位来居中的方法

这里写图片描述

这里写图片描述

注1:关于left的偏移问题:

1. 当position设置为absolute或时fixed, left属性指定元素的左边缘和其包含块的左边缘之间的距离

2. 当position设置为relative,left属性指定元素的左边缘从正常位置向右移动的距离

3. 当position设置static,left属性没有影响

注2:关于left的取值问题:

1. 如果是数值,那么就是指定偏移的固定距离

2. 如果是百分比,那么就是相对父容器的宽度来计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NHibernate] NHibernate对象关系映射工具了解

NHibernate是把Java的Hibernate核心部分移植到Microsoft .NET Framework上。它是一个对象关系映射工具,其目标是把.NET对象持久化到关系数据库。 NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational…

改变CSS世界纵横规则的writing-mode属性

1. writing-mode的原本作用 和float属性有些类似,writing-mode原本设计的是控制内联元素的显示的(即所谓的文本布局-Text Layout)。因为在亚洲,尤其像中国这样的东亚国家,存在文字的排版不是水平式的,而是…

IOS中定时器NSTimer的开启与关闭

调用一次计时器方法: [cpp] view plaincopymyTimer [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:selector(scrollTimer) userInfo:nil repeats:NO]; //不重复,只调用一次。timer运行一次就会自动停止运行 重复调用计时器方法&…

灰鸽子病毒手工清除方法

灰鸽子病毒手工清除方法[多图] www.rising.com.cn 2005-2-1 9:50:00 信息源:瑞星公司 作者:刘明星 广告 灰鸽子(Backdoor.Huigezi)作者现在还没有停止对灰鸽子的开发,再加上有些人为了避开杀毒软件的查杀故意给灰鸽子加上各种不同的壳&a…

IOS重力感应

iPhone和iPad设备有4个方向的状态,我们可以针对应用当前所处的方向调整界面。 为了使应用支持不同的方向,首先我们需要在项目设置中设置设备支持的方向(也可以在项目的plist中设置) Portrait  竖放,home键在屏幕下方…

理解CSS3 max/min-content及fit-content等width值

1. CSS2.1的尺寸体系 在CSS2.1的世界中,常见的尺寸分为这几类: 2.1 充分利用可用空间。例如,一些div元素默认宽度100%父元素,这种充分利用可用空间的行为就称为“fill-available”。 2.2 收缩与包裹。典型代表就是浮动&#xf…

Vue中实现数据列表无缝轮播

实现效果: 链接 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>vue.js动态文字滚动公告代码</title><script src"https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js">…

接触VC之四:COM组件模型基础

From: http://daimajishu.iteye.com/blog/1081292 一年又一年&#xff0c;已经又过了一年了。我VC的生涯已经两岁了。可以相当地庆贺一下哟。回顾这一年的学习(唉&#xff0c;还没有工作实践呢。这年头&#xff0c;工作不好找哇。),还学了不少的好东西。其中&#xff0c;最重要…

word-break:break-all和word-wrap:break-word的区别

1. CSS的学习&#xff0c;就我个人看来&#xff0c;是有别于JavaScript这张传统程序语言的学习的。本身属性就多&#xff0c;值也多&#xff0c;不同属性在一起表现也不一样&#xff0c;不同属性和不同类型的HTML标签在一起又不一样&#xff0c;再加上兼容性差异和未定义行为。…

2009年上半年网络工程师考试下午试卷参考答案(二)

试题四&#xff08;共15分&#xff09;阅读以下说明&#xff0c;回答问题1至问题4&#xff0c;将解答填入答题纸对应的解答栏内。【说明】某公司总部和分支机构的网络配置如图4-1所示。在路由器R1和R2上配置IPSec安全策略&#xff0c;实现分支机构和总部的安全通信。图4-1【问题…

CSS深入理解vertical-align和line-height的基友关系

1. vertical-align 众所周知&#xff0c;vertical-align支持很多属性值&#xff0c;足足可以组成一个足球队了&#xff1a; 其中&#xff0c;有个属性值暴露了vertical-align和line-height之间的基友关系&#xff0c;大家猜猜看是哪个属性值&#xff1f;哇塞&#xff0c;好厉害…

解决html2canvas截取页面部分div黑屏问题

当截取页面的部分div时出现上述问题 原因&#xff1a; 当转存图片格式为jpeg时截取整个页面(document.body)没有问题&#xff0c;但截取部分div会有黑屏 将jpeg改为png时图片可正常显示。

window.print() 前端实现网页打印详解

前言 print作为浏览已经比较成熟的技术可以经常被用来打印页面的部分内容&#xff0c;我们可以在MDN上查看到相关的简单介绍。 一、print()方法 print() 方法用于打印当前窗口的内容。调用 print() 方法会产生一个打印预览弹框&#xff0c;让用户可以设置打印请求。最简单的打…

android- Auto Monitor Logcat

启动模拟器的时候弹出窗体&#xff1a; 它实在询问你是否显示logcat视图以便显示此工作空间中的程序信息。 因为如何程序错误&#xff0c;可以从logcat中看到错误的原因&#xff0c;建议选择yes。 单击确定&#xff0c;你会发现多了一个Logcat窗体。转载于:https://www.cnblogs…