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

news2024/11/15 15:25:47

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.coloradmin.cn/o/2073766.html

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

相关文章

PHP易支付系统,支付系统源码下载,已测试,带多个支付接口

易支付系统源码&#xff0c;已测试&#xff0c;功能齐全&#xff0c;带有多支付接口&#xff0c;站内有对应的视频教程&#xff0c;详细教程 搭建出来的网站前端和后台还是比较美观的 PHP全开源易支付系统源码&#xff0c;一键安装版 搭建环境&#xff1a;PHP 5.4 以上 推荐7…

数学基础(九)

一、相关分析 相关分析&#xff1a; 衡量事物之间或称变量之间线性相关的强弱&#xff0c;并适当的统计指标表示出来的过程 相关系数&#xff1a; 连续变量的相关分析&#xff1a; 连续变量即数据变量&#xff0c;它的取值之间可以比较大小&#xff0c;可以用加减法计算出差…

Google Colab快速使用

Google Colab快速使用 1. 引言2. Jupyter笔记本的创建3. 上传代码和数据集4. Colab常规指令 1. 引言 Google Colab是谷歌提供的免费Jupyter&#xff0c;很类似于Linux系统这些在终端界面操纵的感觉&#xff0c;不需要深度学习环境配置就可以使用&#xff0c;完全基于云端运行。…

【celery-2】python-Django发送邮件-短信-钉钉通知

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from xxxqq.com # 发送方邮箱 passwd xxx # 填入发送方邮箱的授权码(填入自己的授权码&#xff0c;相当于邮箱密码) msg_to [xxx…

两种方式实现图片标记

效果图 第一种&#xff1a;通过动态添加dom元素实现标记 代码如下 // index.tsx import React from "react"; import "./index.less";export default function index() {const parentRef React.useRef<any>(null);const ulRef React.useRef<a…

网站技术分析必备插件Wappalyzer Chrome介绍

引言 在日常的开发过程中&#xff0c;开发者们经常会对访问的某些网站使用了哪些技术感到好奇。无论是网页的前端框架、后台的编程语言&#xff0c;还是数据库的类型&#xff0c;这些信息对于开发者优化自己的网站或者了解行业趋势都非常有用。然而&#xff0c;直接从浏览器获…

LLM开发之自动编码系统实战开发(一)-- MiniRBAC 集成

文章目录 前言&#x1f387;MiniRBAC部署启动日志修改更换Mysql创建数据库数据库连接修改查询 Next ✨ 前言&#x1f387; 首先这个系统呢&#xff0c;俺们目前是还没有做好的&#xff0c;但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目&#xff…

Android 消息机制Handler完全解析(一)

提到Handler相信即使你是刚入行的android开发也会用过&#xff0c;可能你会觉得很简单&#xff0c;但是Handler中包含的内容真的不是你理解的那么简单&#xff0c;可能有些工作3-5年的同学也没有对其有很深入的了解。但Handler在android中的地位非常重要&#xff0c;并且几乎是…

图解Kafka | 5张图讲透Kafka 消费者交付语义

Kafka 消费者交付语义指的是 Kafka 消费者在处理消息时如何保证消息的可靠性和一致性。这涉及到消息是否被丢失、重复处理或者按顺序消费。 Kafka消费者交付语义有三种&#xff0c;即&#xff1a; 最多一次至少一次精确一次 当消费者组/消费者从 Kafka 消费数据时&#xff0…

昂科烧录器支持Airoha达发科技的蓝牙音频芯片AB1568

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Airoha达发科技的蓝牙音频芯片AB1568已经被昂科的通用烧录平台AP8000所支持。 AB1568是一款获得蓝牙5.3和LE音频认证的单芯片解决方案&#xff0c;包含一个ARM Cortex-M4F应用…

香蕉梨:自然的甜蜜宝藏

在水果的缤纷世界里&#xff0c;有一种独特的存在&#xff0c;它融合了香蕉的软糯与梨子的清甜&#xff0c;那便是令人惊艳的香蕉梨。 食家巷香蕉梨&#xff0c;外形圆润可爱&#xff0c;色泽金黄中带着一抹清新的嫩绿&#xff0c;宛如大自然精心雕琢的艺术品。当你拿起一个香蕉…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日&#xff0c;时间过得很快&#xff0c;2024…

PowerShell | git log 中文乱码问题解决

总结一下: 乱码核心问题就是对不上编码.改成对应编码即可. 明白‌LESSCHARSET环境变量‌是用来设置less命令的字符集编码的。当在命令行中使用less命令查看文件时&#xff0c;如果文件包含非ASCII字符&#xff08;如中文&#xff09;&#xff0c;可能会出现乱码问题。通过设置…

SpringBoot+Vue实现大文件上传(断点续传-前端控制)

SpringBootVue实现大文件上传&#xff08;断点续传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 问题 在前一篇文章&#xff0c;我们写了分片上传来实现大文件上传&#xff0c;存在一个问题就是&#xff0c;中间失败的话需要重新上传&#…

QT WIN11 FluentUI APP开发

代码 import QtQuick import QtQuick.Controls import FluentUIItem {property bool autoPlay: trueproperty int loopTime: 2000property var modelproperty Component delegateproperty bool showIndicator: trueproperty int indicatorGravity : Qt.AlignBottom | Qt.Align…

【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

STM32(六):定时器——输出比较实验

PWM驱动呼吸灯 源码&#xff1a; #include "stm32f10x.h" // Device headervoid PWM_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟TIM_InternalClockConfig(TIM2);//选择时基单元的时钟TIM_TimeBaseInitTypeDef TI…

怎么管控终端电脑上的移动端口

管控终端电脑上的移动端口&#xff0c;尤其是USB等移动端口&#xff0c;是确保企业数据安全和提升网络管理效率的重要手段。 一、使用注册表编辑器禁用USB端口&#xff08;适用于Windows系统&#xff09; 打开注册表编辑器&#xff1a; 同时按下“WinR”组合键&#xff0c;打…

【C++从小白到大牛】C++智能指针的使用、原理和分类

目录 1、我们为什么需要智能指针&#xff1f; 2、内存泄露 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2如何避免内存泄漏 总结一下: 3.智能指针的使用及原理 3.1 RAII 3.2关于深拷贝和浅拷贝更深层次的理解&#xff1a; 3.3 std::auto_ptr 3.4 std::unique_pt…

《黑神话:悟空》登顶全球:游戏行业投资新风向与投资洞察

目录 引言 一、原创IP的崛起&#xff1a;文化共鸣与市场潜力 1《黑神话:悟空》的原创IP魅力 2 原创IP在游戏行业中的重要性 3 原创IP成为新的投资热点 4 文化共鸣的关键作用 二、高质量内容为王&#xff1a;技术与创新的双重驱动 1 《黑神话:悟空》的高质量内容展示 2…