CSS中的定位

2023-09-21 22:02:07

position 的属性与含义

CSS 中的 position 属性用于控制元素在页面中的定位方式,有四个主要的取值,每个取值都会影响元素的布局方式,它们是:

  1. static(默认值): 这是所有元素的初始定位方式。在静态定位下,元素会按照它们在文档流中的顺序依次排列,不受 top、right、bottom、left 等属性的影响。静态定位的元素无法通过 z-index 属性来改变其层叠顺序。

  2. relative 相对定位会相对于元素在文档流中的初始位置进行定位。可以使用 toprightbottomleft 属性来调整元素的位置,但元素在文档流中的位置不会改变,仍占据原来的空间。

  3. absolute 绝对定位会相对于最近的已定位(非static)祖先元素进行定位。如果没有已定位的祖先元素,那么会相对于文档的初始包含块进行定位。绝对定位会从文档流中脱离,不占据文档流空间,可以使用 toprightbottomleft 属性来控制位置,而且可以通过 z-index 属性来改变元素的层叠顺序。

  4. fixed 固定定位会相对于视口(浏览器窗口)进行定位,元素会随着页面滚动而保持在固定位置,不随滚动而移动。固定定位的元素也不占据文档流空间,可以使用 toprightbottomleft 属性来确定位置,同样可以通过 z-index 来控制层叠顺序。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body{
      margin: 0;
      padding: 0;
    }
    .top{
      position: static;
      left: 100px;
      background: red;
      width: 200px;
      height: 80px;
    }
    .parent{
      position: relative;
      top: 50px;
      left: 50px;
      width: 200px;
      height: 200px;
      background: greenyellow;
    }

    .child1{
      width: 50px;
      width: 50px;
      position: absolute;
      top: 50px;
      left: 0;
      background: blanchedalmond;

    }
    .child2{
      width: 300px;
      height: 20px;
      position: fixed;
      top: 0;
      left: 0;
      background: blueviolet;
    }
  </style>
</head>
<body>
  <div class="top">我是最上面的节点</div>
  <div class="parent">
    <div class="child1">child1</div>
    <div class="child2">child2</div>
  </div>
</body>
</html>

在这里插入图片描述

display、float、position的关系

displayfloatposition 是 CSS 中用于控制元素布局和定位的三个重要属性,它们之间有一定的关系和交互,但分别用于不同的布局和定位方式。

  1. display 属性: display 属性用于控制元素在文档流中的显示方式。它的常见取值包括 blockinlineinline-blockflexgrid 等。不同的 display 值会影响元素的布局方式。例如,block 元素会在页面上占据一整行,而 inline 元素会在同一行内排列。display 属性与 floatposition 属性通常是互斥的,即一个元素不会同时使用这三个属性来控制布局。

  2. float 属性: float 属性用于将元素浮动到其容器的左侧或右侧,以使其他元素可以环绕它。通常用于创建文本环绕图片等效果。float 属性不会使元素脱离文档流,但会影响元素的布局。当使用 float 时,其他元素可能需要通过 clear 属性来清除浮动元素的影响,以防止出现意外的布局问题。

  3. position 属性: position 属性用于控制元素的定位方式。它的常见取值包括 staticrelativeabsolutefixed。不同的 position 取值会影响元素的定位方式和是否脱离文档流。position 属性通常与 toprightbottomleft 属性一起使用,以精确定位元素。使用 position 属性时,元素的定位可以是相对于文档的初始包含块、相对于最近的已定位(非 static)祖先元素,或相对于视口(浏览器窗口)。

虽然这三个属性在控制元素的布局和定位上有一定的交互,但它们各自有不同的应用场景和目的。通常情况下:

  • display 用于控制元素的基本显示方式,如块级元素、行内元素等。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .span1, .span2{
      display: block;
      width: 100px;
      height: 50px;
      background: grey;
      margin-bottom: 20px;
    }

    .content2{
      margin-top: 50px;
    }

    .div1, .div2{
      display: inline;
      /* 设置为行内元素 宽高设置无效 */
      width: 100px;
      height: 200px;
      margin-left: 10px;
      background: gold;
    }
  </style>
</head>
<body>
  <div>
    <!-- 行内元素设置宽高无效 -->
    <span style="height: 80px;width: 100px; background: red"></span>
  </div>
  <div>
    <span class="span1">我是行内元素1</span>
    <span class="span2">我是行内元素2</span>
  </div>
  <div class="content2">
    <div class="div1">我是块级元素1</span>
    <div class="div2">我是块级元素2</div>
  </div>
</body>
</html>

在这里插入图片描述

  • float 用于创建文本环绕效果或多栏布局。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    img {
      float: left; /* 或者 float: right; */
      margin-right: 10px; /* 为了增加文字和图片之间的间距 */
      width: 50px;
      height: 50px;
    }
    .content{
      width: 150px;
      height: 200px;
    }

    /* -------------以下是多栏布局的样式---------------- */
    .column {
      width: 100%;
    }

    .column-item {
      width: 30%; /* 每栏的宽度 */
      float: left;
      background: greenyellow;
      margin-right: 2%; /* 为了增加栏目之间的间距 */
      box-sizing: border-box; /* 防止边框和填充增加宽度 */
    }

  </style>
</head>
<body>
  <!-- 文字环绕部分 -->
  <div class="content">
    <img src="./image.jpg" alt="图片">
    <p>
      这是一段文本,会围绕在图片周围。这是一段文本,会围绕在图片周围。这是一段文本,会围绕在图片周围。
    </p>
  </div>
  <!-- 多栏布局 -->
  <div class="column">
    <div class="column-item">栏目 1</div>
    <div class="column-item">栏目 2</div>
    <div class="column-item">栏目 3</div>
  </div>
</body>
</html>

在这里插入图片描述

  • position 用于精确定位元素的位置,通常与 toprightbottomleft 一起使用。
    这个就不举例子了,上面又定位的例子

absolute与fixed

absolutefixed 是 CSS 中用于控制元素定位的两种方式,它们有一些共同点和不同点:

共同点:

  1. 都脱离文档流: 无论是 absolute 还是 fixed 定位的元素都脱离了文档流,不再占据正常的文档流位置,因此不会对其他元素的布局产生影响。

  2. 可以通过 toprightbottomleft 精确定位: 无论是 absolute 还是 fixed 元素,都可以使用这四个属性来精确地确定它们在页面中的位置。

  3. 可以通过 z-index 控制层叠顺序: 使用 z-index 属性,你可以控制 absolutefixed 元素的层叠顺序,即哪个元素位于其他元素的上方。

不同点:

  1. 相对于不同的参照物:

    • absoluteabsolute 定位的元素相对于其最近的已定位(非 static)祖先元素进行定位。如果没有已定位的祖先元素,它会相对于文档的初始包含块(viewport)进行定位。
    • fixedfixed 定位的元素相对于视口(浏览器窗口)进行定位,而不受页面滚动的影响。
  2. 在滚动时的行为不同:

    • absolute:随着页面滚动,absolute 定位的元素会保持相对于其最近的已定位祖先元素不变的位置。
    • fixedfixed 定位的元素会保持固定在视口的位置,不会随页面滚动而移动。
  3. 是否影响其他元素:

    • absoluteabsolute 定位的元素脱离文档流,但在脱离文档流之前会占据原来的文档流位置,可能会影响其他元素的布局。
    • fixedfixed 定位的元素脱离文档流,并且不占据文档流位置,不会影响其他元素的布局。

sticky 定位

sticky 定位是一种相对于元素自身在正常文档流中的位置和祖先元素的滚动容器滚动的一种定位方式。它在某些情况下表现为普通的文档流定位(staticrelative),但当元素的位置在视口中发生变化时,它会变为固定定位(fixed)。

要理解 sticky 定位,可以将其看作是 relativefixed 定位的混合。它适用于创建元素在页面滚动时粘性(sticky)地保持在某个位置的效果,通常用于创建固定的导航栏或侧边栏。

关键特点和使用方法:

  1. 相对于滚动容器定位: sticky 元素会相对于其最近的具有滚动条的祖先元素进行定位。如果没有这样的祖先元素,则相对于视口进行定位。

  2. 初始位置: 元素的初始位置由其在文档流中的位置决定,就像 relative 定位一样。在初始位置时,元素不会脱离文档流。

  3. 滚动触发: 当页面滚动到达特定位置(通常是元素初始位置之上或之下的某个点)时,元素会变为固定定位,就像 fixed 定位一样,保持在特定位置,直到滚动容器滚动超过元素的范围。

  4. 滚动范围: sticky 元素在滚动容器内保持固定定位,直到滚动到达滚动容器的底部或顶部,或者直到它的容器边界,取决于滚动的方向。

  5. 使用 toprightbottomleft 控制位置: 可以使用这些属性来精确定位 sticky 元素在切换到固定定位时的位置。

示例用法:

.sticky-element {
  position: -webkit-sticky; /* 兼容性写法 */
  position: sticky;
  top: 20px; /* 滚动触发后的垂直位置 */
}
<div class="scroll-container">
  <!-- 具有 sticky 定位的元素 -->
  <div class="sticky-element">
    这是一个 sticky 元素。
  </div>
  <!-- 页面内容 -->
</div>

在示例中,.sticky-element 是一个具有 sticky 定位的元素,当页面滚动到一定位置时,它会保持在距离顶部 20 像素的位置,直到滚动容器(.scroll-container)的底部。

更多推荐

什么是HTML?

互联网上的应用程序被称为Web应用程序,Web应用程序使用Web文档(网页)来表现用户界面,而Web文档都遵循标准HTML格式。HTML5是最新的HTML标准。之前的版本HTML4.01于1999年发布。20多年过去了,互联网已经发生了翻天覆地的变化,原有的标准已经不能满足各种Web应用程序的需求。本篇带大家一起了解H

CSP-J 2023 入门级 第一轮 阅读程序(3)

【题目】CSP-J2023入门级第一轮阅读程序(3)#include<iostream>#include<cmath>usingnamespacestd;intsolve1(intn){returnn*n;}intsolve2(intn){intsum=0;for(inti=1;i<=sqrt(n);i++){if(n

Flutter插件开发流程

本文主要给大家介绍如何开发FlutterPlugin中Android的部分。有关Flutter以及FlutterPlugin的概念,感兴趣的可以从官网查看相关资料。一、简介笔者的环境是Mac下AndroidStudio进行的开发,AS也是谷歌官推的,安装flutter插件后,开发起来相对于其他IDE来说,方便很多,自带

使用Feign实现远程调用

目录概述1、引入依赖2、启用Feign3、创建Feign接口4、使用Feign客户端5、配置Feign客户端5.1、全局配置文件5.2、Feign客户端接口5.3、自定义配置类5.4、自定义属性文件总结概述Feign是一个基于注解的HTTP客户端库,它允许您将HTTP请求转换为声明式的Java接口。您可以使用类似于Sp

qt day2

完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提示信

Docker容器网络安全性最佳实践:防止容器间攻击

Docker容器在现代应用开发和部署中扮演着重要的角色,但由于容器共享宿主机网络环境,容器网络的安全性变得尤为重要。为了防止容器间的攻击,并保护容器网络的安全,有一些最佳实践可以采用。下面将介绍一些重要的Docker容器网络安全性最佳实践。首先,一个基本的安全原则是使用可靠和受信任的容器镜像。确保从受信任的仓库中拉取和

Unity中Shader的模板测试

文章目录前言什么是模板测试1、模板缓冲区2、模板缓冲区中存储的值3、模板测试是什么(看完以下流程就能知道模板测试是什么)模板测试就是在渲染,后渲染的物体前,与渲染前的模板缓冲区的值进行比较,选出符合条件的部分,对后渲染的物体进行渲染前言Unity中Shader的模板测试什么是模板测试1、模板缓冲区2、模板缓冲区中存储的

C++ 指针

C++指针学习C++的指针既简单又有趣。通过指针,可以简化一些C++编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的C++程序员,学习指针是很有必要的。正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

竞赛选题 基于深度学习的人脸表情识别

文章目录0前言1技术介绍1.1技术概括1.2目前表情识别实现技术2实现效果3深度学习表情识别实现过程3.1网络架构3.2数据3.3实现流程3.4部分实现代码4最后0前言🔥优质竞赛项目系列,今天要分享的是基于深度学习的人脸表情识别该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https:/

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

热文推荐