CSS基础学习之元素定位(6)

news2024/9/21 14:32:43

        

目录

1、定位类型

2、取值

2.1、static

2.2、relative

2.3、absolute

2.4、fixed

2.5、stickty

3、示例

3.1、相对定位(relative)

3.2、绝对定位(absolute) 

3.3、固定定位(fixed) 

3.4、粘性定位(sticky) 

4、综合示例


CSS position 属性用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。

1、定位类型

  • 定位元素(positioned element)是其计算后位置属性为 relativeabsolutefixed 或 sticky 的一个元素(换句话说,除static以外的任何东西)。
  • 相对定位元素(relatively positioned element)是计算后位置属性为 relative的元素。
  • 绝对定位元素(absolutely positioned element)是计算后位置属性为 absolute 或 fixed 的元素。
  • 粘性定位元素(stickily positioned element)是计算后位置属性为 sticky 的元素。

        大多数情况下,height和width 被设定为 auto 的绝对定位元素,按其内容大小调整尺寸。但是,被绝对定位的元素可以通过指定top和bottom ,保留height未指定(即auto),来填充可用的垂直空间。它们同样可以通过指定left 和 right并将width 指定为auto来填充可用的水平空间。

        除了刚刚描述的情况(绝对定位元素填充可用空间):

  • 如果 top 和 bottom 都被指定(严格来说,这里指定的值不能为 auto ),top 优先。
  • 如果指定了 left 和 right ,当 direction设置为 ltr(水平书写的中文、英语)时 left 优先,当direction设置为 rtl(阿拉伯语、希伯来语、波斯语由右向左书写)时 right 优先。

2、取值

2.1、static

        该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时 toprightbottomleft 和 z-index 属性无效。

2.2、relative

        该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。

2.3、absolute

        元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。

2.4、fixed

        元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transformperspectivefilter 或 backdrop-filter 属性非 none 时,容器由视口改为该祖先。

2.5、stickty

        元素根据正常文档流进行定位,然后相对它的最近滚动祖先(nearest scrolling ancestor)和 containing block(最近块级祖先 nearest block-level ancestor),包括 table-related 元素,基于 toprightbottom 和 left 的值进行偏移。偏移值不会影响任何其他元素的位置。 该值总是创建一个新的层叠上下文(stacking context)。注意,一个 sticky 元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的 overflow 是 hiddenscrollauto 或 overlay 时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为(详情见 Github issue on W3C CSSWG)。

3、示例

3.1、相对定位(relative)

        相对定位的元素是在文档中的正常位置偏移给定的值,但是不影响其他元素的偏移。下面的例子中,注意未应用定位的其他元素是按照 "Two" 在正常位置的情况下进行布局的。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        .box {
            display: inline-block;
            width: 100px;
            height: 100px;
            background: red;
            color: white;
        }

        #two {
            position: relative;
            top: 20px;
            left: 20px;
            background: blue;
        }
    </style>
</head>

<body>
    <div class="box" id="one">One</div>
    <div class="box" id="two">Two</div>
    <div class="box" id="three">Three</div>
    <div class="box" id="four">Four</div>
</body>

</html>

        运行效果如下:

3.2、绝对定位(absolute) 

        相对定位的元素并未脱离文档流,而绝对定位的元素则脱离了文档流。在布置文档流中其他元素时,绝对定位元素不占据空间。绝对定位元素相对于最近的非 static 祖先元素定位。当这样的祖先元素不存在时,则相对于 ICB(initial containing block,初始包含块)。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body {
            width: 500px;
            margin: 0 auto;
        }

        p {
            background: aqua;
            border: 3px solid blue;
            padding: 10px;
            margin: 10px;
        }

        span {
            background: red;
            border: 1px solid black;
        }

        .positioned {
            position: absolute;
            background: yellow;
            top: 40px;
            left: 30px;
        }
    </style>
</head>

<body>
    <h1>Absolute positioning</h1>

    <p>
        I am a basic block level element. My adjacent block level elements sit on new
        lines below me.
    </p>

    <p class="positioned">
        By default we span 100% of the width of our parent element, and we are as tall
        as our child content. Our total width and height is our content + padding +
        border width/height.
    </p>

    <p>
        We are separated by our margins. Because of margin collapsing, we are
        separated by the width of one of our margins, not both.
    </p>

    <p>
        inline elements <span>like this one</span> and <span>this one</span> sit on
        the same line as one another, and adjacent text nodes, if there is space on
        the same line. Overflowing inline elements
        <span>wrap onto a new line if possible — like this one containing text</span>,
        or just go on to a new line if not, much like this image will do:
        <img src="./images/long.png" />
    </p>

</body>

</html>

        运行效果如下:

3.3、固定定位(fixed) 

        固定定位与绝对定位相似,但元素的包含块为 viewport 视口。该定位方式常用于创建在滚动屏幕时仍固定在相同位置的元素。在下面的示例中,"One" 元素定位在离页面顶部 20px,离页面左侧 20px 的位置。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        .box {
            background: red;
            width: 100px;
            height: 100px;
            margin: 20px;
            color: white;
        }

        #one {
            position: fixed;
            top: 20px;
            left: 10px;
        }

        .outer {
            width: 500px;
            height: 300px;
            overflow: scroll;
            padding-left: 150px;
        }
    </style>
</head>

<body>
    <div class="outer">
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
            eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
            et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
            laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
            Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
            arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
            sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
            aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
            maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
            finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
            ultrices ultrices, tempor et tellus.
        </p>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
            eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
            et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
            laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
            Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
            arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
            sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
            aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
            maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
            finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
            ultrices ultrices, tempor et tellus.
        </p>
        <div class="box" id="one">One</div>
    </div>

</body>

</html>

        运行效果如下:

3.4、粘性定位(sticky) 

        粘性定位可以被认为是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,之后为固定定位。例如:

#one {
  position: sticky;
  top: 10px;
}

        在 viewport 视口滚动到元素 top 距离小于 10px 之前,元素为相对定位。之后,元素将固定在与顶部距离 10px 的位置,直到 viewport 视口回滚到阈值以下。

        粘性定位常用于定位字母列表的头部元素。标示 B 部分开始的头部元素在滚动 A 部分时,始终处于 A 的下方。而在开始滚动 B 部分时,B 的头部会固定在屏幕顶部,直到所有 B 的项均完成滚动后,才被 C 的头部替代。

须指定 top, right, bottom 或 left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        * {
            box-sizing: border-box;
        }

        dl {
            margin: 0;
            padding: 24px 0 0 0;
        }

        dt {
            background: #b8c1c8;
            border-bottom: 1px solid #989ea4;
            border-top: 1px solid #717d85;
            color: #fff;
            font:
                bold 18px/21px Helvetica,
                Arial,
                sans-serif;
            margin: 0;
            padding: 2px 0 0 12px;
            position: -webkit-sticky;
            position: sticky;
            top: -1px;
        }

        dd {
            font:
                bold 20px/45px Helvetica,
                Arial,
                sans-serif;
            margin: 0;
            padding: 0 0 0 12px;
            white-space: nowrap;
        }

        dd+dd {
            border-top: 1px solid #ccc;
        }
    </style>
</head>

<body>
    <div>
        <dl>
            <dt>A</dt>
            <dd>Andrew W.K.</dd>
            <dd>Apparat</dd>
            <dd>Arcade Fire</dd>
            <dd>At The Drive-In</dd>
            <dd>Aziz Ansari</dd>
        </dl>
        <dl>
            <dt>C</dt>
            <dd>Chromeo</dd>
            <dd>Common</dd>
            <dd>Converge</dd>
            <dd>Crystal Castles</dd>
            <dd>Cursive</dd>
        </dl>
        <dl>
            <dt>E</dt>
            <dd>Explosions In The Sky</dd>
        </dl>
        <dl>
            <dt>T</dt>
            <dd>Ted Leo & The Pharmacists</dd>
            <dd>T-Pain</dd>
            <dd>Thrice</dd>
            <dd>TV On The Radio</dd>
            <dd>Two Gallants</dd>
        </dl>
    </div>

</body>

</html>

 运行效果如下:

sticky定位效果

4、综合示例

        如下是我们要实现的一个效果:

         首先是中间的虚线方框:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        div {
            height: 200px;
            width: 200px;
            position: absolute;
            left: 200px;
            top: 50px;
            font-size: 4rem;
            line-height: 200px;
            text-align: center;
        }

        .original {
            border: 1px dashed;
        }

    </style>
</head>

<body>
    <div class="original"></div>

</body>

</html>

        效果如下:

        没错就是一个方框,接下来添加两条虚线,水平的那条是没有旋转的线,另外一条旋转了135度(顺时针方向):

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        div {
            height: 200px;
            width: 200px;
            position: absolute;
            left: 200px;
            top: 50px;
            font-size: 4rem;
            line-height: 200px;
            text-align: center;
        }

        .original {
            border: 1px dashed;
        }

        .original:before,
        .original:after {
            content: "";
            position: absolute;
            top: 100px;
            width: 500px;
            left: -150px;
            height: 1px;
            border-top: 2px dotted;
        }

        .original:after {
            transform: rotate(135deg);
        }

    </style>
</head>

<body>
    <div class="original"></div>

</body>

</html>

         效果如下:

        这里使用了伪元素.original:before及 .original:after,这两个伪元素就是负责添加水平虚线和另外一条旋转过的虚线的。

        .original:after {
            content: "";
            position: absolute;
            top: 100px;
            width: 500px;
            left: -150px;
            height: 1px;
            border-top: 2px dotted;
        }

         定位方式为绝对定位,而绝对定位元素相对于最近的非 static 祖先元素定位。当这样的祖先元素不存在时,则相对于 ICB(initial containing block,初始包含块),这里其实是相对于div定位了。

        接下来就是完整的效果,代码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>元素定位学习</title>
    <style>
        div {
            height: 200px;
            width: 200px;
            position: absolute;
            left: 200px;
            top: 50px;
            font-size: 4rem;
            line-height: 200px;
            text-align: center;
        }

        .original {
            border: 1px dashed;
        }

        .original:before,
        .original:after {
            content: "";
            position: absolute;
            top: 100px;
            width: 500px;
            left: -150px;
            height: 1px;
            border-top: 2px dotted;
        }

        .original:after {
            transform: rotate(135deg);
        }

        .one {
            background-color: #ccc;
        }

        .two {
            background-color: #d6bb72;
        }

        .one {
            transform: translateX(200px) rotate(135deg);
        }

        .two {
            transform: rotate(135deg) translateX(200px);
        }
    </style>
</head>

<body>
    <div class="original"></div>
    <div class="one">1</div>
    <div class="two">2</div>

</body>

</html>

        该案例有助于理解元素定位以及transform的作用。

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

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

相关文章

力扣第九题(回文数)

9. 回文数 - 力扣&#xff08;LeetCode&#xff09; 提示 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数 是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读…

Husco在汽车自动变速器电磁阀总产量超1200万台最大汽车电磁阀线圈制造商Amisco同时高产量增长

Husco Inc.是一家位于美国威斯康星州的汽车零部件制造商&#xff0c;专门生产汽车自动变速器电磁阀。根据最新的数据&#xff0c;Husco的汽车自动变速器电磁阀总产量已经超过了1200万台&#xff0c;成为全球最大的汽车电磁阀生产商之一。 与此同时&#xff0c;Amisco是一家专门…

(21)起落架/可伸缩相机支架

文章目录 前言 1 连接到自动驾驶仪 2 通过任务规划器设置 3 其他参数 4 参数说明 前言 Copter 和 Plane 支持可伸缩的起落架/相机支架&#xff0c;由伺服机制激活&#xff08;如 Hobby King 出售的用于copters 的这些&#xff09;。齿轮/支架可以手动缩回或用一个辅助开关…

STM32 IAP 需要关注的一些事

1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序&#xff0c;一个是bootloader&#xff0c;一个是user程序&#xff0c;这两个程序的功能分别的什么作用的&#xff1f; 3、编译的固件是怎么分布的&#xff1f;通过那个配置文件去指导编译器去排布…

Stable Diffusion:解锁AI绘画新纪元的保姆级入门指南

在这个数字艺术日新月异的时代&#xff0c;Stable Diffusion如同一股清新的风&#xff0c;吹散了传统绘画的界限&#xff0c;让每个人都能成为创意无限的数字艺术家。作为一款基于Transformer结构的文本到图像生成模型&#xff0c;Stable Diffusion以其惊人的生成速度、细腻的画…

Android 12系统源码_存储(二)StorageManagerService服务

前言 在 Android 系统中&#xff0c;StorageManagerService是一个用于获取存储设备信息和管理存储设备的服务。它提供了一系列方法&#xff0c;可以获取当前挂载的存储设备信息&#xff0c;以及对存储设备进行挂载和卸载操作。 一、Storage存储模块介绍 1.1、StorageManager…

思路|如何利用oneNote钓鱼?

本文仅用于技术研究学习&#xff0c;请遵守相关法律&#xff0c;禁止使用本文所提及的相关技术开展非法攻击行为&#xff0c;由于传播、利用本文所提供的信息而造成任何不良后果及损失&#xff0c;与本账号及作者无关。 本文来源无问社区&#xff0c;更多实战内容&#xff0c;…

GuLi商城-商品服务-API-属性分组-分组修改级联选择器回显

前端代码:略 后端回显接口: 递归方法: @Override publi

Airtest封装的Tidevice接口有多好用(一)

一、前言 很多同学都有在Windows电脑上连接本地iOS设备去进行测试的需求&#xff0c;其中tidevice库是大家在Windows上使用的最多的iOS通信库&#xff0c;其中有一些接口是我们比较常用的&#xff0c;所以Airtest这边对一些常用的接口进行了封装&#xff0c;供大家日常写脚本的…

【web】-反序列化-to_string

<?php highlight_file(__FILE__); class A{public $s;public function __destruct(){echo "hello".$this->s;}} class B{public $cmd;public function __toString(){system($this->cmd);return 1;} } unserialize($_GET[code]); __toString()当对象被当着…

Java小白入门到实战应用教程-变量

变量 说明 变量是存储数据的基础单元。通过变量我们可以在代码去获取变量的数据、操作变量的数据。换种说法就是数据的存储体。 比如我们现在声明一个变量&#xff0c;并用它来存放一个数字1&#xff1b; int a 1;那么此时这个变量的值就为1&#xff0c;也可以理解成这个变…

QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件

文章目录 main.cpp代码捕获异常 生成dmp文件和pdb文件DebugTest生成错误代码注意 分析软件崩溃&#xff0c;除了需要dmp&#xff0c;还需要这个pdb文件 dmp&#xff0c;文件记录了崩溃的信息&#xff0c;而pdb&#xff08;代码工程数据库&#xff09;&#xff0c;则包含了你写的…

【机器学习-00】机器学习是什么?

在科技飞速发展的今天&#xff0c;机器学习已成为一个热门话题&#xff0c;广泛应用于各个行业和领域。那么&#xff0c;机器学习到底是什么&#xff1f;它又是如何工作的&#xff1f;本文将深入探讨机器学习的定义、原理及其在各领域的应用&#xff0c;带领读者走进这个神秘而…

FGF18:骨关节炎治疗靶标

成纤维细胞生长因子18&#xff08;FGF18&#xff09;属于FGF8亚家族成员&#xff0c;在细胞增殖、细胞分化和细胞迁移的调节中起重要作用&#xff0c;是正常骨化和骨骼发育所需&#xff0c;同时刺激肝脏和肠道增殖。 &#xff08;数据来源AlphaFold&#xff09; FGF18由207个氨…

arcgis怎么选取某个指定区域地方的数据,比如从全国乡镇数据选取长沙市乡镇数据

一共5个步骤&#xff0c;没一句废话&#xff0c;耐心看完。 1、如图&#xff0c;先将数据加载到arcgis里面&#xff0c;我们要选取里面长沙市的范围数据。 2、选取长沙市的语句 “市” like ‘长沙%’ 切记&#xff0c;切记&#xff0c;切记。所有符号要在 输入法英文状态…

重生奇迹mu智力妹妹的召唤技能

很多人错误地认为智能小帮手只是一种辅助职业&#xff0c;没有太多的攻击能力。但是实际情况是&#xff0c;有一些智能小帮手不仅能够提供辅助&#xff0c;而且还可以扮演输出角色。他们的技能加持可以配合召唤宠物的攻击和仇恨&#xff0c;在击败BOSS的过程中发挥重要作用。 召…

【I²C协议】STC89C51单片机IIC通信(代码+原理)

STC89C51单片机IIC通信 什么是IC协议特点构成 通信协议开始信号、结束信号、应答信号数据传输 代码示例 什么是IC协议 IIC,即IC&#xff0c;全称 Inter-Integrated Circuit&#xff0c;字面上的意思是集成电路之间&#xff0c;它其实是IC Bus简称&#xff0c;所以中文应该叫 集…

ELK企业级日志分析

目 录 一、ELK简介 1.1 elasticsearch简介 1.2 logstash简介 1.3 kibana简介 1.4 ELK的好处 1.5 ELK的工作原理 二、部署ELK 2.1 部署elasticsearch(集群) 2.1.1 修改配置文件 2.1.2 修改系统参数 2.1.2.1 修改systemmd服务管理器 2.1.2.2 性能调优参数 2.1.2.3 …

网络和安全操作

一、编辑文件 文本编辑器有很多&#xff0c;比如图形模式的gedit、OpenOffice 等&#xff0c;文本模式下的编辑器有vi、vim&#xff08;vi的增强版本&#xff09;等。vi和vim是我们在Linux中最常用的编辑器。 gedit&#xff1a;类似于windows下的记事本&#xff0c;很方便的去…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…