CSS——对position定位和margin-top的理解

一、常见定位方式

1.positon:absolute (脱离文档流)

  生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位 (这里的父元素是指定位方式为relative和absolute的父元素)。 如果一直没找到 relative或者absolute定位的第一个父元素,则父元素为body。  绝对定位元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

2.positon:fixed(脱离文档流)

  生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

3.position:relative(未脱离文档流,正常位置仍在)

  生成相对定位的元素,相对于其文本流原始正常位置进行定位。例如,"left:20px" 会使元素相对于原始正常位置向左移动20像素。

比如:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            /* 保证body充满整个页面 */
            html,body{
                width: 100%;
                height: 100%;
                /* 设置所有外边距属性为0 */
                margin: 0;
                padding: 0;
            }
            .a {
                width:100px;
                height:100px;
                background-color: red;
            }
            .b {
                width:50px;
                height:50px;
                background-color: green;
            /*                 position: relative;
                top: 20px; */
            }
        </style>
    </head>
    <body>
        <div class="a"></div>
        <div class="b"></div>
    </body>
</html>

结果:

把上面代码中的 下面两行代码 的注释去掉,

position: relative;
top: 20px;

结果:

再比如:在上面的代码中,再加入一个div

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            /* 保证body充满整个页面 */
            html,body{
                width: 100%;
                height: 100%;
                /* 设置所有外边距属性为0 */
                margin: 0;
                padding: 0;
            }
            .a {
                width:100px;
                height:100px;
                background-color: red;
            }
            .b {
                width:50px;
                height:50px;
                background-color: green;
                position: relative;
                top: 20px;
            }
            .c {
                width:50px;
                height:50px;
                background-color: yellow;    
            }
            
        </style>
    </head>
    <body>
        <div class="a"></div>
        <div class="b"></div>
        <div class="c"></div>
    </body>
</html>

结果:

结论:可以看出,class='b'的div设置为relative后,并没有脱离文档流,该div在文档流中的原始位置仍然存在。因此在加了class='c'的div块后,class='a'的div和class='c'的div之间的空隙就是class='b'的div大小,设置为relative的class='b'的div并没有脱离文档流,原始位置依然存在,占了一定空间。

4.position:static

  默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。

二、margin-top的理解

  margin-top意思是设置元素的上外边距,这个很好理解,但是在实际使用过程中,却有一些新的理解体会。

1.给div1内部的div2设置一个margin-top,结果它的父级div1跟着div2一起下移了。或者给一个div1设置一个margin-top,不给div1内部的div2设置margin-top,结果div2跟着div1一起下移了。

如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            /* 保证body充满整个页面 */
            html,body{
                width: 100%;
                height: 100%;
                /* 设置所有外边距属性为0 */
                margin: 0;
                padding: 0;
            }
            .a {
                width:100px;
                height:100px;
                background-color: red;
                margin-top: 200px;
            }
            .b {
                width:50px;
                height:50px;
                background-color: green;
            }
        </style>
    </head>
    <body>
        <div class="a">
            <div class="b"></div>
        </div>
        
    </body>
</html>

结果:

将上面代码中div嵌套顺序换一下,发现仍然是整体下移。

<div class="b">
    <div class="a"></div>
</div>

结果:

这里只是因为class="b"的div更小,被class="a"的div覆盖了,所以会看不到绿色div(其实是藏在红色div下)。

2.两个同级元素div1和div2(先div1再div2),给div1设置一个margin-top,结果div1和div2整体一起向下移动。(当div1在div2后面,给div1设置一个margin-top,不会出现两个div整体下移情况)。

这里不再举例说明

3.毗邻的两个兄弟元素之间的外边距会塌陷。

如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>测试</title>
        <style>
            html,body{
              margin:0;
              padding:0;
            }
            .div1{
              width:400px;
              height:200px;
              background:red;
              margin-bottom:100px;
            }
            .div2{
              width:400px;
              height:200px;
              background:yellow;
              /* margin-top:200px; */
            }
        </style>
    </head>
    <body>
      <div class='div1'></div>
      <div class='div2'> </div>
    </body>
</html>

结果:

当把 /* margin-top:200px; */注释取消后,即:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>测试</title>
        <style>
            html,body{
              margin:0;
              padding:0;
            }
            .div1{
              width:400px;
              height:200px;
              background:red;
              margin-bottom:100px;
            }
            .div2{
              width:400px;
              height:200px;
              background:yellow;
              margin-top:200px; 
            }
        </style>
    </head>
    <body>
      <div class='div1'></div>
      <div class='div2'> </div>
    </body>
</html>

结果:

分析:按照预期猜想的,应该是红色div1的margin-bottom与黄色div2的margin-top叠加,最终使得两个div的间隔为300px。但是我们看到,最终结果却是200px,显然不是叠加和。这是因为毗邻的两个兄弟元素之间的外边距会塌陷,相邻的两个兄弟元素之间的外边距会取两者之间的最大值进行合并。由于100px小于200px,所以最终显示的是200px的外边距!

注:

①margin的值为百分数时,其值是基于父元素的宽度的百分比的外边距(padding也是如此,当其为百分数时,其值是基于父元素的宽度的百分比的内边距)。比如 margin-top:10%,是按照父亲宽度的10%计算,而不是父亲高度的10%。

②以上的情况的position是relative或者static,对于absolute结果会有些变化,尝试了一下,设置为absolute(或者设置float,比如float:right)会使margin-top独立,不会共享。

关于对margin合并的更多细节,可参考:margin合并 - 简书

结论:所有毗邻的两个或更多盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级(按顺序,前面的设置margin,后面的会共享margin)或者嵌套(没有顺序,子元素或者父元素任意一个设置margin,所有元素都会共享margin)的盒元素,并且它们之间没有非空内容、Padding或Border分隔。

### 回答1: "layout_marginTop" 是一个 Android 开发中的属性,用于设置视图(View)上边缘与其父容器(Parent)上边缘之间的距离,单位为像素(px),例如: ``` android:layout_marginTop="16dp" ``` 这表示将视图的上边缘与其父容器的上边缘之间的距离设置为 16dp。在布局中,还有类似的属性,如:`layout_marginLeft`、`layout_marginRight`、`layout_marginBottom` 等,用于设置视图与父容器的其他边缘之间的距离。 ### 回答2: layout_marginTop 是 Android 布局中的一个属性,表示控件与其上方控件或父容器之间的距离。 在 Android 的布局中,通过 XML 文件来定义界面的布局结构。layout_marginTop 是其中的一个属性,用于设置控件的上边距。 假设我们有一个 LinearLayout 容器,其中包含了两个 TextView 控件,那么我们可以通过设置 layout_marginTop 属性来调整它们之间的间距。 例如,我们可以在第二个 TextView 控件上添加 layout_marginTop 属性,并设置一个具体的数值来控制与上方控件的距离。如果我们设置 layout_marginTop="20dp",那么第二个 TextView 将与上方的控件间距为 20dp。 如果我们将 layout_marginTop 属性设置为负值,例如 layout_marginTop="-10dp",那么第二个 TextView 将会与上方控件重叠。 另外,layout_marginTop 也可以与其他的 margin 属性一起使用,例如 layout_marginLeft、layout_marginRight、layout_marginBottom,通过这些属性的组合设置,我们可以非常灵活地控制控件之间的间距和位置。 总而言之,layout_marginTop 是 Android 布局中的一个重要属性,用于设置控件与其上方控件或父容器之间的距离,通过合理设置该属性,我们可以实现个性化的布局效果。 ### 回答3: layout_marginTop是Android中的一个属性,表示控件与其父布局顶部的距离。它可以用来调整控件在垂直方向上的位置。 在Android中,布局文件中的控件需要放置在父布局中,父布局可以是LinearLayout、RelativeLayout等。通过设置layout_marginTop属性,可以控制控件与父布局顶部的距离。 layout_marginTop属性接受一个数字值,表示距离的大小。正值表示控件与顶部的距离增加,负值表示距离减少。例如,如果将layout_marginTop设置为20dp,则控件与父布局顶部的距离将增加20dp。 通过合理设置layout_marginTop属性,可以实现不同控件在垂直方向上的对齐、分布等布局效果。比如,将两个控件的layout_marginTop属性设置为相同的值,可以使它们在垂直方向上对齐;将一个控件的layout_marginTop属性设置为正值,另一个控件的layout_marginTop属性设置为负值,可以使它们在垂直方向上互相依赖。 总之,layout_marginTop属性是Android布局中用于调整控件与父布局顶部距离的属性,通过设置它的值,可以实现各种垂直方向上的布局效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值