CSS学习【margin为负值】

news2024/9/24 19:24:09

目录

margin塌陷时合并规则

margin重叠概念

可能会发生的情况

外边距重叠计算规则

兄弟元素之间合并,都为负值

当“.box1”和“.box2”都未设置外间距时:

给“.box1”和“.box2”设置外间距后:

兄弟元素间合并,一正一负

当.box2中未设置margin属性

.box2 margin-top:-30px时

.box2 margin-top:-80px时

父子元素之间合并,都为负值

box与box1都未设置margin时

box的margin-top:-50px和box2的magin-top:-100px时

box的margin-top:-50px和box1的margin-top:-40px

父子元素之间合并,一正一负

box和box1都未设置margin时

box的margin-top:-50px与box1的margin-top:20px

box的margin-top:-50px和box1的margin-top:80px

margin负值的实践场景

1.等高布局

2.一行多列网格布局

3.头像叠加效果

4.元素水平垂直居中

5.双飞翼布局

6.圣杯布局

margin塌陷时合并规则

margin重叠概念

  • margin重叠也叫:外间距重叠、或外边距合并、或外边距穿透、或外边距塌陷
  • margin重叠只针对垂直方向,不针对水平方向

可能会发生的情况

  1. 兄弟元素之间-上下边距合并(重叠)
  2. 父子元素之间-上外边距合并(穿透)(父元素没有设置内边距和边框时才会发生合并)

外边距重叠计算规则

  1. 全部为正值,取最大值
  2. 不全是正值,则两者相加,得到的结果为最终移动距离
  3. 都为负值,则取绝对值最大的那个

兄弟元素之间合并,都为负值

margin-bottom与margin-top都为负值时,都取绝对值最大的那个

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <style>
            .container {
                width: 100px;
                height: 200px;
                border: 2px solid red;
                margin: 150px auto;
            }
            .box {
                width: 100px;
                height: 100px;
            }
            .box1 {
                background-color: pink;
                /* 下面元素向上移动 50px*/
                margin-bottom: -50px;
            }
            .box2 {
                background-color: rgb(131, 202, 229, 0.5);
                /* 元素自身向上移动80px */
                margin-top: -80px;
            }
          </style>
    <body>
        <div class="container">
                <div class="box box1"></div>
                <div class="box box2"></div>
        </div>
    </body>
</html>

当“.box1”和“.box2”都未设置外间距时:

给“.box1”和“.box2”设置外间距后:

margin上外边距与下外边距都是负值,取两者中绝对值最大的哪一个,最终以margin-top:-80px为主,.box2蓝色盒子向上移动80px

兄弟元素间合并,一正一负

margin-top与margin-bottom之间有一个负值时,两者相加,得到的结果,为最终移动距离

<style>
  .container {
    width: 100px;
    height: 200px;
    border: 2px solid red;
    margin: 150px auto;
  }
  .box {
    width: 100px;
    height: 100px;
  }
  .box1 {
    background-color: pink;
    /* 下面元素向下移动50px */
    margin-bottom: 50px;
  }
  .box2 {
    background-color: rgb(131, 202, 229, 0.5);
    /* 元素自身向上移动 30px */
    margin-top: -30px;
    /* 元素自身向上移动 80px */
    margin-top: -80px;
  }
</style>
<body>
  <div class="container">
    <div class="box box1"></div>
    <div class="box box2"></div>
  </div>
</body>

.box2中未设置margin属性

只给.box1加了一个margin-bottom:50px,故两个盒子间隔50px

.box2 margin-top:-30px时

因为box1中margin-bottom:50px是个正值,一正一负,两者相加,故两个盒子间隔为(50px - 30px = 20px)

 

.box2 margin-top:-80px时

因为box1中margin-bottom:50px是个正值,一正一负,两者相加,故两个盒子间隔为(50px - 80px = -30px),故下面元素向上移动30px

父子元素之间合并,都为负值

<style>
  .container {
    width: 200px;
    height: 200px;
    margin: 150px auto;
    border: 2px solid red;
  }
  .box {
    /* 背景颜色为黄色 */
    background-color: khaki;
    height: 130px;
    /* 元素自身向上移动50px */
    margin-top: -50px;
  }
  .box1 {
    width: 100px;
    height: 100px;
    background-color: rgb(252, 191, 201, 0.7);
    /* 元素自身向上移动40px */
    margin-top: -40px;
    /* 元素自身向上移动100px */
    margin-top: -100px;
  }
</style>
<body>
  <div class="container">
    <div class="box">
      <div class="box1"></div>
    </div>
  </div>
</body>

box与box1都未设置margin时

box的margin-top:-50px和box2的magin-top:-100px时

因为父元素box没有设置内边距和边框,故box1与父元素box外边距发生合并,又因为两者的外边距都为负值,取绝对值中最大值,则为-100px

 

box的margin-top:-50px和box1的margin-top:-40px

子元素外边距穿透父元素与父元素的外边距合并,两都为负值,取绝对值中的最大值,则为-50px

父子元素之间合并,一正一负

<style>
  .container {
    width: 200px;
    height: 200px;
    margin: 150px auto;
    border: 2px solid red;
  }
  .box {
    /* 背景颜色为黄色 */
    background-color: khaki;
    height: 130px;
    /* 元素自身向上移动50px */
    margin-top: -50px;
  }
  .box1 {
    width: 100px;
    height: 100px;
    /* 背景颜色为粉色 */
    background-color: rgb(252, 191, 201, 0.7);
    /* 元素与父元素有20px间距 */
    margin-top: 20px;
    /* margin-top:80px; */
  }
</style>
<body>
  <div class="container">
    <div class="box">
      <div class="box1"></div>
    </div>
  </div>
</body>

box和box1都未设置margin时

box的margin-top:-50px与box1的margin-top:20px

子元素外边距穿透父元素外边距合并,两者当中有一个值是负数,相加后的结果为最终外边距,即(-50 + 20 = -30px)

box的margin-top:-50px和box1的margin-top:80px

一正一负,最终外边距为两者相加,即(-50 + 80 = 30px)

 

margin负值的实践场景

1.等高布局

不管左边蓝色盒子中内容多少,其高度都会随着右边的粉色盒子变高的效果

        <style>
            .box {
              width: 520px;
              border: 2px solid red;
              overflow: hidden;
            }
            /* 清除浮动 */
            .clearfix::after {
              display: block;
              content: "";
              clear: both;
            }
            .left {
              width: 200px;
              float: left;
              background-color: skyblue;
              /* 内边距2000px使盒子高度变高 */
              padding-bottom: 2000px;
              /* 底外边距-2000px,抵消内边距2000px产生的占位 */
              margin-bottom: -2000px;
            }
            .right {
              width: 300px;
              background-color: pink;
              float: right;
            }
          </style>
          <body>
            <div class="box clearfix">
              <!-- 左边 -->
              <div class="left">12345678978989</div>
              <!-- 右边 -->
              <div class="right">
                <p>1</p>
                <p>2</p>
                <p>3</p>
                <p>4</p>
                <p>5</p>
                <p>6</p>
                <p>7</p>
                <p>8</p>
                <p>9</p>
                <p>10</p>
              </div>
            </div>
          </body>

效果图:

2.一行多列网格布局

        <style>
            body,
            ul {
              margin: 0;
            }
            ul {
              list-style: none;
              padding: 0;
              /* 多余留1px,用来给第一个li的左边框  */
              /* ul是li的父元素,li的margin-left=-1px 两者发生外边距合并 */
              /* 一正一负时 外间距为两者相加 故第一个li不需要移动*/
              margin-left: 1px;
            }
            .box {
                /* 四个li+五个边框的总宽度 */
                width: 801px;
                height: 200px;
                margin: 50px auto;
            }
            ul li {
                /* 四个li的高度为796加上五个竖直边框各1px共801px */
                width: 199px;
                /* 高度加两个上下边框的高度 共198 + 2 = 200px */
                height: 198px;
                border: 1px solid red;
                /* 使用浮动顺序排列 */
                float: left;
                /* 使元素自身向左移动1px,用来覆盖掉前面元素的右边框线 */
                margin-left: -1px;
            }
          </style>
          <body>
            <div class="box">
              <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
              </ul>
            </div>
          </body>

效果图:

3.头像叠加效果

        <style>
            .head {
              height: 100px;
              /* 去掉行内块元素间默认的空白间隙 */
              font-size: 0;
              /* 内容水平居中显示 */
              text-align: center;
              line-height: 100px;
              background-color: aquamarine;
            }
            .head > span {
              display: inline-block;
              border: 4px solid #fff;
              width: 50px;
              height: 50px;
              /* background-color: skyblue; */
              /* 弧度比img大2px 用来显示头像的外边框 */
              border-radius: 52px;
              /* 垂直居中对齐 配合父元的line-height:50px */
              vertical-align: middle;
              /* 元素向左移动20px */
              margin-left: -20px;
            }
            .head > span > img {
              width: 100%;
              height: 100%;
              border-radius: 50%;
            }
          </style>
          <body>
            <div class="head">
              <span><img src="https://tse4-mm.cn.bing.net/th/id/OIP-C.PobTVuzuQy7tAZtvVEc3VQAAAA?rs=1&pid=ImgDetMain" alt="" /></span>
              <span><img src="https://tse4-mm.cn.bing.net/th/id/OIP-C.TIElyUlFJsyKMKJXgSlixAAAAA?rs=1&pid=ImgDetMain" alt="" /></span>
              <span><img src="https://tse4-mm.cn.bing.net/th/id/OIP-C.HVdWPbF8w9RDzR_VFdskegAAAA?rs=1&pid=ImgDetMain" alt="" /></span>
              <span><img src="https://ts1.cn.mm.bing.net/th/id/R-C.3c5f60c6c0ecdf2830c6512752e8846e?rik=9Ndhdvf8by89og&riu=http%3a%2f%2fimg.keaiming.com%2fuploads%2fallimg%2f2020081714%2fpp2ql1hdf0y.jpg&ehk=VkqIRMgwnATNbM0hzt%2bzsoGVL%2f17ZnbmRhylWl3r5z4%3d&risl=&pid=ImgRaw&r=0" alt="" /></span>
            </div>
          </body>

效果图:

4.元素水平垂直居中

方法很简单,先利用绝对定位让元素的左侧和顶部分别与父元素垂直和水平中间对齐,然后再利用margin负值,让元素向上和向左各移动自身宽度/高度的一半

 

        <style>
            .father {
                position: relative;
                width: 300px;
                height: 300px;
                background-color: aqua;
            }
            .son {
                position: absolute;
                left: 50%;
                top: 50%;
                width: 100px;
                height: 100px;
                background-color: blueviolet;
                margin-left: -50px;
                margin-top: -50px;
            }
          </style>
          <body>
            <div class="father">
                <div class="son"></div>
            </div>
          </body>
</html>

效果图:

5.双飞翼布局

两边内容固定,中间内容自适应

<style>
  body {
    margin: 0;
  }
  .fl {
    float: left;
  }
  .main {
    background-color: #ddd;
    width: 100%;
  }
  .main .main-content {
    background-color: skyblue;
    height: 300px;
    /*核心代码*/
    margin: 0 200px 0 200px;
  }
  .left {
    width: 200px;
    height: 300px;
    background-color: coral;
    /*核心代码*/
    margin-left: -100%;
  }
  .right {
    width: 200px;
    height: 300px;
    background-color: tomato;
    /*核心代码*/
    margin-left: -200px;
  }
</style>
<body>
  <div class="main fl">
    <div class="main-content">中间</div>
  </div>
  <div class="left fl">左边</div>
  <div class="right fl">右边</div>
</body>

效果图:

给左边的div一个“margin-left:-100%”,使其移动的距离等于中间div的宽度,因此左div被拉到中间div的左侧,再给右边的div一个“margin-right:-200px”,使其移动的距离等于自身的宽度,因此右div也被拉到第一行

6.圣杯布局

相较于双飞翼布局,添加了顶部导航栏和页脚

<style>
  body {
    margin: 0;
    /*核心代码*/
    min-width: 650px;
  }
  /* 清除浮动 */
  .clearfix::after {
    display: block;
    content: "";
    clear: both;
  }
  .fl {
    float: left;
  }
  .header {
    height: 100px;
    background-color: tomato;
  }

  .container {
    padding-left: 200px;
    padding-right: 250px;
  }
  .container .center {
    width: 100%;
    height: 300px;
    background-color: skyblue;
  }
  .container .left {
    width: 200px;
    height: 300px;
    background-color: cadetblue;
    /*核心代码*/
    margin-left: -100%;
    position: relative;
    left: -200px;
  }
  .container .right {
    width: 250px;
    height: 300px;
    background-color: aquamarine;
    /*核心代码*/
    margin-right: -250px;
  }
  .footer {
    height: 100px;
    background-color: #000;
  }
</style>
<body>
  <div class="header">头部</div>
  <div class="container clearfix">
    <div class="center fl">中间</div>
    <div class="left fl">左边</div>
    <div class="right fl">右边</div>
  </div>
  <div class="footer">底部</div>
</body>

效果图:

body中的min-width计算如下:

(left和right的自身宽度 + left的额外偏移距离即200px)

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

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

相关文章

深入解析SSRF和Redis未授权访问

深入解析SSRF和Redis未授权访问&#xff1a;漏洞分析与防御 在网络安全领域&#xff0c;服务器端请求伪造&#xff08;SSRF&#xff09; 和 Redis未授权访问 是两类常见且危险的安全漏洞。 1.2 SSRF攻击的利用 1.2.1 测试并确认SSRF漏洞 一个典型的例子是&#xff0c;当应用…

迭代器的失效问题

vector的插入与删除 我们首先举例说明vector插入和删除操作返回的是什么迭代器 void print(std::vector<int>& vec) {for(auto itvec.begin();it!vec.end();it)std::cout<<*it<<" ";std::cout<<std::endl; }void test() {/*初始化vect…

Simple RPC - 07 从零开始设计一个服务端(下)_RPC服务的实现

文章目录 PreRPC服务实现服务注册请求处理 设计&#xff1a; 请求分发机制 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现异步网络通信 Simple RPC - 04 从零开始设计一个客户端&#…

【数据结构】堆主要的应用场景

1. 堆排序 所谓堆排序&#xff0c;就是在堆的基础上进行排序。 在讲解堆排序之前&#xff0c;让我们先来回顾一下堆的概念&#xff0c; 1.1 大根堆和小根堆 堆是一种完全二叉树&#xff0c;它有两种形式&#xff0c;一种是大根堆&#xff0c;另外一种是小根堆。 大根堆&…

2023年看过的电影和电视剧

2023年看过的电影 2023年12月21日&#xff1a;三大队 评价&#xff1a;感觉结尾不太突出&#xff0c;但是值得一看。 2023年10月02日&#xff1a;志愿军&#xff1a;雄兵出击 评价&#xff1a;感觉还行&#xff0c;场面还不错。但是记不得太多情节。 2023年08月31日&#xf…

如何将 Parallels Desktop 许可证密钥移至新的 Mac?

根据 Parallels 最终用户许可协议&#xff08;EULA&#xff09;的规定&#xff0c;您最多可以在一台设备上下载、安装和使用 Parallels Desktop 的一个原始副本。但是面对更换新机的用户&#xff0c;可以通过迁移的方式把 Parallels Desktop 许可证密钥移至新的 Mac&#xff0c…

跟《经济学人》学英文:2024年08月24日这期 What to make of America’s topsy-turvy economy

What to make of America’s topsy-turvy economy Don’t panic just yet topsy-turvy&#xff1a;颠倒的&#xff1b;混乱的&#xff1b;乱七八糟的&#xff1b; make of&#xff1a;理解&#xff1b;认为&#xff1b;看待 Make of: 这里的 “make of” 意思是如何理解或解释…

自来水厂供水监控的串口服务器应用

随着城市化进程的加快和人口的不断增长&#xff0c;自来水厂作为城市供水系统的核心组成部分&#xff0c;其稳定性和安全性对于城市的正常运行和居民的生活质量至关重要。传统的供水监控系统存在数据传输效率低、维护成本高、实时性差等问题&#xff0c;难以满足现代城市对供水…

TMDOG的微服务之路_08——使用Docker部署NestJS微服务

TMDOG的微服务之路_08——使用Docker部署NestJS微服务 博客地址&#xff1a;TMDOG的博客 在上一篇博客中&#xff0c;我们探讨了如何使用 NestJS 创建一个简单的微服务架构。为了将这些微服务部署到生产环境&#xff0c;我们可以使用 Docker 来打包和管理这些服务。本篇博客将…

Docker 数据卷的使用

Docker 数据卷的使用 文章目录 Docker 数据卷的使用导引1. 创建数据卷2. 查看创建的数据卷3. 查看数据卷的详细信息 导引 在Docker中&#xff0c;我们在创建并运行容器后&#xff0c;可以通过exec命令进入容器内部进行操作&#xff0c;但会发现一些命令是无法使用的&#xff0…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]pigpig

题目&#xff1a; 根据题目名字和附件名提示&#xff0c;猜测为猪圈密码&#xff0c;对应手动解码 whenthepigwanttoeat

持久层接口开发

通常一个接口定义后&#xff0c;从持久层开始开发。 对于一个新模块需要使用工具生成模型类、mapper接口、mapper映射文件等&#xff0c;下边介绍一个工具用于自动生成代码。 1. 代码生成工具 1.1 安装插件 1.2 重启IDEA&#xff0c;连接mysql 1.3 配置代码生成规则 点击“c…

C++容器之字符串的详解

每日诗词&#xff1a; 我见青山我妩媚&#xff0c;料青山见我应如是。 ——《贺新郎甚矣吾衰矣》【宋】辛弃疾 目录 补漏&#xff1a; vector在分配新内存块后如何进行元素复制 正文&#xff1a; 字符串变量和常量 字符串变量&#xff1a; 解析&#xff1a; 字符串常量…

揭露 Sapiens:未来以人为中心的视觉任务

Sapiens | Meta Meta Reality Labs 隆重推出 Sapiens&#xff0c;这是一个尖端的模型系列&#xff0c;专为四种以人为中心的基本视觉任务而设计&#xff1a;二维姿态估计、身体部位分割、深度估计和表面法线预测。 我们的 Sapiens 模型可无缝处理 1K 高分辨率推理&#xff0c…

加州大学圣地亚哥分校 沉浸式遥操作机器人系统

想象一下&#xff0c;在VR中控制游戏角色时&#xff0c;你的手部动作能够无缝转化为角色的行动。如果将这种体验应用于现实世界中的双手机器人控制&#xff0c;将带来革命性的人机交互体验。随着Apple Vision Pro的问世&#xff0c;这一设想逐渐变为现实。然而&#xff0c;将这…

Velocity模板引擎——若依代码生成器

文章目录 快速入门准备模板数据填充运行代码 基础语法简单类型的变量获取对象类型的变量获取基础语法-循环基础语法—if判断 官网 比较擅长用于邮件&#xff0c;发票&#xff0c;web内容生成、代码生成、网页静态化 模板化的东西适合使用 当然模板引擎不止这一种&#xff0c;还…

记录|C# winform——Chart控件

目录 前言一、重点关注1.1 Chart控件效果1.2 属性1.2.0 位置讲解1.2.1 Titles——标题集合TextToolTip 1.2 .2 Series——图表序列ChartTypeLegends——图例集合 二、数据传入Chart控件2.1 如何传入数据&#xff1f;2.2 如果想限定每次展现的数据量怎么办&#xff1f; 三、标注…

主机安全-网络攻击监测

目录 概述暴力破解&#xff08;SSH爆破为例&#xff09;原理规则攻击模拟告警 端口扫描原理规则攻击模拟告警 流量劫持原理规则攻击模拟告警 参考 概述 本文介绍主机网络层面上的攻击场景&#xff0c;每种攻击场景举一个例子。监测方面以字节跳动的开源HIDS elkeid举例。 针对…

【2】搭建雅特力AT32F437ZMT OpenHarmony轻量系统开发环境

本文用于阐述如何搭建AT32F437ZMT OpenHarmony轻量系统开发环境开源组织地址&#xff1a;https://gitee.com/AT32437_OpenHarmony 1.AT-START-F437雅特力官方开发板相关资料 移植基于at32f437雅特力官方开发板AT-START-F437 AT-START-F437雅特力官方开发板相关资料 2.AT32F43…

采用不高于3次的勒让德多项式拟合原函数

利用勒让德多项式进行拟合的区域是[-1,1]&#xff0c;如果不是这个区域&#xff0c;比如是[a,b]&#xff0c;利用转化到[-1,1]。 参考以下例题计算系数 C语言代码如下 //用三阶的勒让德多项式进行拟合 #include<math.h> #include<stdio.h> #include "main.c…