重拾CSS,前端样式精读-布局(表格,浮动,定位)

news2024/11/17 1:48:17

前言

本文收录于CSS系列文章中,欢迎阅读指正

CSS布局在Web开发中经历了多个阶段的演变,不同的时期出现了不同的布局方法,以适应不断变化的设计需求,从表格布局,浮动布局,到弹性盒,格栅布局,每个阶段都提供了灵活、强大的布局工具,本文将介绍css布局相关的知识点。

表格布局

在CSS广泛被支持之前,许多网站使用HTML表格来创建页面结构。这是早期的布局方法,它使用HTML<table>元素以及其行(<tr>)和单元格(<td>)的组合来构建网页的结构,设计页面布局

特点

  • 模拟网格系统:通过创建行和列,表格布局可以模拟网格系统,从而安排页面内容。
  • 垂直对齐:在表格中,可以通过属性轻松实现元素的垂直对齐,这是其它早期布局技术所不具备的。
  • 布局稳定性:使用表格布局的页面在各种浏览器中通常显示一致。

不足

  • 结构与表现混合:表格标签混合了页面结构和布局表现,使得页面内容与其表现形式难以分离。
  • 代码臃肿:页面代码过于复杂,这不仅降低了页面加载速度,而且使得维护和更新变得更加困难。
  • 不灵活:对于响应式设计来说,表格布局的适应性不如后来的CSS布局技术,如Flexbox和Grid。
  • SEO影响:搜索引擎优化可能受到影响,因为搜索引擎可能会错误地解释表格布局中的内容结构。

下面看个表格布局的例子

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Table</title>
    <style>
        /* 基本的表格样式 */
        table {
            width: 100%;
            border-collapse: collapse;
        }

        td,
        th {
            border: 1px solid #ddd;
            padding: 8px;
        }

        /* 用于模拟常见的布局结构 */
        header,
        footer {
            background-color: #f8f9fa;
            text-align: center;
        }

        nav {
            background-color: #e9ecef;
        }

        article {
            background-color: #fff;
        }

        aside {
            background-color: #e9ecef;
        }
    </style>
</head>

<body>

    <table>

        <!-- 页眉 -->
        <tr>
            <td colspan="2">
                <header>
                    <h1>网站标题</h1>
                </header>
            </td>
        </tr>

        <!-- 导航菜单 -->
        <tr>
            <td colspan="2">
                <nav>
                    <ul>
                        <li><a href="#">主页</a></li>
                        <li><a href="#">资讯</a></li>
                        <li><a href="#">联系我们</a></li>
                    </ul>
                </nav>
            </td>
        </tr>

        <!-- 主内容区与侧边栏 -->
        <tr>
            <!-- 主要内容 -->
            <td>
                <article>
                    <h2>文章标题</h2>
                    <p>这里是文章内容...</p>
                </article>
            </td>
            <!-- 侧边栏 -->
            <td width="200"> <!-- 设定宽度 -->
                <aside>
                    <h3>侧边栏标题</h3>
                    <p>侧边栏内容...</p>
                </aside>
            </td>
        </tr>

        <!-- 页脚 -->
        <tr>
            <td colspan="2">
                <footer>
                    <p>版权信息©2024</p>
                </footer>
            </td>
        </tr>
    </table>

</body>

</html>

代码中的<table>标签构成了整个页面的骨架。通过合并单元格(colspan)和通过<td>的width属性指定宽度,这段代码创建了包含页眉、导航菜单、主内容区、侧边栏和页脚的典型页面结构。

浮动布局

浮动布局是CSS的一个功能,它允许开发者将元素从常规的文档流中移出,使元素向其容器的左侧或右侧“浮动”。通过使用CSS的float属性,元素可以横向排列,从而实现多列布局。在引入Flexbox和CSS Grid这些现代布局技术之前,浮动布局是实现复杂页面布局的主要手段之一。

特点

  • 流动性:浮动可以让元素脱离文档流,从而提供了创建可自然环绕图像和元素的布局的流动性。这在早期Web设计中被广泛用来模仿更传统的印刷媒介布局。
  • 灵活性:浮动允许开发者以更为灵活的方式排列元素,而不必依赖于表格或者其他布局结构。
  • 简易排版:可以实现较为复杂的多栏布局,如杂志或报纸风格的布局。
  • 向后兼容性:早期的Web浏览器普遍支持浮动,使其成为实现多列布局的可靠方法。
  • 相对直观:对于简单的布局,浮动是一个相对容易理解和实现的技术。

不足

  • 清除问题:浮动元素需要清除。如果未正确清除,布局可能会出现不可预测的行为,如父容器高度塌陷。
  • 结构限制:复杂的浮动布局可能需要大量的计算和调整,特别是当涉及动态内容或响应式设计时。
  • 容易混乱:在大型或复杂的项目中,过度使用浮动会导致代码难以理解和维护。
  • 限制性:布局变化通常需要更改HTML结构。浮动元素通常需要按顺序放置,这为开发者设立了限制。

float属性表示给标签加上浮动效果,它有四个值:

  • left:将元素浮动到左侧。
  • right:将元素浮动到右侧。
  • none:默认值,不浮动。
  • inherit:继承父元素的浮动属性。

clear属性表示清除标签的浮动,也有四个值:

  • none:默认值,不清除浮动。
  • left:清除左浮动
  • right:清除右浮动
  • both:清除双边浮动

下面我用一个例子来展示浮动的效果

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }

        .container {
            border: 1px solid #ccc;
            padding: 10px;
            overflow: hidden;
        }

        .box {
            width: 100px;
            height: 100px;
            margin: 10px;
            padding: 10px;
            border: 1px solid #000;
            float: left;
            /* 默认左浮动 */
        }

        .btn {
            margin: 10px;
            padding: 5px;
            color: white;
            cursor: pointer;
            display: inline-block;
            background: lightcoral;
        }
    </style>
    <title>浮动布局演示</title>
</head>

<body>
    <h2>浮动布局演示</h2>
    <p>点击按钮切换浮动效果:</p>

    <div id="leftFloatBtn" class="btn">左浮动</div>
    <div id="rightFloatBtn" class="btn">右浮动</div>
    <div id="clearFloatBtn" class="btn">清除浮动</div>

    <div class="container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <p>这是一些文本内容,用以展示在盒子浮动的时候文本是如何围绕它的。通过点击下面的按钮,你可以切换盒子的浮动效果。这段文本足够长,可以让我们看到文本如何环绕一个浮动的元素。</p>
    </div>

    <script>
        document.getElementById('leftFloatBtn').addEventListener('click', function () {
            applyFloat('left');
        });

        document.getElementById('rightFloatBtn').addEventListener('click', function () {
            applyFloat('right');
        });

        document.getElementById('clearFloatBtn').addEventListener('click', function () {
            clearFloat();
        });

        function applyFloat(direction) {
            var boxes = document.querySelectorAll('.box');
            boxes.forEach(function (box) {
                box.style.float = direction;
            });
        }

        function clearFloat() {
            var boxes = document.querySelectorAll('.box');
            boxes.forEach(function (box) {
                box.style.float = 'none';
            });
        }
    </script>
</body>

</html>

代码创建了两个浮动的方框和一个容器。按钮可以控制方框的浮动方向或清除浮动

块格式化上下文(BFC)

聊到浮动(包括后面会讲到的定位),就离不开BFC的概念,这里做个简单的介绍:BFC是一个独立的布局环境,它决定了页面中的元素如何对其内容进行布局,以及如何与其他元素相互作用和影响。在BFC中,元素的布局不受外部元素的影响,反之亦然。

怎么形成的?
  1. 元素的float属性为left或right
  2. 设置position属性为absolute或fixed
  3. display属性为inline-block、table-cell、table-caption、flex、inline-flex
  4. overflow属性为auto、hidden或scroll

以上操作均会形成BFC

高度塌陷

在使用浮动时当浮动的父标签没设置高度(或者高度不足以支撑浮动元素的高度)也没有其他标签时,父标签就会产生高度塌陷的效果。参考上面的代码,我们将container的overflow: hidden去除可以看到以下效果

1,2,3这三个盒子都因为浮动效果脱离了文档流,可以理解为离开了父元素的文档流,并产生了BFC的效果,它们的布局和父元素的布局已经隔离开了。

解决方案

产生高度塌陷或许是我们不想看到的效果,如何解决浮动产生的高度塌陷?这就要使用魔法打败魔法了,我们在父元素上创建一个新的BFC,使父子元素处于同一布局环境下,常用的解决方案也就是我上面说到的方式,给父元素增加overflow: hidden,除此之外还有以下方案:

  • after伪类清除浮动

.container::after {
    content: "";
    display: table;
    clear: both;
}
  • 为父元素创建BFC环境
    参考上文的BFC形成方式,根据开发场景修改父元素的属性达到对应效果

定位布局

定位布局是一种使用CSS定位属性来摆放元素的布局方式。通过设置元素的position属性,开发者可以将元素放置到文档流中的指定位置,可以是相对于文档流中的其他元素或相对于视口。

特点

  • 精准定位:定位布局允许开发者精确地控制元素在页面中的位置,可以相对于文档流中的其他元素或相对于视口进行定位。
  • 自由定位:元素可以脱离正常文档流,不受周围元素的影响,使得开发者可以更灵活地设计页面布局。
  • 适用于特殊效果:定位布局适用于创建一些特殊效果,如悬浮菜单、弹出层、tooltip 等。
  • 层叠顺序:使用z-index属性可以控制定位元素的层叠顺序,使得开发者可以控制元素的叠放顺序。
  • 相对简单:定位布局的概念相对简单,易于理解和掌握,适用于一些小型项目或简单页面的布局。

不足

  • 复杂布局困难:对于复杂布局需求,如:等高布局、垂直居中等,使用定位布局可能变得繁琐且难以维护。
  • 可能影响可访问性:不当使用绝对定位可能导致元素在阅读器或屏幕阅读器中的顺序混乱,影响可访问性。
  • 维护难度:复杂的定位布局可能导致代码难以维护,尤其是在项目逐渐扩大的情况下。

position属性有几个不同的值,可以让开发者按照需要将元素摆放在页面上的几乎任何位置。设置定位后通过top,bottom,left,right和z-index可以调整元素的位置和层级。

static(静态定位)

这是所有元素的默认定位方式。

元素按照正常的文档流进行定位,也就是说,它们按照HTML中的顺序出现,并且不会受到top,bottom,left,right和z-index属性的影响。

relative(相对定位)

相对于元素的原始位置进行定位。

设置了相对定位的元素可以通过top,right,bottom和left属性从其正常位置移动。

其他元素会认为这个元素仍然处于它的静态位置,因此,它可能会覆盖其他元素或者被其他元素覆盖。

absolute(绝对定位)

元素的位置相对于最近的被定位(即非static)的祖先元素进行定位。一般是和relative搭配使用。

如果没有这样的祖先元素,则相对于文档的根元素(HTML页面上的<html>元素)定位。

和relative不同的是绝对定位的元素被完全从文档流中移除,因此,它们不会影响其他元素的位置。

fixed(固定定位)

元素的位置相对于浏览器窗口进行定位,不随滚动条滚动。

使用此定位的元素会固定在页面的指定位置,即使滚动页面内容也不会移动。

同样地,固定定位的元素也是脱离了文档流的。

sticky(粘性定位)

它是一个相对新的定位特性,它是相对定位和固定定位的结合。

元素根据文档流正常排列,直到页面滚动到达某个阈值点,元素就会在视口中"固定"在指定位置。

粘性定位依赖于top,right,bottom,left等属性,当元素到达视口中的特定位置时,才会起作用。

总结

本篇文章主要介绍了早期开发者的常用布局方式。包括表格,浮动,定位布局,这三者各自有其特点和弊端,根据项目合理使用适合的布局方式才是本文的最终目的

以上就是文章全部内容了,感谢你看到最后,如果觉得文章不错的话,给个三连鼓励一下吧,你的支持就是我创作的最大动力,谢谢!

相关代码

myCode: 基于js的一些小案例或者项目 - Gitee.com

参考文章

CSS 布局 - 学习 Web 开发 | MDN

浮动 - 学习 Web 开发 | MDN

定位 - 学习 Web 开发 | MDN

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

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

相关文章

【C++】—— priority_queue与仿函数

【C】—— priority_queue 与仿函数 1 priority_queue 介绍2 priority_queue 的使用2.1 priority_queue 的函数接口2.2 priority_queue 的使用 3 仿函数3.1 什么是仿函数3.2 仿函数的应用 4 需自己写仿函数的情况4.1 类类型不支持比较大小4.2 类中支持的比较方式不是我们想要的…

多模态——基于XrayGLM的X光片诊断的多模态大模型

0.引言 近年来&#xff0c;通用领域的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT&#xff0c;已在遵循指令和生成类似人类的响应方面取得了显著成就。这些成就不仅推动了多模态大模型研究的热潮&#xff0c;也催生了如MiniGPT-4、mPLUG-Owl、Multimodal-G…

在vscode在使用idea编辑器的快捷键

在vscode在使用idea编辑器的快捷键 在vscode扩展在搜索idea key结果如下&#xff1a; 选择IntelliJ IDEA Keybindings安装&#xff08;注意作者是Keisuke Kato&#xff09;&#xff0c;安装后就可以在vscode编辑器中使用idea编辑器的快捷键。

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

c语言200例 066

大家好&#xff0c;欢迎来到无限大的频道 今天给大家带来的是c语言200例。 要求&#xff1a; 根据输入的职业表示&#xff0c;区分是老师还是学生&#xff0c;然后根据输入的信息&#xff0c;将对应的信息输出&#xff0c;如果是学生&#xff0c;则输出班级&#xff0c;如果是…

xlsx库插件读取excel文件

input读取xlsx文件内容 效果代码 前端用input读取 .xlsx文件的内容 xlsx库参考连接 项目中我用的ant-design-vue&#xff0c;不过用input一样的大同小异 注意区分xlsx库和node-xlsx库的使用环境 效果 代码 <!--* Descripttion: * Author: 苍狼一啸八荒惊* Date: 2024-08-…

英文翻译中文怎么做?试试这四款翻译工具!

日常工作中&#xff0c;我时常需要处理各种学术资料&#xff0c;其中不乏英文文献。在这个信息爆炸的时代&#xff0c;翻译工具成为了我们不可或缺的好帮手。今天&#xff0c;我想和大家分享几款我常用的翻译工具&#xff0c;它们在英文翻译中文方面的表现&#xff0c;真的让我…

学习鸿蒙Harmong基础(二)

1.类声明和使用 class Perpon { name : string "小赵"; age : number 24; isShow :boolean true; // 构造函数 constructor(name:string,age:number,isShow:boolean){ this.name name; this.age age; this.isShow isShow } puperyInfo(){ if (this.isShow) { …

Chainlit集成LlamaIndex实现知识库高级检索(子问题查询引擎)

检索原理 llama_index 的 SubQuestionQueryEngine 是一个用于处理复杂查询的机制&#xff0c;它的主要目的是将复杂的查询问题分解成多个较小的、更容易管理和处理的子问题。这种技术有助于提高查询效率和准确性&#xff0c;尤其是在处理大量文档或者需要多步骤推理的情况下。…

2024年【金属非金属矿山(露天矿山)安全管理人员】最新解析及金属非金属矿山(露天矿山)安全管理人员考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员最新解析参考答案及金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&#…

安装 Nacos 启动报错 java.lang.IllegalArgumentException: db.num is null

java.io.IOException: java.lang.IllegalArgumentException: db.num is nullat com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl.reload(ExternalDataSourceServiceImpl.java:130)解决办法&#xff1a; 编辑 startup.cmd 文件 找到 set MO…

计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

海外盲盒APP系统:盲盒出海热潮下的选择

近年来&#xff0c;盲盒市场展现出了强劲的发展态势&#xff0c;不仅在国内持续上演“盲盒热”&#xff0c;在海外市场中更是“一盒难求”&#xff01;在盲盒出海的浪潮下&#xff0c;盲盒在国际市场中迅速火爆&#xff0c;一时席卷了全球市场。 海外盲盒系统是企业拓展海外市…

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言的兼…

没有建筑工程资质,怎么去投标?

在建筑工程领域&#xff0c;没有资质的企业想要参与投标&#xff0c;可以考虑以下几种方式&#xff1a; 1. 资质借用&#xff1a;可以与具有相应资质的企业合作&#xff0c;通过资质借用的方式参与投标。但这种做法存在法律风险&#xff0c;因为《中华人民共和国招标投标法》明…

kubernetes配置资源管理

目录 一、Secret1.1 Secret 四种类型1.2 Secret 使用条件 二、Secret 使用方式2.1 基于Opaque创建 Secret2.2 内容用 base64 编码&#xff0c;创建Secret2.3 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下2.4 将 Secret 导出到环境变量中2.5…

【Python】Pythonic Data Structures and Algorithms:深入浅出数据结构与算法的 Python 实现

Pythonic Data Structures and Algorithms 是一个开源项目&#xff0c;汇集了各种经典数据结构和算法的 Python 实现。该项目旨在为开发者提供丰富的学习资源&#xff0c;帮助他们通过 Python 代码理解和掌握数据结构与算法的核心原理和应用。项目中的算法涵盖了排序、搜索、图…

南平自闭症寄宿制学校:让孩子自信绽放

在繁华与喧嚣交织的都市之中&#xff0c;有一片静谧而充满希望的土地——广州星贝育园自闭症儿童寄宿制学校&#xff0c;这里不仅是知识的殿堂&#xff0c;更是自闭症儿童心灵成长的温馨家园。星贝育园&#xff0c;以其独特的教育理念与细致入微的关怀&#xff0c;为这些特殊的…

初始爬虫9

1.元素定位后的操作 “find_element“仅仅能够获取元素&#xff0c;不能够直接获取其中的数据&#xff0c;如果需要获取数据需要使用以下方法”。下面列出了两个方法&#xff1a; 获取文本 element.text 通过定位获取的标签对象的 text 属性&#xff0c;获取文本内容 获取属性…

opencv实战项目二十九:GrabCut分割人像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、GrabCut介绍&#xff1a;二、opencv实现&#xff1a;三、效果&#xff1a; 前言 在数字图像处理领域&#xff0c;人像分割是一项极具挑战性的任务&#xf…