当前位置: 首页 > Web前端 > CSS

七种实现左侧固定,右侧自适应两栏布局的方法

时间:2023-03-30 18:46:37 CSS

实现左固定,右自适应两列布局的七种方式其中有常见的float方式,BFC方式,还有CSS3的flex布局和grid布局。开发中不会用到所有布局,但也会涉及到一些知识点。关于最终效果,大家可以查看这里常用的宽度自适应方式,通常是利用了块级元素宽度可以随父容器调整的流特性。另一个想法是使用CSS中的calc()方法来动态设置宽度。另一种思路是使用CSS中新的布局flex布局和grid布局。首先创建一个基本的HTML布局和最基本的样式。左边固定宽度,不固定高度



高度可能是很小,也可以很大。

这里的内容可能比左边高,也可能比左边低。宽度需要自适应。
基本样式是两个div间距20px,左边div宽120px。适应。基本的CSS样式如下:.wrapper{padding:15px20px;border:1pxdashed#ff6c60;}.left{width:120px;border:5pxsolid#ddd;}.right{margin-left:20px;border:5pxsolid#ddd;}下面的代码就是基于这组基础代码进行覆盖,通过在容器中添加不同的类来实现效果。双内联块scheme.wrapper-inline-block{box-sizing:content-box;字体大小:0;//消除空格的影响}.wrapper-inline-block.left,.wrapper-inline-block.right{display:inline-block;垂直对齐:顶部;//顶部对齐font-size:14px;box-sizing:border-box;}.??wrapper-inline-block.right{width:calc(100%-140px);}该方法使用width:calc(100%-140px)动态计算右框的宽度.需要知道右框和左框的距离,以及左框的具体宽度(content+padding+border),从而计算出需要减去100%父容器宽度的值。同时,还需要知道右边框的宽度是否包含边框的宽度。这里为了简单的计算出右边框的准确宽度,设置子元素的box-sizing:border-box;和父元素的box-sizing:content-box;。同时,作为两个inline-blockboxes,必须设置vertical-align使其顶部对齐。另外,为了准确应用计算出的宽度,需要消除div之间的空格,可以通过设置父容器的font-size:0;,或者在html中使用注释消除空格。缺点:需要知道左边盒子的宽度,两个盒子之间的距离,设置每个元素的box-sizing,消除空格字符的影响。需要设置vertical-align:top来满足顶部对齐。Doublefloatscheme.wrapper-double-float{overflow:auto;//清除浮动box-sizing:content-box;}.??wrapper-double-float.left,.wrapper-double-float.right{float:left;box-sizing:border-box;}.??wrapper-double-float.right{width:calc(100%-140px);}这个方案的原理和doublefloat的方案一样,都是自己实现-通过动态计算宽度进行自适应。但是由于浮动的块元素如果有空格会相互粘连排成一排,所以不需要设置display:inline-block;,自然也就少了顶部对齐和空格字符等问题占用空间。浮动框向左或向右移动,直到其外边缘接触到包含块边缘或另一个浮动的外边缘。但是由于应用了浮动,父元素需要清除浮动。缺点:需要知道左边盒子的宽度,两个盒子之间的距离,设置每个元素的box-sizing。父元素需要清除浮动。float+margin-leftscheme.wrapper-float{溢出:隐藏;//清除float}.wrapper-float.left{float:left;}.wrapper-float.right{margin-left:150px;}以上两种方案都是利用CSS的calc()函数来计算宽度值。下面两种方案利用了块级元素框的宽度填满父容器并自适应父容器宽度的流动特性。但是块级元素都在一行,所以想办法把两个块排在一起。我们知道块级元素会认为浮动元素不存在,但是内联级元素可以识别浮动元素。这样,块级元素就可以和浮动元素在同一行了。为了让右框和左框保持距离,需要给左框留出足够的距离。这个距离的大小是左边框的宽度和两个框之间的距离之和。然后将该值设置为右框的margin-left。缺点:需要清除浮动,需要计算右框的margin-left。使用absolute+margin-left方式。将两个块排列在一起的另一种方法是使用position:absolute绝对定位左侧框。这样,右边的方框也可以无视了。.wrapper-absolute.left{position:absolute;}.wrapper-absolute.right{margin-left:150px;}缺点:使用绝对定位。如果在div中使用,需要改变父容器的位置。没有办法清除浮动。如果左框高于右框,就会超过父容器的高度。所以这个只能通过设置父容器的min-height来放置。使用float+BFC方法以上方法都需要通过左框的宽度计算出一定的值,下面三种方法不需要计算。只需要设置两个框之间的间距即可。.wrapper-float-bfc{溢出:自动;}.wrapper-float-bfc.left{浮动:左;margin-right:20px;}.wrapper-float-bfc.right{margin-left:0;overflow:auto;}这个方案也是用左浮动,但是右框通过overflow:auto;形成一个BFC,所以右框不会和浮动元素重叠。正常流中建立新块格式上下文的元素(例如具有“溢出”而不是“可见”的元素)不得与元素本身在同一块格式上下文中与任何浮动的边距框重叠。这种情况下,只需要给左边的浮动框设置margin-right,就??可以实现两个框之间的距离。右边的盒子是块级的,所以宽度是可以自适应的。缺点:父元素需要清除浮动flexscheme.wrapper-flex{display:flex;align-items:flex-start;}.wrapper-flex.left{flex:00auto;}.wrapper-flex.right{flex:11auto;}flex可以说是最好的方案,代码更少并且易于使用。总有一天,当每个人都切换到现代浏览器时,它就会起作用。需要注意的是flex容器的一个默认属性值:align-items:stretch;。此属性会产生柱轮廓的效果。为了让两个盒子的高度自动调整,需要设置:align-items:flex-start;网格方案是另一种新的布局方式。它可以满足需要,但这并不是它真正有用的地方。.wrapper-grid{显示:网格;网格模板列:120px1fr;align-items:start;}.wrapper-grid.left,.wrapper-grid.right{box-sizing:border-box;}.??wrapper-grid.left{grid-column:1;}.wrapper-grid.right{grid-column:2;}注意:网格布局也有默认的列高效果。需要设置:align-items:start;。网格布局和flex之间还有一个显着的区别:当使用margin-left时,网格布局默认位于由box-sizing设置的框宽度之间的位置。而flex就是利用两个div之外的border或者padding之间的距离。在极限情况下,我们终于可以看看在父容器的极限较小的情况下,不同方案的表现。主要分为四种情况:动态计算宽度的情况和两种方案:doubleinline-block方案和doublefloat方案。当widthlimit小时,右边的div的宽度会很小,右边的div会移动到下一行,因为它遵循流式布局。动态计算右侧margin-left有两种方案:float+margin-left方案和absolute+margin-left方案。当宽度限制较小时,由于右边的div在文档流中忽略了左边div的存在,所以它仍然会存在于这一行并被隐藏。float+BFC方案的情况这种情况下,由于BFC和float的特殊关系,右边的div在宽度减到最小后也会掉到下一行。以flex和grid为例,在这种情况下,默认的两种布局方式是不会把放不下的div移动到下一行的。但是,flex布局可以使用flex-flow:wrap;将额外的div设置为移动到下一行。目前不支持网格布局。如果觉得文中有不对的地方,欢迎指出。