css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
     <!-- flex实现 -->
    <div style="display: flex;height:100%">
        <div style="background-color: red;width:100px;%">
            1
        </div>
        <div style="background-color: blue;flex:1 0 0">
            2
        </div>
    </div>
    <!-- grid实现 -->
    <div style="display: grid;width:100vw;grid-template-columns:200px auto">
        <div style="background-color: green;">
            1
        </div>
        <div style="background-color: black;">
            2
        </div>
    </div>
    
    f <!-- float实现 -->
    <div>
        <div style="float: left;background-color:chocolate;width:100px">
            1
        </div>
        <!-- margin-left使得内容不会占据左侧高度 -->
        <div style="background-color: yellow;margin-left:100px">
          2
        </div>
    </div>
</body>
</html>

三栏布局

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div style="display: flex;">
        <div style="background: red;width:100px">
            1
        </div>
        <div style="flex:1;background: yellow;">
            2
        </div>
        <div style="width:100px;background: blue;">
            3
        </div>
    </div>
    <div style="display: grid;grid-template-columns:100px 1fr 100px">
        <div style="background:green">1</div>
        <div style="background:black">2</div>
        <div style="background:red"> 3</div>
    </div>
	
    <div style="margin-top: 100px;">
        <div style="background:green;float:left;width:100px">1</div>
        <div style="background:red;float:right;width:100px"> 3</div>
        <!-- 中间一栏必须放到最后 -->
        <!-- 如何放到中间,会导致float:right换行 -->
        <div style="background:yellow;margin-left:100px;margin-right:100px">2</div>
    </div>
</body>

</html>

圣杯布局

圣杯布局要求
  • header和footer各自占领屏幕所有宽度,高度固定。
  • 中间的container是一个三栏布局。三栏布局两侧宽度固定不变,中间部分自动填充整个区域。
  • 中间部分的高度是三栏中最高的区域的高度。
  • 中间部分最先渲染

因为中间部分最先渲染,就需要把中间部分写在html中左右前面

左侧的栏目偏移量等于 right偏移自身元素+margin-left:-100%(父元素的大小)

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>圣杯布局</title>

</head>

<body>
    <style>
        #header {
            width: 100vw;
            background-color: red;
        }

        #middle {
            padding: 0 100px;
            overflow: hidden;
        }

        .column {
            float: left;
        }

        #center {
            background-color: pink;
            width: 100%;
        }

        #left {
            background-color: blue;
            margin-left: -100%;
            position: relative;
            width: 100px;
            right: 100px
        }

        #right {
            background-color: green;
            margin-right: -100px;
            width: 100px;
        }

        #footer {
            width: 100vw;
            background-color: yellow;
        }
    </style>
    <div id="header">header</div>
    <div id="middle">
        <div id="center" class="column">
            center
        </div>
        <div id="left" class="column">
            left
        </div>
        <div id="right" class="column">
            right
        </div>
    </div>
    <div id="footer">footer</div>
</body>

</html>

对于margin左右两边设置负责可以参考以下

可以看到,设置 margin-right 负值后,橙色方块 自身不动,但其右边的灰色方块 向左偏移

css 复制代码
#container{
    display: flex;
}

#left{
    margin-right: -20px;
}
设置负值的现象
margin-left 自身向左移动
margin-top 自身向上移动
margin-right 自身不动,其右边元素向左移动
margin-bottom 自身不动,其下方元素向上移动

双飞翼布局

  • 中间的container是一个三栏布局。
  • 三栏布局两侧宽度固定不变,中间部分自动填充整个区域。
  • 中间部分的高度是三栏中最高的区域的高度。
  • 中间部分的背景包括左右两边
  • 中间部分的内容最先渲染

所以和三栏布局的最大不同就是中间部分要在最前面

大体实现和圣杯布局差不多,主要就是使用padding限制中间盒子的内容,圣杯布局使用margin限制和两边盒子的距离

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <div style="background:blue;float: left;width:100%">
            <!-- div的content会被覆盖掉 -->
            <div style="padding: 0 100px;">
                main
            </div>
        </div>
        <!-- 整个元素偏移 -->
        <div style="width:100px;float:left;background:red;margin-left:-100%">22222</div>
        <div style="float: left;background:yellow;width:100px;margin-left:-100px">3</div>
    </div>
</body>

</html>

css三角形

CSS绘制三角形主要用到的是border属性,也就是边框。

平时在给盒子设置边框时,往往都设置很窄,就可能误以为边框是由矩形组成的。实际上,border属性是右三角形组成的,下面看一个例子:

css 复制代码
div {
    width: 0;
    height: 0;
    border: 100px solid;
    border-color: orange blue red green;
}

将元素的长宽都设置为0,显示出来的效果是这样的: 所以可以根据border这个特性来绘制三角形:

css 复制代码
div {    
    width: 0;  
    height: 0;   
    border-left: 50px solid red;  
    border-top: 50px solid transparent; //透明
    border-bottom: 50px solid transparent;//透明
}

为什么需要 border-topborder-bottom

  • 形成三角形的斜边
    • 当你设置了 border-left 为有颜色(比如红色)的边框时,它会成为三角形的一个直角边
    • 通过设置 **透明的 border-top**border-bottom,这两个透明的边框会让整个元素看起来像是一个"尖锐的顶端",从而形成一个三角形的外观。
  • 保持元素的比例
    • 如果只有 border-left 而没有上下透明的边框,元素本身不会有高度,只有边框的颜色会显示出来。没有透明的上下边框,红色的左边框会被压缩或拉伸,无法形成一个完整的三角形形状。
相关推荐
2401_8976056520 分钟前
星动纪元ERA-42:端到端原生机器人大模型的里程碑式突破
前端·人工智能·机器人
祁许40 分钟前
【Vue】在Vue3中使用Echarts的示例 两种方法
前端·vue.js·typescript·vue·echarts
码上飞扬1 小时前
Vue 3 30天精进之旅:Day 21 - 项目实践:打造功能完备的Todo应用
前端·javascript·vue.js
大梦一厂1 小时前
Vue的数据为什么频繁变化但只会更新一次
前端·javascript·vue.js
打野赵怀真1 小时前
DOM0、DOM2、DOM3事件处理方式的区别是什么?
前端·javascript
bin91532 小时前
DeepSeek 助力 Vue 开发:打造丝滑的进度条
前端·javascript·vue.js·deepseek
轻口味2 小时前
Vue.js 与第三方插件的集成
前端·javascript·vue.js
斯~内克2 小时前
现代前端开发的演进与未来趋势:从工具革新到技术突破
前端
Loong_DQX3 小时前
[前端] axios网络请求二次封装
前端·axios·ts
还是鼠鼠3 小时前
(案例)如何使用 XMLHttpRequest 发送带查询参数的请求查询地区
前端·javascript·vscode·ajax·前端框架·html5