CSS理解之margin

CSS理解之margin,第1张

margin重叠通常特性:

margin重叠三种情况:

demo 1:

1.相邻兄弟元素margin重叠

兄弟元素的上下margin发生了重叠

2.父级和第一个/最后一个子元素

demo 1:

inline元素(内联元素,像图片、文字这样的东西)

块状格式化上下文元素(BFC元素)

同样可以利用父子margin重叠条件来去除margin重叠:

demo 2:

demo 2 :

demo 2:

去掉margin-bottom重叠与上面类似。

3.空的block元素margin重叠:

空的block元素发生margin重叠,也需要一些条件限制:

去掉空的block元素的margin重叠也是利用上面的条件:

3.margin重叠的计算规则:

1、正正取大值:

2、正负值相加:

3、负负最负值(取绝对值大的):

首先理解margin atuo的作用机制 ,先看一些事实例子:

1.元素有时候,就算没有设置width或height,也会自动填充外部容器

例1:

例2:

以上两个例子是比较常见的,没有设置宽高也会自动填充所在容器。

若刚才的两个例子,如果设置了width或heigth,自动填充特性就会被覆盖。

总之一句话,auto就是用来分配。

通过以上的例子,很多事情就很好理解了,比方说:

1.为什么图片设置了 margin:0 auto 不水平居中?

如上图,设置了 margin auto ,图片为什么还是不居中呢?

因为图片是inline水平的,它占据的空间并没有撑满整个容器,如果没有设置宽度值。所以它就不满足 margin auto 用来填充剩余空间的条件,因为他根本就没有剩余空间。要想让它居中也很简单:

2.为什么明明容器定高,子元素也定高了, margin auto 0 无法垂直居中?

上图水平方向剧中了,但是垂直方向不剧中,父级元素高度有了,子元素高度也有了,为什么还是不垂直居中呢?

因为他不满足占满整个容器这个条件,想一下,如果,没有为.son设置高度值,它之前满足占满整个容器这个条件吗?很显然不满足,也就没有剩余空间,所以设置 height:100px margin auto 不会垂直居中。

还需要注意一点:用 margin:auto 来实现居中,它计算后的值必须是正直,比如说你的父容器宽度1000px,子元素宽度2000px,这时设置 margin:auto 它是不居中的。

那么如何实现垂直方向上的剧中呢,方法很多不止一种:

1.writing-mode与垂直居中:

更改流为垂直居中之后,内容会自动撑满垂直方向的高度。这时宽度不会自动撑满容器,所以宽度的水平居中就失效了。

2.绝对定位元素实现垂直居中:

子元素设置了 top:0right:0bottom:0left:0之后,没有设置宽高,absolute元素也自动填满了容器。

1.margin负值下的两端对齐(主要利用了margin可以改变元素尺寸这一特性:正直变小,负值变大)

由于 <div class="ul"></div>没有设置宽度,所以设置了 margin-right:-20px后,改变了它的宽度,增大了20px,变为1220px。这时我们再把 li 的宽度设置为计算好的386.66666px,就可以实现没有间隙的两端对齐。 主要利用了margin负值增加它的空间

demo:

可以看出它的垂直方向是没有margin的,是无效的。

2.第二种常见的无效是margin重叠,比如你设置了margin-top当发现没有效果,这就是margin重叠带来的影响。

3.display:table-cell与margin

demo:

可以看出设置的margin是无效的。

但是对替换元素设置table-cell是可以发生作用的,但平时我们不会给替换元素设置table-cell,这是没有任何意义的,所以记住这点就行。

4.position:absolute与margin,绝对定位元素非定位方向的margin值 “无效” ,定位方向的margin值是有效的。

    border: 5px solid red

    padding: 20px/* 复合属性,上右下左都是20px */

    /* padding-left: padding-right: padding-top: padding-bottom: */

    /* padding: 20px padding-top: 40px上40,其他20 */

    /* padding: 10px 20px 15px上10px,左右20px 下15px */

    /* padding: 10px 20px上下10px  左右20px *

*{margin: 0pxpadding: 0px}

        div{

            width: 200px

            height: 200px

            background: aqua

            border: 10px solid red

            padding: 20px

            margin: 15px

            /* 盒子显示width+border+padding */

            /* 200+20+40=260 */

           /*  width:260    怪异盒模型

            height: 260

            box-sizing: border-box*/

           /*  vertical-align: middle 图片文字位置 */

width: 300px

            height: 400px

            margin: 20px

            padding: 30px

            border: 5px solid black

            box-sizing: border-box

           /* 宽度300+60++10=370

           高度400+60++10=470 */

1. 文档流

指在网页中将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。主要的形式是自上而下(块级元素),一行接一行,每一行从左至右(行内元素)。

定位类型包括三种:

包含三种类型:块级元素的块级格式、行内元素的行内格式以及两种元素的相对定位方式。

2.脱离文档流

要使一个元素脱离文档流有两种方式:

使用浮动(float): 值为 left、right 均会使元素脱离文档流,但不会脱离文本流,即利用float脱离文档流的时候,其他盒子元素会无视这个元素,但是其他盒子内的文字依然会为它让出位子,环绕在其周围)

        对于float布局:

        1.如果浮动元素的上一个元素也是浮动,那么该元素会与上一个元素排列在同一行,如果行宽不够,后面的元素会被挤到下一行

2.如果浮动元素的上一个元素不是浮动,那么该元素仍然处于上一个元素的下方,根据浮动设定在左或者在右,而其本身也脱离普通流,后边的元素会自动往上移动到上一个普通流元素下方为止

       3 当给元素设置float后,元素将形成“块”,可以给该元素设置宽高,如span元素。而float属性被除去时,宽高就会失效

使用定位(position): 值为 absolute、fixed 的元素脱离文档流,其它不脱离文档流

3. 普通流的margin取负值

        1.margin-left为负值(影响自身元素

            div2: marigin-left:-50px

    2.margin-right为负值

         div2: marigin-right:-50px(设置宽度时,无影响

           当不设置宽度时,

3.margin-top:-50px(偏移值相对于自身,其后元素受影响

4.margin-bottom:-50px(自身无偏移值,,其后元素向上偏移

可以看出

margin-left 和 margin-top:影响自身元素,自身元素将向指定方向偏移

margin-right在没有设置width属性时,宽度向右增加对应的像素

margin-bottom将影响后元素,使后元素向上偏移对应像素

所有偏移的元素位于z轴最上方,偏移量覆盖正常元素的对应位置

margin-top:-50px(影响自身元素,元素将向上偏移

margin-left:-50px(影响自身元素,将向左偏移,并影响其后元素

        margin-left:-500px(大于自身宽度

margin-right:-50px(对自身无影响,影响其后元素,其后元素将向左偏移对应像素

margin-bottom:-50px(无影响

    可以看出

     margin-top:影响自身元素,自身元素将向对应方向偏移

    margin-left:影响自身元素,其后元素在遇到继续想左浮动直至遇到浮动元素后固定

     margin-right:对自身无影响,影响其后元素,其后元素向对应方向偏移

    margin-bottom:无影响

         两边定宽,而中间自适应的一种布局: 用到浮动、负边距、相对定位

添加样式

此时,因为container内的元素脱离文档流,footer占据原本container的文档空间,给footer添加clear属性(周围不允许浮动元素)

    .foot{ clear: both }

再利用 right 的 relative 属性,添加 

.right {    right: -50px    }     //(center因为设置width:100%将自动撑满整个中间空间)

宽度已经完成,但是当中间内容高度被撑开时

为了使高度保持一致,可使用

    等高布局(即padding补偿法,首先把列的每一个元素padding设为一个足够大的值,再把列的margin设一个与前面的padding的正值相抵消的负值,然后在父容器设置超出隐藏


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11277596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存