CSS(一) 经典布局(两边固定,中间自适应)的五种方式

news/2024/7/19 13:05:17 标签: css, html, js, 面试, 定位

两边固定,中间自适应

本篇总结五种思路实现方式,

圣杯布局

圣杯布局,方便理解是带有两只耳朵的奖杯,耳朵跟奖杯是一体,所以左右两边跟中间同级,但是content在上面
第一步:中间盒子100%,两边固定宽度,三个盒子依次上下
第二步:子盒子全左浮动 left与right脱离文档流 在第二行
第三步:父级盒子不要给宽度,padding:0 200px;留出左右盒子位置
第四步: left 盒子
(1)margin-left:100% 先将浮动元素向上移动一行文档流‘
(2)position:relative;left:自身宽度 ;微调left位置(此处可以用position:absolute 也行)

第五步:right盒子使用margin-right:自身宽度
第六步:清除浮动,不然可能带来高度塌陷问题

代码如下:

CSS

  <style>
    *{
      margin: 0;
      padding: 0;
    }
    html,body{
      height: 100%;
      overflow: hidden;
    }
 .clearfix:after,.clearfix:before{
        content: "";
        display: table;
    }
    .clearfix:after{
        clear: both;
    }
    .clearfix{
        *zoom: 1;
    }
    .main{
      position: relative;
      padding: 0 200px;
      min-height: 400px;
    }
    .content,.left,.right{
      float: left;
    }
    .content{
      width: 100%;
      min-height: 500px;
      background-color: hotpink;
    }
    .left,.right{
      background-color: greenyellow;
      width: 200px;
      min-height: 300px;
    }
    .left{
      margin-left: -100%;
      position: relative;
      left: -200px;
      /* 
        通过absolute
        position: absolute;   
        left: 0;
       */  
      z-index: 1000;
    }
    .right{
      margin-right: -200px;
    }
  </style>

html

<body>
  <div class="main clearfix">
    <div class="content">content</div>
    <div class="left">left</div>
    <div class="right">right</div>
  </div>
</body>

双飞翼布局

双飞翼布局,左右两边像是翅膀插在两边,像每一个平凡人一样需要借助外部力量才能飞翔。
所以中间 与 左右 不属于同级
left right 像是翅膀 通过margin-left插在左右两边
content 通过margin 调整
第一步:中间父盒子,左右盒子 依次上下排开
第二步:中间父盒子,左右盒子全部脱离文档流,中间父盒子设置100%独占一行
第三步:中间盒子通过margin值调整 margin:0 200px 给左右盒子腾出位置
第四步:left盒子,通过margin-left:-100% 向上一行文档流
第五步:right盒子 通过margin-left:-200px 调整位置
第六步:清除浮动,不然可能带来高度塌陷问题

CSS

  <style>
    *{
      margin: 0;
      padding: 0;
    }
    html,body{
      height: 100%;
      overflow: hidden;
    }

    .clearfix:after,.clearfix:before{
        content: "";
        display: table;
    }
    .clearfix:after{
        clear: both;
    }
    .clearfix{
        *zoom: 1;
    }
    .main,.left,.right{
      float:left;
    }
    .main{
      width: 100%;
      /* min-height: 400px;
      background-color: pink; */

    }
    .content{
      margin: 0 200px;
      height: 500px;
      background-color: pink;

    }
    .left,.right{
      width: 200px;
      height: 300px;
      background-color: greenyellow;
    }
    .left{
      margin-left: -100%;
    }
    .right{
      margin-left: -200px;
    }
  </style>

html

<body class="clearfix">
  <div class="main">
    <div class="content">content</div>
  </div>
  <div class="left">left</div>
  <div class="right">right</div>
</body>

calc()函数

width:calc(100%-400px)
注意:
calc() 函数用于动态计算长度值。
运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
任何长度值都可以使用calc()函数进行计算;
calc()函数支持 “+”, “-”, “*”, “/” 运算;
步骤:
一:左中右 盒子 依次上下排开
二:赋值宽度 left right 200px
中间 100% -400px
三 :子盒子浮动

缺点 只兼容到ie9 计算会阻塞加载 对渲染不友好

CSS

  <style>
    *{
      margin: 0;
      padding: 0;
    }
    html,body{
      height: 100%;
      overflow: hidden;
    }
    .main{
      width: 100%;
    }
    .content,.left,.right{
      float:left;
    }
    .left,.right{
      width: 200px;
      min-height: 300px;
      background-color: greenyellow;
    }
    .content{
      width: calc(100% - 400px);
      min-height: 400px;
      background-color: indianred;
    }
  </style>

html

<body>
  <div class="main">
    <div class="left">left</div>
    <div class="content">content</div>
    <div class="right">right</div>
  </div>
</body>

定位

定位也是比较常见的实现布局的方式
中间盒子 margin:0 200px
左右分别使用定位去到对应为位置即可

html

<body>
  <div class="main">
    <div class="content">content</div>
    <div class="left">left</div>
    <div class="right">right</div>
  </div>
</body>

CSS

  <style>
    *{
      margin: 0;
      padding: 0;
    }
    html,body{
      height: 100%;
      overflow: hidden;
    }
    .main{
      position: relative;
      width: 100%;
      min-height: 400px;
    }
    .content{
      margin: 0 200px;
      min-height: 400px;
      background-color: pink;
    }
    .left,.right{
      position: absolute;
      width: 200px;
      height: 300px;
      background-color: yellowgreen;
    }
    .left{
      left: 0;
      top: 0;
    }
    .right{
      top: 0;
      right: 0;
    }
  </style>

Flex

flex 是个人觉得布局最方便的方式了。而且兼容性也越来越好,代码简洁
父容器 flex 中间盒子flex:1 即可
CSS

  <style>
    *{
      margin: 0;
      padding: 0;
    }
    html,
      body {
        overflow: hidden;
      }
    .box{
      height: 100vh;
      display: flex;

    }
    .left,.right{
      width: 200px;
      min-height: 500px;
      background-color: greenyellow;
    }
    .content{
      background-color: pink;
      min-height: 500px;
      flex: 1;
    }
  </style>

html

<body>
  <div class="box">
    <div class="left">left</div>
    <div class="content">content</div>
    <div class="right">right</div>
  </div>
</body>

总结

实现的方式有很多种,这个问题算是面试比较基础的吧,还有别的方式,像利用table,grid(栅格,有一定兼容性)等来实现
另外布局时,建议尽量减少定位 和 浮动来布局 ,在考虑兼容的同时实现快速布局,推荐flex

是本人第一篇博客,写的比较简单,主要还是为了方便自己闲暇时间可以扫一眼。依次养成一个良好习惯。记得刚入行时,有一个面试官问我,你每天除了工作,主动学习前端技术的时间平均有多少。当时真是充满愧疚哈哈。
代码源自于从一些资料,教程总结,亲测有效。侵删。

全力以赴奔向你le。


http://www.niftyadmin.cn/n/1852448.html

相关文章

45-java中的try--catch的使用

程序运行过程中可能会出现异常情况&#xff0c;比如被0除、对负数计算平方根等&#xff0c;还有可能会出现致命的错误&#xff0c;比如内存不足&#xff0c;磁盘损坏无法读取文件等&#xff0c;对于异常和错误情况的处理&#xff0c;统称为异常处理。 try{……}里面是一些你觉…

前端模板 artTemplate之辅助方法template.helper

var labelMap { onlinePayment:{ label:"在线支付", desc:"支持大部分储蓄卡、信用卡及第三方平台支付", name:"", href:"" }, cashOnDelivery:{ label:"货到付款", desc:"货到付款只支持POS机刷卡支付&#xff0c;不…

揭秘今日头条推荐10万+

我是一个很不喜欢夸张式标题党的运营人。尤其是那些&#xff1a; 《我用1个标题引爆了10w》《我是如何在3天内&#xff0c;吸粉300万》《一场活动0成本&#xff0c;引来用户100万》 这种“深藏不漏”的运营文&#xff0c;不知祸害了多少运营人。天天提着裤子被老板追着分享&a…

46-数组合并和判断集合是否为空的代码以及源代码

package com.xukaiqiang.ArrayList;import java.util.ArrayList; import java.util.List;import org.apache.commons.lang3.ArrayUtils; import org.springframework.util.CollectionUtils;/*** 数组的合并,集合判断是否为空*/ public class App {public static void main(Stri…

sql 优化之:实现小数据量和海量数据的通用分页显示存储过程(系列四)

建立一个web 应用&#xff0c;分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法&#xff0c;也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形&#xff0c;因为游标本身有缺点&a…

ABAP区别CLEAR、REFRESH、FREE

CLEAR、REFRESH、FREE 内表&#xff1a;如果使用有表头行的内表&#xff0c;CLEAR 仅清除表格工作区域。例如 clear gs-school 清除工作区。 要重置整个内表而不清除表格工作区域&#xff0c;使用REFRESH语句或 CLEAR 语句CLEAR <itab>[].&#xff1b;REFRESH加不加中括号…

卢松松支招:要脸和不要脸的品牌推广软文怎么写?

7月8日&#xff0c;卢松松微信公众平台在14点-17点之间做了一次免费的一对一文公益问答&#xff0c;据卢松松在公众号推送的文章《原创&#xff1a;上周微信问答的那些事》提到&#xff0c;这次时间几个小时的公益问答过程中&#xff0c;卢松松共接客300人&#xff0c;回复的信…

MySQL select into outfile用法

select into outfile用法 SELECT ... FROM TABLE_A INTO OUTFILE "/path/to/file" FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY " LINES TERMINATED BY \n; load data infile用法 LOAD DATA INFILE "/path/to/file" INTO TABLE table_name; 注意&…