实现三栏布局的十种方式

本文节选自我的博客:实现三栏布局的十种方式

  • 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。
  • 📝 CSDN主页:爱吃糖的猫🔥
  • 📣 我的博客:爱吃糖的猫
  • 📚 Github主页: MilesChen
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 💬介绍:The mixture of WEB+DeepLearning+Iot+anything🍁

前言

实现三栏布局也是一道经典的面试题,如果你能侃侃而谈这十种实现三栏布局的方式,一定会令面试官眼前一亮。三栏布局即左右固定中间伸缩,将三栏布局的方式按照中间栏的渲染顺序可以分为三种:float实现的三种(中间栏最后渲染),flex、grid、绝对定位实现的三种(中间栏中间渲染),双飞翼圣杯实现的四种(中间栏最后渲染)

float实现的三种

float实现的方式优点是兼容性好;缺点是需要将中间栏放在最后渲染,网速慢的情况下可能会影响用户体验。

float+BFC

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法1 浮动+BFC 左右元素固定宽度,向左右浮动 中间元素不设置宽度,会自动撑满,重叠问题可使用构造BFC解决 *//* 注意HTML标签中需要将 中间元素放在最后显示,这会导致问题,中间内容后显示 */.left{float: left;width: 100px;background-color: aqua;}.middle{overflow: hidden;height: 200px;background-color: green;}.right{float: right;width: 100px;background-color: aqua;}</style></head><body><div class="container"><div class="left">左栏</div><div class="right">右栏</div><div class="middle">中间栏</div></div></body>
</html>

float+margin

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法2 浮动+margin 和两栏比较法二很像,左右元素固定宽度,向左右浮动 中间元素不设置宽度,会自动撑满,重叠问题可使用margin解决 *//* 注意HTML标签中需要将 中间元素放在最后显示,这会导致问题,中间内容后显示 */.left{float: left;width: 100px;background-color: aqua;}.middle{margin:0 100px;height: 200px;background-color: green;}.right{float: right;width: 100px;background-color: aqua;}</style></head><body><div class="container"><div class="left">左栏</div><div class="right">右栏</div><div class="middle">中间栏</div></div></body>
</html>

float+calc()

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法3 浮动+calc() 先使用浮动将三栏水平排列,然后对中间栏使用calc()函数来计算去除左右两栏固定宽度后剩余的宽度。*/div {height: 100px;}.left {float: left;width: 200px;background-color: red;}.middle {float: left;width: calc(100% - 400px);background-color: green;}.right {float: right;width: 200px;background-color: blue;}</style></head><body><div class="container"><div class="left">左栏</div><div class="right">右栏</div><div class="middle">中间栏</div></div></body>
</html>

flex、grid、绝对定位实现的三种

这三种方式都是将中间栏放在中间渲染。

flex

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法4 flex 直接给中间设置flex 1 左右固定宽度 *//* 优点是特别简单 缺点是依赖flex的兼容性 */.container {display: flex;}.left {width: 200px;height: 200px;background: red;}.middle {height: 200px;background: yellow;flex: 1;}.right {width: 200px;height: 200px;background: blue;}</style></head><body><div class="container"><div class="left">左栏</div><div class="middle">中间栏</div><div class="right">右栏</div></div></body>
</html>

grid

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法5 网格 利用grid布局的方式,左右两栏设置固定宽度,中间一栏设置为auto*//* 核心代码:grid-template-columns 左栏固定宽度 中间自适应宽度 右栏固定宽度*/div {height: 100px;}.container {display: grid;grid-template-columns: 200px auto 200px;}.left {background: red;}.middle {background: green;}.right {background: blue;}</style></head><body><div class="container"><div class="left">左栏</div><div class="middle">中间栏</div><div class="right">右栏</div></div></body>
</html>

绝对定位

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法6 子绝父相:三栏全部绝对定位;中间栏left: 200px;right: 200px;保持伸缩居中 */.container {position: relative;}.left {position: absolute;left: 0;width: 200px;background-color: red;}.middle {position: absolute;left: 200px;right: 200px;background-color: green;}.right {position: absolute;right: 0;width: 200px;background-color: blue;}</style></head><body><div class="container"><div class="left">左栏</div><div class="middle">中间栏</div><div class="right">右栏</div></div></body>
</html>

双飞翼圣杯实现的四种

这四种方式都是将中间栏放在最前面渲染,保证中间栏最先渲染。

felx实现圣杯双飞翼效果

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>CSS实现三栏布局</title><style type="text/css">/* 方法7:使用flex实现圣杯、双飞翼的效果, 使用 order 调整flex顺序  使中间块最先加载*/.container {display: flex;}.middle {flex: 1;background-color: red;}.left {width: 200px;order: -1;background-color: aqua;}.right {width: 200px;order: 1;background-color: bisque;}</style></head><body><div class="container"><div class="left">左栏</div><div class="right">右栏</div><div class="middle">中间栏</div></div></body>
</html>

圣杯布局

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS实现三栏布局</title><style>* {margin: 0;padding: 0;}/* 给container栏添加padding,左右栏使用相对定位移上去。利用浮动,外边距负值和相对定位来实现。 */.container {height: 100px;padding: 0 200px;}.middle,.left,.right{float: left;height: 100%;}.middle {width: 100%;background: rgb(100, 105, 100);}.left {position: relative;width: 200px;background: pink;left: -200px;/* float后的元素可以使用 margin-left: -100%; 切换到上一行起始位置*/margin-left: -100%;}.right {position: relative;width: 200px;background: pink;/* 第一种写法 */margin-left: -200px;left:200px;/* 第二中写法 *//* margin-right: -200px; */}</style>
</head>
<body><div class="container"><div class="middle">middle</div><div class="left">left</div><div class="right">right</div></div>
</body>
</html>

注意:圣杯布局中间列的宽度不能小于两边任意列的宽度,而双飞翼布局则不存在这个问题。
父级padding+子绝父相+负边距:三栏都使用float:left;父级标签padding: 0 200px; ,结合下面这张图理解

将left和right使用子绝父相,再调整定位的方式弄上去
左边:margin-left: -100%;(切换到上一行起始位置)left: -200px;(相对定位,向左移动200px)
右边:margin-left: -200px;(向左移动一个身位,移动到middle的右侧)left:200px; (向右移动200px)
还有种方法也能挤上去:margin-right: -200px;

双飞翼布局

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS实现三栏布局</title><style>.container {overflow: hidden;height: 200px;}/* 中间栏的子标签margin+左右负边距 */.middle,.left,.right {float: left;height: 100px;}.middle {width: 100%;background-color: aqua;}.inner {margin: 0 200px;height: 100px;background-color: green;}.left {width: 200px;margin-left: -100%;background-color: red;}.right {width: 200px;margin-left: -200px;background-color: blue;}</style>
</head>
<body><div class="container"><div class="middle"><div class="inner">中间</div></div><div class="left">左边</div><div class="right">右边</div></div>
</body>
</html>

中间栏的子标签margin+左右负边距:三栏都使用float:left;中间栏子标签margin: 0 200px; HTML中将中间栏放前面;结合下面这张图去理解

双飞翼圣杯复合写法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS实现三栏布局</title><style>/* 双飞翼与圣杯布局的结合写法,这一种直接在中间栏加padding,然后将左右栏 添加margin-left移动上去 *//* middle要使用内减模式 不然会多出一块区域 */.container {height: 100px;}.middle,.left,.right{float: left;height: 100%;}.middle {box-sizing: border-box;width: 100%;background: rgb(100, 105, 100);padding: 0 200px;}.left {width: 200px;background: pink;margin-left: -100%;}.right {width: 200px;background: pink;margin-left: -200px;}</style>
</head>
<body><div class="container"><div class="middle">middle</div><div class="left">left</div><div class="right">right</div></div>
</body>
</html>

中间标签内减模式padding+负数边距:三栏都使用float:left;中间栏标签padding: 0 200px; 且要设置box-sizing: border-box;左边:margin-left: -100%;右边:margin-left: -200px;

总结

  1. float+BFC:左右两栏float到左右;中间 overflow: hidden; 清除浮动显示第二栏 ;注意:HTML需要将中间块放在right之后;
  2. float+margin:左右两栏float到左右;中间设置margin-leftmargin-right;注意:HTML需要将中间块放在right之后;
  3. float+calc() :先使用浮动将三栏水平排列,然后对中间栏使用calc(100% - 400px);来计算去除左右两栏宽度后剩余的宽度;
  4. flex;将中间设定值为1,最简单的方式;
  5. grid:display: grid;grid-template-columns: 200px auto 200px;左右两栏固定宽度,中间自适应宽度;
  6. 子绝父相:三栏全部绝对定位;中间栏left: 200px;right: 200px;保持伸缩居中
  7. felx实现圣杯双飞翼效果:left {order: -1;} right{order: 1;} 中间块默认为0;所以显示顺序了-1、0、1;
  8. 圣杯布局:父级padding+子绝父相+负边距
  9. 双飞翼布局:中间栏的子标签margin+左右负边距
  10. 双飞翼圣杯复合写法:中间标签内减模式padding+负数边距

感谢小伙伴们的耐心观看,本文为笔者个人学习记录,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力!

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

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

相关文章

02-Zookeeper实战

上一篇&#xff1a;01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1&#xff1a; 配置JAVA环境&#xff0c;检验环境&#xff1a; java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…

C++-哈希Hash

本期我们来学习哈希 目录 unordered系列关联式容器 unordered_map unordered_set 性能比较 哈希概念 哈希冲突 哈希函数 哈希冲突解决 闭散列 模拟实现 开散列 模拟实现 全部代码 unordered系列关联式容器 在 C98 中&#xff0c; STL 提供了底层为红黑树结构的一…

【算法基础】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序

目录 1 冒泡排序&#xff08;Bubble Sort&#xff09; 2 插入排序&#xff08;Insertion Sort&#xff09; 3 选择排序&#xff08;Selection Sort&#xff09; 4. 快速排序&#xff08;Quick Sort&#xff09; 5. 归并排序&#xff08;Merge Sort&#xff09; 6 堆排序 …

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…

11链表-迭代与递归

目录 LeetCode之路——206. 反转链表 分析&#xff1a; 解法一&#xff1a;迭代 解法二&#xff1a;递归 LeetCode之路——206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head […

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

SoloX:Android和iOS性能数据的实时采集工具

SoloX&#xff1a;Android和iOS性能数据的实时采集工具 github地址&#xff1a;https://github.com/smart-test-ti/SoloX 最新版本&#xff1a;V2.7.6 一、SoloX简介 SoloX是开源的Android/iOS性能数据的实时采集工具&#xff0c;目前主要功能特点&#xff1a; 无需ROOT/越狱…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思&#xff1f; 推流 主播将本地视频源和音频源推送到云服务器&#xff0c;也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件&#xff0c;观众随时可以观看。 目…

STM32晶振的选择与计算

目录 1、石英晶体特性和型号2、振荡器理论2.1负电阻2.2跨导2.3负阻振荡器原理 3、皮尔斯振荡器设计3.1 皮尔斯振荡器简介3.2反馈电阻器3.3负载电容3.4振荡器跨导3.5驱动电平和外部电阻计算3.5.1计算驱动电平3.5.2另一种驱动电平测量方法3.5.3计算外部电阻 3.6启动时间3.7晶体拉…

八个不可不知的SQL高级方法

结构化查询语言&#xff08;SQL&#xff09;是一种广泛使用的工具&#xff0c;用于管理和操作数据库。基本的SQL查询简单易学&#xff0c;但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数&#xff0c;使您能够对数据执行复杂…

记录:Unity脚本的编写

目录 前言添加脚本到unity编写c#脚本查看效果 前言 在学习软件构造这门课的时候&#xff0c;对unity和c#进行了 一定程度的学习&#xff0c;包括简单的建立地形&#xff0c;添加对象&#xff0c;添加材质等&#xff0c;前不久刚好学习了如何通过c#脚本对模型进行操控&#xff…

uniapp - 微信小程序实现腾讯地图位置标点展示,将指定地点进行标记选点并以一个图片图标展示出来(详细示例源码,一键复制开箱即用)

效果图 在uniapp微信小程序平台端开发,简单快速的实现在地图上进行位置标点功能,使用腾讯地图并进行标点创建和设置(可以自定义标记点的图片)。 你只需要复制代码,改个标记图标和位置即可。

Fiddler Orchestra用户指南:打造高效协同调试利器

引言&#xff1a;今天Fiddler更新到5.0版本后&#xff0c;小酋不经意间晃到了“Fiddler Orchestra”选项卡。爱折腾的小酋赶紧链接到官方用户指南一睹为快&#xff0c;看看这是什么东西&#xff0c;实现了什么新功能。下面是小酋看后做的一个翻译抢先版。 这是了解和设置Fiddl…

《 新手》web前端(axios)后端(java-springboot)对接简解

文章目录 <font color red>1.何为前后端对接?2.对接中关于http的关键点2.1. 请求方法2.2. 请求参数设置简解&#xff1a; 3.对接中的跨域(CROS)问题**为什么后端处理跨域尽量在业务之前进行&#xff1f;**3.总结 1.何为前后端对接? “前后端对接” 是指前端和后端两个…

ElementUI实现增删改功能以及表单验证

目录 前言 BookList.vue action.js 展示效果 前言 本篇还是在之前的基础上&#xff0c;继续完善功能。上一篇完成了数据表格的查询&#xff0c;这一篇完善增删改&#xff0c;以及表单验证。 BookList.vue <template><div class"books" style"pa…

picoctf_2018_can_you_gets_me

picoctf_2018_can_you_gets_me Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX 拿到这么大的程序&#xff0c;直接ROPchain看看 #!/usr/bin/env python2# execve …

低代码工作流程管理系统:提升企业运营效率的利器

业务运营状况是否良好&#xff0c;除了人员需要配合以外&#xff0c;真正发挥作用的是背后的工作流程。将重复的工作进行自动化处理&#xff0c;确保这些流程最终指向同一个目标、实现一致的运营结果。而设计和实施不佳的工作流程则产生相反的效果——导致处理时间延长、运营成…

好题分享

1.Problem - G - Codeforces &#xff08;1&#xff09;题意 &#xff08;2&#xff09;思路 因为最多13次&#xff0c;那么不如我们就问13次&#xff0c;然后考虑把每一个位置重新按二进制拆分成一个下标&#xff0c;因为C(13,6) > 1000,因此在数量上是满足得&#xff0c;我…

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…