CSS 左边固定宽右边自适应的6种方法


Posted in HTML / CSS onMay 15, 2022

这是一道面试题,你有多少种办法呢?

这里我们假设左边名为 left,宽度为 200 px,右边名为 right。即默认

.left {
  width: 200px;
}

我的理解分四大类

  • flex 布局

    • 需设置父元素高度
  • grid 布局

    • 需设置父元素高度
  • 绝对定位

    • 双子元素 absolute

      • 不需要设置父元素高度
      • 子元素都设置高度,右边子元素 left:200px + width: 100%
    • 左元素 absolute + 右元素 margin-left

      • 不需要设置父元素高度
      • 子元素都设置高度,右边子元素 margin-left: 200px + width: 100%
  • float 浮动

    • 左元素左浮动,右元素不动

      • 无需父元素
      • 左元素需设置宽高和浮动,右元素设置高度即可
    • 左元素左浮动,右元素右浮动

      • 无需父元素
      • 左元素设置宽高和左浮动,右元素设置右浮动以及高和宽(width: calc(100% - 200px)

flex 布局

需要一个父元素做 flex 布局,且需要给它一个高度(撑开容器)

.father {
  display: flex;
  height: 200px;
}
.right {
  flex: 1;
}

grid 布局

高级的布局方式,子元素不需要设置宽度,单单设置父元素属性即可。

.grid {
  display: grid;
  grid-template-columns: 200px 100%;
  height: 200px;
}

双子元素 + absolute

需要给子元素设置宽高,不然撑不起来。右元素设置left: 200px

.father {
  position: relative;
  height: 200px;
}
.left {
  position: absolute;
  height: 200px;
}
.right {
  position: absolute;
  left: 200px;
  height: 200px;
  width: 100%;
}

左元素 absolute + 右元素 margin-left

.father {
  position: relative;
  height: 200px;
}
.left {
  position: absolute;
  width: 200px;
  height: 200px;
}
.right {
  width: 100%;
  height: 200px;
  margin-left: 200px;
}

无父元素 + 左元素左浮动,右元素不动

前两种都需要有个父元素,但浮动不需要

左边浮动,下一个元素独占位置,并排一行

同样,需要设置高度,子元素才能撑开

.left {
  float: left;
  height: 200px;
}
.right {
  height: 200px;
}

无父元素 + 左边左浮动,右边有浮动

浮动不需要父元素,浮动就区别于正常文档流

我的理解是正常文档流是二维层面,而浮动相当于成了三维,区别于 Z 轴

右边元素有浮动不够,还需要设置宽度

.left {
  float: left;
  height: 200px;
}

.right {
  float: right;
  height: 200px;
  width: calc(100% - 200px);
}

只要是 float 实现此功能的,都不需要父元素,以及自身都需要设置高度

总结

简单来说,实现布局最好的方式是 flex,简单兼容现代浏览器和机型。当然,我是因为还没有学 grid(但 grid 要记得参数比较多)。绝对定位和浮动各有优缺点

各大方法 优缺点 需要什么
flex 布局简单 需要父元素、高度。子项 flex:1
grid 布局最简单,但兼容性更现代 只需要父元素设置属性就好
绝对定位 兼容性更高 需要父元素做相对定位、高度
浮动 兼容性更高 不需要父元素,子项都需要宽高

float 区别于其他三种,不需要父元素做容器

grid 区别于其他三种,不需要设置子元素(左元素的)宽

绝对定位区别于其他三种,它的方法不仅要父元素有高,其子元素也要有高

flex 最简单

到此这篇关于左边固定宽右边自适应的6种方法的文章就介绍到这了!

 
HTML / CSS 相关文章推荐
详解CSS3 弹性布局快速入门
Jun 06 HTML / CSS
CSS3的文字阴影—text-shadow的使用方法
Dec 25 HTML / CSS
使用CSS Grid布局实现网格的流动
Dec 30 HTML / CSS
CSS3制作苹果风格键盘特效
Feb 26 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
May 10 HTML / CSS
CSS3实现彩色进度条动画的示例
Oct 29 HTML / CSS
前端canvas水印快速制作(附完整代码)
Sep 19 HTML / CSS
html5利用canvas实现颜色容差抠图功能
Dec 23 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
Apr 07 HTML / CSS
详解HTML5中CSS外观属性
Sep 10 HTML / CSS
CSS3实现列表无限滚动/轮播效果
Jun 23 HTML / CSS
什么是clearfix (一文搞清楚css清除浮动clearfix)
May 21 HTML / CSS
解决flex布局中子项目尺寸不受flex-shrink限制
May 11 #HTML / CSS
css3 选择器
May 11 #HTML / CSS
六个好看实用的 HTML + CSS 后台登录入口页面
HTML CSS 一个标签实现带动画的抖音LOGO
常用的文件对应的MIME类型汇总
Apr 26 #HTML / CSS
通过feDisplacementMap和feImage实现水波特效
什么是css原子化,有什么用?
Apr 24 #HTML / CSS
You might like
无线电广播的开始
2002/01/30 无线电
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
js正则表达式的使用详解
2013/07/09 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
python del()函数用法
2013/03/24 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
Python WEB应用部署的实现方法
2019/01/02 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
python中os.remove()用法及注意事项
2021/01/31 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
SQL注入攻击的种类有哪些
2013/12/30 面试题
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
消防先进事迹材料
2014/02/10 职场文书
Python实现学生管理系统(面向对象版)
2021/06/24 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL
服务器nginx权限被拒绝解决案例
2022/09/23 Servers