CSS进阶内容—浮动和定位详解

CSS进阶内容—浮动和定位详解

我们在学习了CSS的基本知识和盒子之后,就该了解一下网页的整体构成了

当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:

CSS的三种布局流派

网页布局的本质就是用CSS控制盒子的摆放来形成页面

CSS提供了三种流派来控制盒子:

  • 普通流
  • 浮动
  • 定位

所谓普通流就是我们前面所学习的内容:

  • 标签按照规定好的默认方式排序
  • 块级元素独占一行
  • 行级元素顺序排列,遇到父元素边缘换行

接下来让我们走进浮动和定位的世界

浮动

首先我们为什么需要浮动呢?

  • 我们使用浮动当然是因为一些要求我们的标准流无法完成
  • 我们使用浮动最常见的应用场景就是将多个块级元素div等并排放置
  • (纵向排列标准流,横向排列找浮动)

初见浮动

那么我们来介绍一下浮动:

  • 浮动的目的是创建浮动框,使浮动框移动至相应位置
  • 浮动会紧贴着大盒子本身或是其他浮动盒子边缘
  • float:left/right 用来控制盒子浮动在左侧还是右侧

我们给出简单的代码示例:


    浮动

        div {
            height: 100px;
            width: 200px;
            background-color: palevioletred;
            /* 我们加入一个边框,以便于更好区分两个div */
            border: 1px black solid;
            /* 这里表示开启浮动,且向左浮动 */
            float: left;
        }

浮动特性

我们再来讲解一下浮动的特性:

  1. 浮动特性会脱离标准流
  2. 脱离标准流的位置,并且盒子不再保留原本的位置
  3. 当body中有两个div,一个div带有浮动,一个div不带有浮动,那么两个盒子会处于同一位置
  4. 但带浮动的盒子会在上面,不带浮动的盒子在下面

我们给出代码示例:


    浮动特性

        .floats {
            height: 100px;
            width: 200px;
            background-color: palegoldenrod;
            float: left;
        }

        .normals {
            height: 300px;
            width: 200px;
            background-color: red;

        }

  1. 所有在同一父类的浮动元素都在一排显示且对上对齐,并且紧贴在一起(若当前页面不能完全显示,则另起一行)
  2. 浮动元素具有行内块元素的特性(有宽高,同一行,当不具备宽高时长度与内容一致)

浮动常用方法

浮动元素经常与标准流父级搭配使用:

  • 我们先采用标准流父级控制纵向框架
  • 再用浮动元素的子盒子控制这一框架内的布局

简单案例

我们通过一个简单案例展示浮动和标准流搭配产生的布局效果:

  • 案例:我们通过一个大盒子装有两个小盒子,使两个小盒子左浮动并排排序(中间没有间隙)

图片展示效果:

CSS进阶内容—浮动和定位详解

    案例

        /* 我们先设置大盒子的属性 */
        .father {
            width: 1200px;
            height: 460px;
            background-color: pink;
            margin: 0 auto;
        }

        /* 然后设置左浮动盒子 */
        .left {
            width: 230px;
            height: 460px;
            background-color: purple;
            float: left;
        }

        .right {
            width: 970px;
            height: 460px;
            background-color: skyblue;
            float: left;
        }

        left
        right

  • 案例:我们通过一个大盒子装有四个小盒子,使四个小盒子左浮动并排排序(中间有间隙)

图片展示效果:

CSS进阶内容—浮动和定位详解

    案例

        /* 我们需要做初始化设置,去除基本margin和padding,去掉li的前置style*/
        * {
            padding: 0;
            margin: 0;
        }

        li {
            list-style: none;
        }

        /* 首先设置大盒子 */
        .box {
            width: 1226px;
            height: 285px;
            background-color: pink;
            margin: 0 auto;
        }
        /* 然后我们设置小盒子 */
        .box li {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            /* 因为盒子之间有缝隙,我们用margin控制 */
            margin-right: 14px;
        }

        .box .lis {
            /* 因为四个盒子只有三个缝隙,但上文标注了四个缝隙,所以我们需要去除掉最后一个缝隙,否则最后一个盒子将会被挤出大盒子 */
            margin-right: 0;
        }

        1
        2
        3
        4

  • 案例:我们结合案例1和案例2来组合成案例3

图片效果展示:

CSS进阶内容—浮动和定位详解

    案例3

                1
                2
                3
                4
                5
                6
                7
                8

注意点

浮动布局的三个注意点:

  • 浮动和标准流父亲搭配
  • 一个元素浮动了,理论上其他兄弟元素也应该浮动
  • 浮动的盒子只会影响后面的标准流盒子(即一个盒子浮动后,对前面标准流盒子不做影响,但后面的标准流盒子会压住浮动盒子,所以只对后面标准流盒子做影响)

浮动清除

首先我们介绍一下为什么要清除浮动:

  • 因为内容不同可能导致父类盒子高度不确定,只能由子盒子来撑开父亲
  • 但是父类盒子不给高度,内部元素又都是浮动状态的话,父类盒子高度为0,就会导致后面排版错误

下面给出代码示例:


    Document

        .box {
            width: 1226px;
            background-color: pink;
            margin: 0 auto;
        }

        .ermao,.daomao {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            margin-right: 14px;
        }

        /* 当我们的box没有高度时,下面再出现其他标准流盒子,就会直接覆盖到box上导致排版错误 */
        .footer {
            height: 100px;
            background-color: black;
        }

清除浮动的本质:

  • 为了清除浮动所带来的影响
  • 当我们清除浮动之后,父类盒子会根据子类盒子来控制高度
  • 主要采用clear:left/right/both来清除其float性质

清除浮动方法:

  1. 额外标签法
  2. 在浮动末尾加上clear:both;属性
  3. 优点:通俗易懂
  4. 缺点:添加无意义标签,结构性差

我们给出代码展示:


    Document

        .box {
            width: 1226px;
            background-color: pink;
            margin: 0 auto;
        }

        .damao,.ermao {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            margin-right: 14px;
        }

        /* 在这里写下clear属性 */
        .clear {
            clear: both;
        }

        .footer {
            height: 100px;
            background-color: black;
        }

  1. 父级添加overflow
  2. 给父类添加overflow:hidden即可
  3. 优点:代码简便
  4. 缺点:无法显示溢出部分

我们给出代码示例:


    Document

        .box {
            width: 1226px;
            background-color: pink;
            margin: 0 auto;
            /* 直接给出overflow属性即可 */
            overflow: hidden;
        }

        .damao,.ermao {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            margin-right: 14px;
        }

        .footer {
            height: 100px;
            background-color: black;
        }

  1. :after伪元素法
  2. 我们目前不需要掌握确切代码意思,这种情况相当于在最后创建一个盒子并实现clear方法
.clearfix {
            *zoom: 1;
        }

        .clearfix:after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }
  • 然后给父类的class里添加clearfix即可

我们下面给出代码示例:


    Document

        .clearfix {
            *zoom: 1;
        }

        .clearfix:after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }

        .box {
            width: 1226px;
            background-color: pink;
            margin: 0 auto;
        }

        .damao,.ermao {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            margin-right: 14px;
        }

        .footer {
            height: 100px;
            background-color: black;
        }

  1. 双伪元素法:
  2. 我们目前不需要掌握确切代码意思,这种情况相当于在开始和最后创建一个盒子并实现clear方法
    .clearfix {
            *zoom: 1;
        }

    .clearfix:after {
        clear: both;
    }

    .clearfix:after,.clearfix:before {
        content: "";
        display: table;
    }
  • 然后给父类的class里添加clearfix即可

我们下面给出代码示例:


    Document

        .clearfix {
            *zoom: 1;
        }

        .clearfix:after {
            clear: both;
        }

        .clearfix:after,.clearfix:before {
            content: "";
            display: table;
        }

        .box {
            width: 1226px;
            background-color: pink;
            margin: 0 auto;
        }

        .damao,.ermao {
            width: 296px;
            height: 285px;
            background-color: purple;
            float: left;
            margin-right: 14px;
        }

        .footer {
            height: 100px;
            background-color: black;
        }

定位

首先我们为什么需要定位呢?

  • 同理,因为一些要求我们之前学习的标准流和浮动无法完成
  • 定位主要是为了让盒子自由移动并压住盒子或固定于某一位置

定位组成

定位 = 定位模式 + 边偏移

  • 定位模式:指定一个元素在文档的定位方法
  • 定位模式分为四种:
  • static 静态定位
  • relative 相对定位
  • absolute 绝对定位
  • fixed 固定定位
  • 边偏移:决定元素的最终位置
  • 边偏移也分为四个方向:
  • top,bottom,left,right

定位模式

定位模式分为四种:static relative absolute fixed

接下来让我们一一了解:

  1. static静态定位

静态定位是元素的默认定位方法,无定位的意思

语法:

选择器{ position:static;}
  • 静态定位就是按照标准流特性摆放位置,没有位偏移
  • 静态定位很少使用

  • relative 相对定位

相对定位是元素在移动位置时,是相对于原本的位置来说的

语法:

选择器{ position:relative;}
  • 它是相对于自己原本的位置进行移动
  • 它在移动之后,在标准流中仍旧占有原本的位置(即移动之后,原本位置仍旧保留,其他标准流无法占用该位置)
  • 它在移动之后,在其他位置时,属于覆盖在其他盒子之上

我们给出代码测试:


    Document

        .box1 {
            width: 100px;
            height: 100px;
            background-color: pink;
            /* 设置为relative属性,并且采用top和left进行移动 */
            position: relative;
            top: 50px;
            left: 50px;
        }

        .box2 {
            width: 100px;
            height: 100px;
            background-color: black;
        }

  1. absolute 绝对定位

绝对定位是元素在移动位置的时候,相对于它的祖先元素来说的

语法:

选择器{positon:absolute;}
  • 若无祖先元素或祖先元素无定位,则以浏览器为准进行定位
  • 若祖先元素有定位(相对定位,绝对定位都可以),则以祖先元素为定位(有定位的前提下就近原则)
  • 绝对定位的标准流位置不保留,其他标准流可以占有绝对定位的原本位置

我们下面给出代码示例:


    Document

        /* 首先我们测试无父元素,或者父元素没有定位的状况 */
        .nofather {
            height: 200px;
            width: 200px;
            background-color: black;
            /* 这种情况下会以浏览器左上角为标准 */
            position: absolute;
            top: 100px;
            left: 100px;
        }

        /* 然后我们测试有定位的孩子(若父亲没有定位,爷爷有定位,则以爷爷为准,依次类推) */
        .son {
            height: 100px;
            width: 100px;
            background-color: pink;
            /* 这种情况下会以浏览器左上角为标准 */
            position: absolute;
            top: 50px;
            left: 50px;
        }

        /* 我们创建另一个标准流,我们会发现它会覆盖在原本nofather的位置上 */
        .anthor {
            height: 200px;
            width: 200px;
            background-color: skyblue;
        }

  1. fix固定定位

固定定位是元素固定于浏览器可视区的位置,主要应用于:在浏览器页面滚动时元素位置不发生改变

语法:

选择器{position:fix;}
  • 以浏览器的可视窗口为参照点移动元素
  • 和父元素没有任何关系
  • 不随滚动条滚动
  • 固定定位不占有原有位置

fixed小技巧:

我们希望使fix内容紧贴版心右侧固定不变

那么我们就可以使fix的位置left在浏览器宽的的一半,然后设置margin-left为版心宽度的一半

我们给出代码示例:


    Document

        /* 首先我们设置一个版心box */
        .box {
            width: 800px;
            height: 1400px;
            background-color: pink;
            margin: 0 auto;
        }

        /* 然后我们设置一个fixed附属框,为fix属性 */
        .fixed {
            width: 50px;
            height: 150px;
            background-color: black;
            /* 首先设置fix属性 */
            position: fixed;
            /* 然后我们设置left为页面一半,设置margin为版心一半 */
            left: 50%;
            margin-left: 400px;
        }

  1. 粘性定位(sticky)

粘性定位可以认为使相对定位和固定定位的混合

语法:

选择器{position:sticky;}
  • 以浏览器的可视窗口为参照点移动元素(固定定位特点)
  • 粘性定位占有原先的位置(相对定位特点)
  • 需要有top,left,right,bottom中其中一个控制滞停位置才可以生效
  • 注意:有的兼容性较差,不能使用

我们下面给出代码示例:


    Document

        /* 首先设置box,让我们的页面有可拉动的空间 */
        .box {
            height: 3000px;
        }
        /* 然后我们以导航栏为例,当它位于页面最上端时(top=0),导航栏不再跟着页面滑动而滑动 */
        .nav {
            width: 200px;
            height: 100px;
            background-color: aqua;
            margin: 100px auto;
            /* 设置为粘性 */
            position: sticky;
            /* 设置滞停位置 */
            top: 0;
        }

    导航栏

子绝父相

子绝父相:

  • 父级为了限制子级,必须采用相对定位
  • 自己为了放置于任意位置且不干扰其他盒子,必须采用绝对定位

我们给出一个案例来解释子绝父相:


    案例

        * {
            padding: 0;
            margin: 0;
        }

        /* 首先我们要给父类加上定位,这里采用相对定位且不发生位置变化 */
        .box {
            position: relative;
            height: 415px;
            width: 298px;
            background-color: rgba(255, 255, 255, 0);
            margin: 100px auto;
        }

        .box img {
            width: 100%;
        }

        /* 然后我们将图片以绝对定位的方法插入并设置位置 */
        .good {
            width: 10px;
            position: absolute;
            /* 因为父亲有相对定位,所以我们只需要相对父类设置位置即可 */
            top: 10px;
            right: 20px;
        }

        .review {
            font-family: 微软雅黑;
            font-size: 14px;

            height: 70px;
            padding: 0 28px;
            margin-top: 30px;
        }

        .appraise {
            font-family: 微软雅黑;
            font-size: 12px;
            color: #b0b0b0;
            padding: 0 28px;
            margin-top: 28px;
        }

        .info {
            font-size: 14px;
            padding: 0 28px;
            margin-top: 15px;
        }

        .info em {
            font-style: normal;
            color: #ebe4e0;
            margin: 0 6px 0 15px;
        }

        .info .price {
            color: #ff6700;
        }

        快递牛,整体不错,蓝牙都可以秒连

        来自1923134的评价

        Redmi AirDots真无线蓝...|99.9元

定位叠放次序

在使用定位布局时,可能会引起盒子重叠的情况,我们需要z-index来设置叠放权重

语法:

选择器{z-index:n;}
  • 数值可以是正整数,负整数和0,默认为auto,值越大,权重越大
  • 如果属性相同,则按照书写顺序,后来者居上
  • 数字后面不能加单位
  • 只要定位的盒子才有z-index属性

我们下面给出代码示例:


    Document

        div {
            position: absolute;
            width: 200px;
            height: 200px;
        }

        .w1{
            background-color: red;
            z-index: 2;
        }

        .w2{
            background-color: green;
            left: 50px;
            top: 50px;
            z-index: 3;
        }

        .w3{
            background-color: blue;
            left: 100px;
            top: 100px;
            z-index: 1;
        }

    w1
    w2
    w3

绝对定位盒子居中方法

绝对定位盒子无法通过margin: 0 auto居中

需要采用小算法:left:50% 和 margin-left:-自身50%

我们下面给出代码示例:


    Document

        div {
            /* 首先设置自身属性 */
            height: 100px;
            width: 200px;
            background-color: black;
            /* 然后设置定位,且居中 */
            position: absolute;
            left: 50%;
            margin-left: -100px;
        }

定位特殊特性

下面我们给出一些定位特殊特性:

  • 行内元素用绝对或固定定位时:
  • 可以直接设置高宽
  • 块级元素用绝对或固定定位时:
  • 若不设置高宽,元素大小默认等于内容大小
  • 脱标的盒子不会触发外边距塌陷
  • 浮动元素和定位元素均不会触发外边距合并问题
  • 浮动元素仅压住盒子,但不会压住文字(用来完成图文环绕)
  • 绝对固定元素会将盒子和文字一并压住(用来完全覆盖)

结束语

好的,那么关于浮动和定位的知识点基本汇总完毕,希望能给你带来收获。

接下来我会介绍一些CSS的布局技巧和知识补充,希望能获得你的一些鼓励。

Original: https://www.cnblogs.com/qiuluoyuweiliang/p/16458239.html
Author: 秋落雨微凉
Title: CSS进阶内容—浮动和定位详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611282/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Centos7环境使用Mysql离线安装包安装Mysql5.7

    服务器环境:centos7 x64 需要安装:mysql5.7+ 1)检查mysql组合用户是否存在 2)若不存在,则创建mysql组和用户 对于版本选择,您可以选择以下两种方式:…

    数据库 2023年5月24日
    080
  • Question08-查询没学过”张三”老师授课的同学的信息

    * SELECT * FROM Student WHERE SID NOT IN ( SELECT DISTINCT Student.SID FROM Student , SC ,…

    数据库 2023年6月16日
    088
  • MySQL变量、流程控制和游标

    变量、流程控制和游标 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据 系统变量 变量由系统定义,属于服务器级别 […

    数据库 2023年5月24日
    067
  • 2010最危险的编程错误(转)

    网络无处不在的今天,安全问题日益严峻,攻击事件层出不穷,应该说,软件系统中代码存在安全漏洞是主要的祸因之一。而这实际上反映了软件开发人员在编程的安全性方面缺乏必要的培训和常识。 由…

    数据库 2023年6月11日
    0100
  • 为知笔记迁移到印象笔记-从入门到放弃

    最新进展 已经放弃了,目前正在逐步把笔记迁移到本地,用icloud来同步。 为什么放弃迁移? 没有找到好的迁移方案,迁移过去文档不方便查找和使用 为什么放弃印象笔记? 1.主要使用…

    数据库 2023年6月9日
    093
  • tomcat加载启动过程

    流程图 posted @2022-08-19 17:43 默念x 阅读(9 ) 评论() 编辑 Original: https://www.cnblogs.com/monianxd…

    数据库 2023年6月16日
    089
  • SpringBoot 集成 JSP

    导致我写这个博客的原因是 在SpringBoot支持的模板引擎thymeleaf 下 前台页面仅支持HTML 可能用一些其他的前端框架 1、我们首先在IDEA中搭建一个项目,搭建项…

    数据库 2023年6月9日
    0134
  • 详谈 MySQL 8.0 原子 DDL 原理

    柯煜昌 青云科技研发顾问级工程师 目前从事 RadonDB 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 文章字数 3800+,阅读时间 15 分钟 背景 My…

    数据库 2023年6月11日
    0142
  • 获取不到http请求头自定义参数

    对外提供的API,需请求方在http请求头中传app_id(下划线分割) 然后服务端通过request.getHeader(“app_id”)获取不到对应的…

    数据库 2023年6月11日
    081
  • MySQL在Linux环境下的安装、初始化、配置

    CentOS操作系统,可选择: MySQL Community Server 8.0.28 Red Hat Enterprise Linux / Oracle Linux Red …

    数据库 2023年5月24日
    092
  • 开发思想

    解决的问题:一类对象,不同对象有不同的处理 顶级接口 定义规范,面向接口编程 抽象策略 定义一套模板,不同的交给不同的策略实现 具体策略 枚举 对象标识 –具体策略 策…

    数据库 2023年6月11日
    080
  • mysqlCRUD

    查询一个段里所&#…

    数据库 2023年6月9日
    071
  • mqtt长连接报错32000

    背景 项目需要使用mqtt协议建立长连接,我是客户端,需要连上服务端同学的提供的地址;客户端使用的是paho提供的客户端sdk,如下: org.eclipse.paho org.e…

    数据库 2023年6月11日
    0122
  • MySQL主从备库过滤参数分析和测试

    测试环境: GTID的主从复制,主库(9900)——》备库(9909),存在测试库表: 9900_db1库:t1、t2、t3、t4、t5表 9900_db2库:t6、t7、t8、t…

    数据库 2023年6月16日
    072
  • MySQL之存储引擎、基本数据类型及约束条件

    一、存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,…

    数据库 2023年5月24日
    074
  • 建造者设计模式

    可以看到这个学生类的属性是非常多的,所以构造方法不是一般的长,如果我们现在直接通过new的方式去创建: 可以看到,我们光是填参数就麻烦,我们还得一个一个对应着去填,一不小心可能就把…

    数据库 2023年6月14日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球