**圣杯布局和双飞翼布局都是前端工程师需要日常掌握的重要布局方式。按照我的理解,其实圣杯布局和双飞翼布局的实现,目的都是在于两栏固定宽度,中间部分自适应
但是实际实现起来 还是有一些区别的
**圣杯布局**
图为:
![](https://s1.51cto.com/images/blog/201905/10/6c6c13e0dee7894a8ac85690524c8e77.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
在这里实现了 左(200px)、右(300px)、中间自适应。
**注:**
**html代码中,middle部分首先要放在最前面部分,然后是left、right,以便先行渲染**
**结构:**
![](https://s1.51cto.com/images/blog/201905/10/c3fe1b486355fcf1843aed8b8003c9e6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
首先定义出整个布局的DOM结构,主题部分是由content包裹的middle、left,right三列,其中middle定义在最前面。
**css**
左侧的固定宽度为200px,右侧的固定宽度为300px,则在content上设置
![](https://s1.51cto.com/images/blog/201905/10/ebc7785efa751316eb56a2458b8c44c7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
为左右两列预留出相应的空间
![](https://s1.51cto.com/images/blog/201905/10/fadd×××171c7e231a3ff536aba707.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
然后分别给三列设置宽度与浮动
![](https://s1.51cto.com/images/blog/201905/10/13c0e0a76debba28d5ff965f5a74beaf.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
得到如下效果:
![](https://s1.51cto.com/images/blog/201905/10/d1d45c38aa9407f92ffb477a2a5e0d33.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
根据浮动的特性,middle的宽度为100%,所以占据了第一行的所有空间,left和right被挤到了第二行
接下来将left和right放置到之前预留出的位置
![](https://s1.51cto.com/images/blog/201905/10/8b5fcecb267ed3f32674d916961aea79.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
随后使用定位position:relative,在left、right
原来的位置基础上左移200,右移300
![](https://s1.51cto.com/images/blog/201905/10/04d2f4d8e8e35b4edde8bfab6f84dd9f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
最终效果为:
![](https://s1.51cto.com/images/blog/201905/10/ee74e6d1328fea9713dfefbd4f88cc46.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**到这基本布局效果已经完成,但还是在考虑最后一步,那就是宽的问题,之前为了预留左右位置设置了padding属性,所以这里计算宽的时候不要忘记了这个**
**双飞翼布局**
**还是以上述格局数据为例,设置各列的宽度与浮动,并且预留出空间**
**结构:**
![](https://s1.51cto.com/images/blog/201905/10/a74420abdb92aad3bcfb5ccee3bc5cbe.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**双飞翼布局的DOM结构与圣杯布局的区别是middle还有一个子元素inner**
**css**
![](https://s1.51cto.com/images/blog/201905/10/136de8502eba78d04558a8cd39c82d4e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
最终效果为:
![](https://s1.51cto.com/images/blog/201905/10/0d97062f988ef3af0a4f8a31dca19861.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**由于双飞翼布局没有用到position:relative**
所以不考虑计算宽度,预留多少空间,就设置多少空间
**如果,您认为阅读这篇博客让你有些收获,请您关注一下。感谢您的支持,如有不足,请多指教。**
**微信号:bsl521921**