CSS中的元素布局与定位详细说明

1、前言

        在CSS开发中,很重要的一个工作就是根据UI设计稿,进行元素的布局与定位,使得元素(比如某一段文本、按钮、图片等)显示在页面正确的位置。本文就元素的布局与定位方面,做一些讲解和说明。

2、元素的定位方法

        元素有很多布局和定位方法。常见的布局和定位方法有:

  •  标准文档流布局
  • Flexbox布局
  • 绝对定位和相对定位
  • Grid布局
  • 浮动布局

下面就是上面的布局方式逐一进行举例讲解。

3、标准文档流布局

        标准文档流布局是网页布局中一个最基本的概念,指的是元素按照HTML文档中的顺序,从上到下,从左到右排列。标准文档流分为两种类型的元素:块级元素(block-level elements)和内联元素(inline elements)。每种元素在文档流中排列方式略有不同。

块级元素(Block-level elements)

  • 占据一整行:块级元素默认的情况下会独占一行,并且其宽度会自动扩展到父容器的宽度(除非)
  • 从上到下排列:每个块级元素都会在其前一个块级元素的下面显示。

常见的块级元素有<div><p><h1>-<h6><ul><ol><li><section><article><header><footer> 等。

内联元素(inline elements)

  • 与文本共同行内:内联元素不会独占一行,多个内联元素可以在同一行中排列。
  • 宽度由内容决定:内联元素的宽度通常由其内容决定,内联元素之间的间距由内容的空白符(如空格等)决定。

常见的内联元素有<span><a><strong><em><img><button><input><label> 等。

注意:本文中所有的举例都是基于react框架来演示。

// app.js
import './App.css';function App() {return (<div className="App">{/* 块级元素 */}<div class="block-element">Block Element 1</div><div class="block-element">Block Element 2</div><div class="block-element">Block Element 3</div><p>Here are some <span class="inline-element">inline elements</span> in a paragraph.</p><p><span class="inline-element">Inline Element 1</span> <span class="inline-element">Inline Element 2</span> <span class="inline-element">Inline Element 3</span></p></div>);
}export default App;

/* app.css */
.block-element {background-color: lightcoral;margin: 20px 20px; /*上下边距为20px, 左右边距为20px */
}.inline-element {background-color: lightblue;
}

显示效果如下:

结果分析 :

  • 块级元素独占一整行,每个块级元素都会显示在前一个块级元素的下面
  • 块级元素的边距不能叠加。比如块级元素1的下边距为20, 块级元素2的上边距也是20,但是两者之间的距离还是20。即相邻元素的边距会合并,最终边距为两者较大的值
  • 多个内联元素可以在同一行显示

4、Flexbox布局

        Flexbox是一种强大的CSS布局,用户创建响应式、动态的页面布局。通过flexbox,可以额轻松地排列、对齐和分布页面中的元素。

基本概念:

  • display: flex;:将容器设置为 Flex 容器,它的所有直接子元素将成为 Flex 项目。
  • flex-direction:定义主轴的方向,即子元素在 Flex 容器中的排列方向。常用值有 row(默认,从左到右排列)和 column(从上到下排列)。
  • justify-content:定义 Flex 容器中子元素在主轴上的对齐方式。常用值有 flex-startflex-endcenterspace-betweenspace-around
  • align-items:定义 Flex 容器中子元素在交叉轴上的对齐方式。常用值有 stretch(默认,子元素拉伸以适应容器)、flex-startflex-endcenter

示例说明:

// app.js
import React from 'react';
import './App.css';function App() {return (<div class="container"><header class="header">Header</header><main class="main-content">Main Content</main><footer class="footer">Footer</footer></div>);
}export default App;
/* app.css */
/* 将容器设置为 Flex 容器 */
.container {display: flex;flex-direction: column; /* 子元素从上到下排列 */height: 50vh; /* 让容器占满半个屏幕高度 */
}/* 子元素的样式 */
.header {background-color: lightcoral;padding: 20px;  /* 内边距为20px, 元素内容和边框之间保持20px距离 */text-align: center;
}.main-content {background-color: lightblue;padding: 20px;flex-grow: 1; /* 让主要内容区占据剩余的可用空间 */
}.footer {background-color: lightgreen;padding: 20px;text-align: center;
}

 显示效果如下:

水平导航栏排列样式:

import React from 'react';
import './App.css';function App() {return (<nav class="nav"><div class="nav-item">Home</div><div class="nav-item">About</div><div class="nav-item">Services</div><div class="nav-item">Contact</div></nav>);
}export default App;

 

/* app.css */
.nav {display: flex;justify-content: space-around; /* 在主轴上均匀分布项目 */background-color: #333;
}.nav-item {color: lightblue;padding: 15px 20px;
}

显示效果如下 :

顺便说明一下,当块级元素没有设置宽度和高度时,宽度默认是充满整个父容器,高度会根据内容来来进行调整。

等高两列布局:

/* app.js*/
import React from 'react';
import './App.css';function App() {return (<div class="two-columns"><div class="column left">Left Column</div><div class="column right">Right Column</div></div>);
}export default App;

 

/* app.css */
.two-columns {display: flex;
}.column {flex: 1; /* 每个列都占据相等的空间 */padding: 20px;
}.left {background-color: lightblue;
}.right {background-color: lightcoral;
}

显示效果:

 

5、绝对定位和相对定位

        在react中,元素的相对定位是使用CSS的postion:relative属性来实现的。相对定位的元素对于其在正常文档流中的原始位置进行偏移。这意味着即使元素被偏移了,它仍然会占据原来的空间。

相对定位的特点:

  • 相对于自身:相对定位是相对于元素在文档流中的原始位置进行的,而不是相对于其它元素或者视口。
  • 占保留位:元素会继续占据其原本的位置,其它元素的布局不会因为它的偏移而改变。
  • 偏移量:通过top、bottom、right、left等属性设置偏移量,从而调整元素的位置。

示例说明:

// app.js
import React from 'react';
import './App.css';function App() {return (<div className="container"><div className="relative-box">I'm a relatively positioned box</div><div className="sibling-box">I'm a sibling box</div></div>);
}export default App;
/* app.css */
.container {width: 400px;height: 200px;background-color: #f0f0f0;position: relative; /* Container itself is relatively positioned */
}.relative-box {width: 150px;height: 100px;background-color: lightcoral;position: relative; /* 相对定位 */top: 20px;  /* 向下偏移20px */left: 30px; /* 向右偏移30px */
}.sibling-box {width: 150px;height: 100px;background-color: lightblue;
}

显示效果如下:

结果分析:

  • 红色块级元素采用了相对定位,相对于它在文档流中的原始位置,向下偏移了20px,向右偏移了20px
  • 绿色块级元素采用的默认的文档流定位,虽然红色块级元素进行了位置偏移,但是还是占据原来的位置(文档流中的位位置),因此位置不会受到红色块级元素位置偏移的影响。

顺便说一下,当元素的位置有重叠时,可以通过设置zIndex属性来调整元素显示的层次顺序

zIndex越大,显示越靠上。但是zIndex属性只有当元素的 position 属性被设置为 relativeabsolutefixed、或 sticky 之一时,z-index 才会生效。

总结:

  1.  相对定位的基准是相对于元素自身在文档流中的原始位置
  2. 相对偏移不会影响到别的元素的位置。

绝对定位

        在react中,使用CSS的positon:absolute来设置元素的绝对定位。绝对定位的元素相对于度最近的已经定位的祖先元素进行定位。如果没有找到已经定位的祖先元素,则相对于浏览器视口(窗口)进行定位。

绝对定位的特点:

  1. 脱离文档流:绝对定位的元素从文档流中完全脱离,不再占据空间,其它元素会像它不存在一样重新排列
  2. 定位基准:
    1. 如果祖先元素中有position设置为relative、absolute或fixed的元素,那么这个元素就是绝对定位的基准。
    2. 如果没有这样的元素,则相对于视口(浏览器窗口)进行定位。
  3. 通过top、bottom、right、left属性来设置偏移量,以决定元素的位置。

示例说明:

// app.js
import React from 'react';
import './App.css';function App() {return (<div className="outer-container"><div className="relative-container"><div className="absolute-box">I'm absolutely positioned</div><div className="relative-box">I'm relative positioned</div></div></div>);
}export default App;
/* app.css */
.outer-container {width: 400px;height: 200px;background-color: #f0f0f0;position: relative; /* 外层容器相对定位 */top:20px;
}.relative-container {width: 200px;height: 100px;background-color: lightblue;position: relative; /* 内层容器相对定位 */top:20px;
}.absolute-box {width: 100px;height: 50px;background-color: lightcoral;position: absolute; /* 绝对定位 */top: 20px; /* 相对于 .relative-container 的顶部偏移 20px */left: 30px; /* 相对于 .relative-container 的左侧偏移 30px */
}.relative-box {width: 100px;height: 50px;background-color: lightskyblue;position: relative; /* 绝对定位 */top: 40px; /* 相对于 .relative-container 的顶部偏移 20px */left: 60px; /* 相对于 .relative-container 的左侧偏移 30px */
}

显示效果如下:

 

结果分析:

  • 可以看到绝对元素定位的基准是最近的已经定位的祖先元素,即这里是内层容器
  • 绝对元素的定位不会影响其它元素的布局,比如relative box布局不会受到绝对元素影响

 

6、Grid布局

        Grid布局是一种二维布局系统,允许你在一个容器中以行和列的形式对元素进行排列。它非常强大,适用于复杂的网格布局。

示例说明:

// app.js
import React from 'react';
import './App.css';function App() {return (<div className="grid-container"><div className="grid-item">1</div><div className="grid-item">2</div><div className="grid-item">3</div><div className="grid-item">4</div><div className="grid-item">5</div><div className="grid-item">6</div><div className="grid-item">7</div><div className="grid-item">8</div><div className="grid-item">9</div></div>);
}export default App;

 

// app.css
.grid-container {display: grid;grid-template-columns: repeat(3, 1fr); /* 3 列,每列等宽 */gap: 10px; /* 每个网格项之间的间距 */
}.grid-item {background-color: lightblue;padding: 20px;text-align: center;
}

 显示效果:

结果分析:

  • 容器 (grid-container) 被定义为网格布局,grid-template-columns: repeat(3, 1fr) 创建了三个等宽的列。
  • 网格项 (grid-item) 在网格中自动排列成 3 行 3 列的布局。
  • 每个网格项都有 20px 的内边距,背景色为浅蓝色,并且内容居中。

7、浮动布局

        浮动是一种传统的布局方式,通过将元素浮动在页面上,使其它内容围绕它们进行布局。通常用于创建简单的多列布局。

实例说明:

import React from 'react';
import './App.css';function App() {return (<div className="container"><div className="sidebar">Sidebar</div><div>This text will wrap around the sidebar. The sidbar is floated to the left, so the text flows to the right of the image and continues below it once the image height is exceeded.</div><div className="main-content">Main Content</div></div>);
}export default App;
.container {overflow: hidden; /* 清除浮动 */
}.sidebar {float: left; /* 左侧浮动 */width: 30%; /* 宽度为父容器的 30% */background-color: lightgreen;padding: 20px;
}.main-content {float: left; /* 左侧浮动 */width: 70%; /* 宽度为父容器的 70% */background-color: lightcoral;padding: 20px;
}

显示效果:

结果分析: 

  • 元素向左侧浮动

    • 当你对一个元素应用 float: left; 时,该元素会从它的正常文档流位置脱离出来,并尽可能向其容器的左侧对齐。
    • 其他未浮动的内容(如文本、图片等)会围绕这个浮动元素的右侧排布。
  • 相邻元素环绕布局

    • 在浮动元素之后的相邻元素(如果没有设置浮动),通常会环绕浮动元素,填补浮动元素右侧的空白区域。
    • 如果多个元素都设置了 float: left;,它们会依次向左侧排列,并排布在同一行,直到容器的宽度被填满,之后多余的元素会移动到下一行。
  • 常见应用

    • 多列布局:使用 float: left; 可以轻松实现多列布局,如左侧导航栏和右侧内容区的布局。
    • 文本环绕图片:在网页设计中,经常将图片设置为左浮动,使文本环绕图片的右侧排列。

   注意事项

  • 浮动元素脱离文档流:浮动的元素不再占据其原始位置的空间,因此需要注意可能对后续布局的影响。
  • 清除浮动:在使用浮动布局时,如果父容器没有正确处理浮动,可能会导致父容器的高度塌陷(因为浮动的元素不占据父容器的空间)。可以使用 clear: both; 或其他清除浮动的方法来解决这一问题。

总结

  • float: left; 的主要作用是将元素从正常文档流中脱离出来,使其浮动到父容器的左侧,并让其他内容在其右侧进行环绕布局。
  • 它被广泛用于实现多列布局和图文混排等场景,但现代布局通常更倾向于使用 Flexbox 或 Grid 替代浮动布局。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Markdown 美化 Github 个人主页

注&#xff1a;本文参考这篇博客 http://t.csdnimg.cn/KXhSw 目录 1 效果展示2 创建仓库3 编写 Markdown3.1 动态波浪图3.2 打字机动图3.3 技术栈图标3.4 项目贡献统计3.5 连续贡献统计3.6 贡献统计图3.7 代码时长统计3.8 仓库代码占比 1 效果展示 先来看看效果&#xff1a; 动…

OSPF路由配置--多区域

目录 不理解OSPF路由动态协议的可以回顾一下OSPF详解&#xff0c;下这一系列的实验都不再做解释,直接开始配置 一. 实验拓扑 二. 实验配置 (命令可以直接复制粘贴到CLI中) 三. 实验验证 不理解OSPF路由动态协议的可以回顾一下OSPF详解&#xff0c;下这一系列的实验都不…

C++ 设计模式——迭代器模式

迭代器模式 C 设计模式——迭代器模式1. 主要组成成分2. 迭代器模式范例2.1 抽象迭代器2.2 抽象容器2.3 具体的迭代器2.4 具体的容器2.5 主函数示例 3. 迭代器 UML 图3.1 迭代器 UML 图解析 4. 迭代器模式的优点5. 迭代器模式的缺点6. 迭代器模式的适用场景7. 现代C中的迭代器总…

【深度学习】使用Conda虚拟环境安装多个版本的CUDA和CUDNN方便切换

conda虚拟环境安装CUDA和CUDNN 官网教程 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#conda-installation 1. 背景 深度学习用显卡训练的时候&#xff0c;需要安装与显卡对应的cuda和cudnn。但不同的项目所支持的pytorch版本是不一样的&#x…

Openssl Infinite Loop 漏洞(CVE-2022-0778)

Openssl Infinite Loop 漏洞&#xff08;CVE-2022-0778&#xff09; 1. 漏洞详情 在该漏洞中由于证书解析时使用的 BN_mod_sqrt() 函数存在一个错误&#xff0c;它会导致在非质数的情况下永远循环。可通过生成包含无效的显式曲线参数的证书来触发无限循环。由于证书解析是在验…

视频监控汇聚算法平台训练站车辆类型算法分析车辆类型检测应用方案

车辆类型检测算法是计算机视觉和深度学习技术在交通管理和智能车辆系统中的重要应用之一。这种算法通过自动分析和识别车辆图像&#xff0c;能够准确判断车辆的类型&#xff0c;如轿车、SUV、货车等。 运用方案 数据采集与预处理 采集包含车辆的图像或视频数据&#xff0c;包…

自学成才

软件只是一种工具&#xff0c;正如给你一张纸和一支笔&#xff0c;有人满纸疙瘩&#xff0c;有人行云流水唱成一曲绝唱&#xff0c;全在于笔头功夫。使用软件一样需要智慧&#xff0c;不光是懂了就行&#xff0c;还得创造性使用&#xff0c;才会成就别人望洋兴叹的绝活。 Core…

【实施】软件实施方案(word套用)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施 软件开发全套资料获取&#xff1a;&#xff08;本文末个人名片也可直接获取&#xff09; 软件产品&#xff0c;特别是行业解决方案软件产品不同于一…

【Electron】桌面应用开发electron-builder打包报错问题处理

Electron 桌面应用开发electron-builder打包过程中各种报错问题处理 前一篇有写过 Electron 桌面应用开发快速入门到打包Windows应用程序 在安装到打包的整个过程中&#xff0c;我们都会遇到很多诡异的问题&#xff0c;接下来我将介绍我遇到的几个问题的解决方案 一、拉包的时…

VBA技术资料MF191:将源文件夹所有文件移动到目标文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

iOS profiles文件过期如何更新

创建发布用的Certificates 首先进入到https://developer.apple.com/account页面选择【证书】进入【新建证书】页面 点击【新建证书】按钮&#xff1a; 根据需求选中对应的【证书类型】&#xff0c;我选的是【Apple Distribution】&#xff0c; 开发者证书选择【Apple Devel…

react antd TreeSelect实现自定义标签

<ProFormTreeSelectlabel"接收对象"name"receiverObjects"colProps{{ span: 16 }}labelCol{{span: 6,}}wrapperCol{{span: 18,}}rules{[{ required: true }]}fieldProps{{showSearch: true,multiple: true,// autoClearSearchValue: true,filterTreeNod…

探索条形码与二维码的秘密:pyzbar库的神奇之旅

文章目录 探索条形码与二维码的秘密&#xff1a;pyzbar库的神奇之旅背景&#xff1a;为什么选择pyzbar&#xff1f;pyzbar是什么&#xff1f;如何安装pyzbar&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索条形码与二维码的秘密&#xff1a;pyzbar库的神奇之…

数字化与进制转换

1.数字化是什么&#xff1f; 数字化是将事物的属性转化为计算机可处理对象的过程。 2.数字化的好处&#xff1f; 可以让我们的生活&#xff0c;学习和工作更加便捷&#xff0c;大大提升我们学习和工作的效率。 3.如何将采集到的数据进行数字化&#xff1f; 可以通过两种信…

爬取央视热榜并存储到MongoDB

1. 环境准备 在开始之前&#xff0c;确保你已经安装了以下Python库&#xff1a; pip install requests pymongo2. 爬取网页内容 首先&#xff0c;我们需要爬取央视热榜的网页内容。通过requests.get()方法&#xff0c;我们可以获取网页的HTML内容&#xff0c;并通过re.finda…

Linux--gdb的常用命令

目录 前言 一、gdb是什么&#xff1f; 二、常用命令 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 对于程序有两个版本&#xff0c;一个是debug版和release版&#xff0c;要想进行调试必须使用debug版本&#xff0c;再Linux上进行调试就要用到调试器…

实习手记(8):增删改查

上周又偷懒了没有按时写博客&#xff08;扣大分啊啊&#xff01;&#xff09;但是好像也没有人看呢~其实最开始也只是想着记录一下实习历程&#xff0c;怕自己之后回过头想关于实习的都想不起来了&#xff0c;个人还是喜欢记录有关自己的学习生活的&#xff0c;就算没啥人看但回…

Elasticsearch安装 Kibana安装

安装Elasticsearch 一、拉取镜像或者上传 docker pull Elasticsearch 二、将上传的镜像导入(在仓库拉取的这一步跳过) docker load -i es.tar docker load -i 三、创建容器 1.Elasticsearch 注意修改到自己的网络&#xff08;第八行&#xff09; docker run -d \--nam…

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…

“Docker中部署Kibana:步骤与指南“

博主这篇文章是跟Elasticsearch那篇文章是有关系的&#xff0c;建议大家先去看&#xff1a; 轻松上手&#xff1a;Docker部署Elasticsearch&#xff0c;高效构建搜索引擎环境_docker 启动 es-CSDN博客 这篇博文&#xff0c;还有镜像下载不下来的情况&#xff0c;大家可以去看…