CSS | CSS中强大的margin负边距

news2024/11/27 10:35:50

css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果。很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的。本文非常基础,老鸟可以略过。

一、负边距对元素宽度的影响

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

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

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

<!DOCTYPE html>
<html>
  <head>
    ​
    <style>
      .container {
        width: 400px;
        height: 200px;
        margin: 0 auto;
        background-color: antiquewhite;
      }
      .item {
        width: auto;
        height: 100px;
        background-color: #666666;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <div class="item">我是一个没有心的杀手</div>
    </div>
  </body>
</html>

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

<!DOCTYPE html>
<html>
  <head>
    ​
    <style>
      .container {
        width: 400px;
        height: 200px;
        margin: 0 auto;
        background-color: antiquewhite;
      }
      .item {
        width: auto;
        height: 100px;
        margin-right: -100px;
        background-color: #666666;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <div class="item">我是一个没有心的杀手</div>
    </div>
  </body>
</html>

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

<!DOCTYPE html>
<html>
  <head>
    ​
    <style>
      .container {
        width: 400px;
        height: 200px;
        margin: 0 auto;
        background-color: antiquewhite;
      }
      .item {
        width: auto;
        height: 100px;
        margin-left:-100px;
        margin-right: -100px;
        background-color: #666666;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <div class="item">我是一个没有心的杀手</div>
    </div>
  </body>
</html>

我们看到它变得更宽了。

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

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

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>浮动两端对齐</title>
  <style type="text/css">
    ul,
    li {
      margin: 0;
      padding: 0;
    }

    h2 {
      clear: both;
      font-size: 1.2em;
    }

    .justify {
      width: 320px;
      /* 1行3个li,li之间距离10px = 100px*3 + 10px*2 */
      overflow: hidden;
      margin: 10px;
      border: 1px solid #999999;
    }

    .justify ul {
      width: 330px;
      /* 可容纳下3列的宽度 */
      margin-bottom: -10px;
      /* 隐藏掉最下面一行的margin-bottom */
      overflow: hidden;
      zoom: 1;
      /* 触发IE的Layout */
    }

    *+html .justify ul {
      margin-bottom: 0;
      /* 针对IE7中最后1行li的margin-bottom失效 */
    }

    .justify li {
      display: inline;
      float: left;
      list-style: none;
      width: 100px;
      height: 100px;
      margin: 0 10px 10px 0;
      background: #EEEEEE;
    }

    .margin ul {
      width: auto;
      margin: 0 -10px -10px 0;
    }

    .col-2 {
      width: 210px;
    }

    .col-4 {
      width: 430px;
    }
  </style>
</head>

<body>
  <div>
    <a href="http://www.ddcat.net/blog/?p=1199" title="回到猫窝Blog">回到猫窝Blog</a>
  </div>
  <h1>浮动两端对齐</h1>
  <h2>ul定宽</h2>
  <div class="justify">
    <ul>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
    </ul>
  </div>
  <h2>ul使用负margin值</h2>
  <div class="justify margin">
    <ul>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>中间</li>
      <li>靠右边</li>
    </ul>
  </div>
  <h2>两列</h2>
  <div class="justify margin col-2">
    <ul>
      <li>靠左边</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>靠右边</li>
      <li>靠左边</li>
      <li>靠右边</li>
    </ul>
  </div>
  <h2>四列</h2>
  <div class="justify margin col-4">
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
    </ul>
  </div>
  <div>
    <a href="http://www.ddcat.net/blog/?p=1199" title="回到猫窝Blog">回到猫窝Blog</a>
  </div>
</body>

</html>

div元素:<div class="justify margin"> 

 div>ul元素:

.margin ul {
    width: auto;
    margin: 0 -10px -10px 0;
}

一个负的margin-right,相当于把ul的宽度增加了10px。

二、负边距对浮动元素的影响

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

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .item {
      float: left;
      width: 100px;
      height: 100px;
      /* margin-right:-50px;  */
    }

    .d1 {
      background-color: #0099fe;
    }

    .d2 {
      background-color: #996633;
    }

    .d3 {
      /* margin-left:-80px; */
      background-color: #ff6633;
    }
  </style>
</head>

<body>
  <div class="item d1">元素1</div>
  <div class="item d2">元素2</div>
  <div class="item d3">元素3</div>
</body>

</html>

以上代码是三个向左浮动的元素,宽高都是100px:如下图

现在把它们都设一个 margin-right:-50px;  然后会变成这样子:我们看到后面的元素叠到了前面的元素上。

我们注释掉 margin-right:-50px; 接着,我们把浏览器逐渐缩小,然后因为宽度不够,元素3掉下来了。

我们给元素3设一个margin-left:-80px;看看会怎么样:如下图所以,这时我们看到元素3上去了,而且还覆盖了元素2的一部分。

继续把元素3的 margin-left:-80px 设为 margin-left:-100px,这时元素3完全覆盖住了元素2。

当把元素3设为:margin-left:-200px时:我们看到元素3继续向左移动并覆盖住了元素1。

我们继续,当把元素3设为:margin-left:-250px时:我们看到元素3继续向左移动50px,也就是说目前已经跑出了浏览器外50px。是的,你没看错,它跑出了浏览器之外!

现在想必大家都明白了负边距对浮动元素位置的影响了吧。所以那些说得很好听的什么圣杯布局、双飞翼布局什么的,都是利用这个原理实现的。就是某个元素虽然是在网页布局结构上把代码写在了后面,但可以通过负边距让它在浏览器显示的时候展示在其他元素前面。——关于实例可参看文章:CSS | CSS实现两栏布局和三栏布局方法详解中关于实现三栏布局中负margin的使用。

三、负边距对绝对定位元素的影响

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

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      padding: 0;
      margin: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: #f00;
      position: absolute;
      left: 50%;
      top: 50%;
      /* 向左移动div元素宽度的一半 */
      margin-left: -50px;
      /* 向上移动div元素高度的一半 */
      margin-top: -50px;
    }
  </style>
</head>

<body>
  <div>我是一个div</div>
</body>

</html>

看下效果:

但该方法的缺点是必须要知道要居中元素的高度和宽度。

参考资料:

CSS双飞翼布局和圣杯布局margin-left:-100% - CSDN博客

CSS圣杯布局中margin-left:-100%的含义 - 简书

理解margin-left:-100% - 紫色,风铃 - 博客园

圣杯布局中对left盒子设置margin:-100%的一点解释

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

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

相关文章

【宽搜】3. leetcode 515 在每个树行中找最大值

1 题目描述 题目链接&#xff1a;在每个树行中找最大值 2 题目解析 根据题目描述&#xff0c;是找出每一行中的最大值&#xff0c;这毋庸置疑是使用宽度优先遍历了。我在这篇文章中讲解了宽度优先遍历的模板&#xff0c;如果没有看的同学可以先去看一下。 这道题和模板的不…

基于微信小程序的调查问卷管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

数据结构与算法(七)静态链表

目录 前言 一、静态链表的引入 二、线性表的静态链表存储结构 三、静态链表的插入操作 四、静态链表的删除操作 五、静态链表的优缺点总结 1、优点 2、缺点 3、小结 六、单链表小结——Tecent面试题 1、普通解法&#xff1a; 2、高级解法&#xff1a; 前言 静态链表…

基于CAN总线的TMS320F28335 Bootloader设计说明

1 设计目的 根据客户要求&#xff0c;开发一款基于CAN总线的TI公司TMS320F28335 DSP&#xff08;数字信号处理器&#xff09;bootloader&#xff0c;以方便应用程序的刷写。CAN设备采用周立功CAN卡&#xff08;USBCAN-I、USBCAN-II、USBCAN-E-mini&#xff09;。 2 专有信息 …

一篇文章吃透OA系统

一、OA系统是什么&#xff0c;都有什么功能&#xff1f; OA系统&#xff08;Office Automation System&#xff09;是办公自动化系统的简称&#xff0c;是一种利用计算机技术和网络通信技术&#xff0c;为企业和组织提供办公管理和协作支持的信息化系统。OA系统旨在提高办公效…

讯飞星火编排创建智能体学习(五):变量和文本拼接

引言 在讯飞星火编排创建智能体学习&#xff08;四&#xff09;&#xff1a;网页读取-CSDN博客中&#xff0c;我介绍了如何用网页读取功能从网上搜索车次信息。其中&#xff0c;我使用用大模型节点从文本中提取车次并合成了所需要的URL&#xff0c;今天介绍一下如何用变量和文…

win7怎么禁用驱动强制数字签名?win7驱动程序强制数字签名禁用方法

在Windows 7 64位操作系统中&#xff0c;安装驱动程序时可能会遇到“数字签名”的问题&#xff0c;这是微软为了确保驱动程序的安全性和可靠性而引入的一项安全机制。本文将深入探讨这个问题&#xff0c;并提供有效的解决方案。 理解数字签名的概念是至关重要的。数字签名是一…

LabVIEW机床加工监控系统

随着制造业的快速发展&#xff0c;机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题&#xff0c;开发了一种基于LabVIEW的机床加工监控系统&#xff0c;通过实时监控机床状态&#xff0c;改进生产流程&am…

新闻推荐系统:Spring Boot的架构优势

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

详解JavaScript函数属性、方法和构造函数

函数属性、方法和构造函数 JS中&#xff0c;函数是值&#xff0c;对函数执行typeof运算会返回function&#xff0c;但是函数是JS中特殊的对象&#xff0c;也可以拥有属性和方法。 length属性 函数体里面&#xff0c;arguments.length表示传入函数的实参个数&#xff0c;而函…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第2关---8G 显存玩转书生大模型 Demo

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV18x4y147SU/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/rea…

数据结构与算法——Java实现 29.优先级队列

事缓则圆&#xff0c;人缓则安 —— 24.10.5 一、优先级队列 优先级队列 一端进&#xff0c;另一端出 按优先级出队 普通队列 一端进&#xff0c;另一端出 先进先出FIFO 二、无序数组实现 Type parameters…

IIOT工业物联网的标准与互操作性—SunIOT

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 工业物联网&#xff08;IIoT&#xff09;正以惊人的速度重塑着工业领域的生产方式、运营模式和价值创造。然而&#xff0c;要实现工业物联网的广泛应用和充分发挥…

qt cmake自定义资源目录,手动加载资源(图片, qss文件)

1. 目录创建 因为使用非qtcreator或者自定义工程结构就没法自动加载图标&#xff0c;所以需要手动加载&#xff0c;这里使用vscode和自定义工程结构 vscode qt 环境搭建&#xff1a; https://blog.csdn.net/qq_51355375/article/details/140733495 qt 自定义工程结构参考(因使…

js chrome devtools 调试技巧

笔记 这一篇&#xff0c; 需要慢慢补充。 1. console 控制台 $0, 查看当前选中的元素getEventListener($0) 当前元素&#xff0c;包含的监听事件 老哥留步&#xff0c;支持一下。

高级I/O

目录 一、I/O概念 1.1、OS 如何得知外设中有数据可读取&#xff1f; 1.2、OS 如何处理从网卡中读取到的数据包&#xff1f; 二、五种I/O模型 2.1、阻塞I/O 2.2、非阻塞I/O 2.3、信号驱动 IO 2.4、IO 多路转接 2.5、异步 IO 三、高级I/O 3.1、同步通信 VS 异步通信 …

YOLO11改进|卷积篇|引入全维动态卷积ODConv

目录 一、【ODConv】全维动态卷积1.1【ODConv】卷积介绍1.2【ODConv】核心代码 二、添加【ODConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【ODConv】全维动态卷积 1.1【ODConv】卷积介绍 ODConv利用一种全新的多维注意力机…

12.1 Linux_进程间通信_管道

概述 什么是无名管道&#xff1a; 无名管道就是在内核中开辟了一块内存&#xff0c;进程1和进程2都可以访问这一块空间&#xff0c;从而实现通信。 当无名管道被创建时&#xff0c;父进程fd[0]指向管道的读端&#xff0c;fd[1]指向管道的写端。fork创建子进程后&#xff0c;…

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示&#xff1a;本篇讲解人员管理模块的开发的预备工作&#xff0c;包括需求分析、生成代码、…

点亮一个LED以及按键控制

目录 前言 LED 1.LED介绍 2.LED原理图 3.如何实现发光 按键 1.按键原理图 2.按键原理 按键控制LED 1.代码实现 2.软件消除抖动 软件消除抖动的原因 软件消抖如何实现 总结 前言 我们上节完成了开发环境的安装&#xff0c;本节我们就来实现我们的第一个程序吧(没安…