当前位置: 首页 > 科技观察

CSS 实现可拉伸调整尺寸的分栏布局

时间:2023-03-12 11:34:32 科技观察

CSS实现了列布局可以拉伸和调整大小的特性,比如vscode。vscode抽象出来,其实就是这么一个布局,左右,上下都可以调整,如下:可伸缩可调的分栏布局大家也可以先看看实际效果:CSSStretchableColumnLayout2(juejin.cn)[1]。是不是很灵活?其实纯CSS也能达到这样的效果,一起来看看吧!一、基本实现原理要实现这个效果,需要用到resize特性,自然可以实现元素的拉伸特性。最常见的是textarea,默认可以拉伸。textareresize不过,这里我们需要的不是textarea,而是普通元素。对于普通元素也很容易实现这个效果,只需要在溢出不可见的时候加上resize属性即可。.resizable{调整大小:两者;overflow:scroll;}resize原理这么简单,那么怎么用呢?2.自定义右下角。虽然resize好像是可以拉伸的,但是可拉伸的范围太小了。如何增加伸缩范围?思路有两种:通过伪元素自定义容器的整体缩放先说第一种方式。要定义大小,首先需要了解resize指的是什么。经过简单的测试,发现在chrome中,resize其实是水平和垂直滚动条的结合处,比如直接设置滚动条的大小。::-webkit-scrollbar{宽度:20px;高度:20px;background-color:rosybrown;}resize其实就是滚动条的交界处。现在增加滚动条的高度:::-webkit-scrollbar{width:20px;高度:100px;background-color:rosybrown;}可以看到resize也变了。修改调整大小。当滚动条的高度足够大时,右边就变成了整个可以拉伸的条。::-webkit-scrollbar{宽度:20px;高度:100vh;background-color:rosybrown;}调整整个列的大小然后,这个斜杠条纹可以用伪元素::-webkit-resizer修改。div::-webkit-resizer{background-color:royalblue;}自定义resize颜色不幸的是,这个方法只适用于-webkit-浏览器,所以firefox是行不通的。再来看第二个思路:整体缩放。这里所说的整体放大是指通过transform将整个容器放大,这样右下角的resize也会放大,例如:div{width:300px;高度:20px;变换:scaleY(100);/*足够大的放大倍率*/overflow:scroll;resize:horizo??ntal;}通过transfrom放大resize,使整个边都可以拉伸。让我们看看实际应用吧!3、分步实现两栏拉伸布局,先实现两栏布局。例如:两列布局通常有一定的约束。比如这里的MAIN是自适应空间,SIDE是固定大小。第一,快速编写布局和样式;

MAIN
关键样式如下:.con{display:flex;}aside{width:200px;}main{flex:1;}那么,如何让左边栏的右边拖动功能呢?这很简单。把刚才的可伸缩元素放到侧边栏里,让宽度由里面的伸缩元素决定(flex子元素自然支持这个特性),用绝对定位覆盖内容。实现,实现如下:
SIDE
因为firefox的resize不能自动定义,所以这里用一个单独的label来模拟拉伸轴。aside{位置:相对;溢出:隐藏;}.resize{宽度:200px;高度:16px;变换:scaleY(100);溢出:滚动;调整大小:水平;不透明度:0;}.line{位置:绝对;:0;右:0;宽度:4px;底部:0;背景色:宝蓝色;不透明度:0;过渡:.3s;pointer-events:none;}.resize:hover+.line,.resize:active+.line{opacity:1;}这样就实现了拉伸左侧边栏的功能。二栏可伸缩布局四、三栏可伸缩布局有时两边会有侧边栏,中间部分自适应,如下:如何实现三栏布局?首先,遵循双列布局的思路。
SIDE
SIDE
但这会有一个明显的问题。由于resize在右边,如果放在右边的sidebar上,肯定是相反的。具体表现为向右拉伸会增加右侧边栏的尺寸。不直观。有什么办法可以使调整大小向左?首先想到的是通过翻转变换。水平方向的翻转可以用scaleX(-1)来实现,结合起来。.right.resize{transform:scale(-1,100);}在Chrome中运行良好Chrome运行良好,但Firefox有点奇怪。Firefox效果是向右拖动,右侧边栏的宽度反而增加了。原因是在Firefox上,transform的水平翻转只是改变了视觉效果,并没有改变交互行为。有没有办法真正改变调整大小的位置?可以,但只能改变水平方向的位置。通过方向属性。这是一个可以改变文档流向的属性。有的语言方向是从右到左,所以设置后resize也是从右到左变化。按方向更改调整大小位置,以便实现。.right.resize{direction:rtl;}这样Chrome和Firefox都正常了。Firefox效果的完整代码可以访问:CSSStretchableColumnLayout(codepen.io)[2]或CSSStretchableColumnLayout(juejin.cn)[3]。5.其他组合柱效应组合柱效应在垂直方向是不可或缺的。垂直方向的列划分与水平方向类似,只要水平方向的缩放足够大即可。.resize-top{宽度:16px;调整大小:垂直;transform:scaleX(100);}现在可以尝试实现文章开头的布局效果了。
主要
bottom
但是有个缺陷就是resize不能通过方向或者其他方式真正的从底部移动到顶部。在Firefox下,resize不能移动到顶部,只能通过transform:scale(-1,100);实现,导致在Firefox下垂直拉伸的体验很差。效果如下:Chrome性能完美:Chrome效果Firefox性能不理想:Firefox效果(垂直方向不理想)完整代码可以访问:CSSStretchableColumnLayout2(codepen.io)[4]orCSS可伸缩列布局2(juejin.cn)[5]。继续调整,也可以达到这样的布局效果。完整代码可以访问:CSSStretchableColumnLayout3(codepen.io)[6]或CSSStretchableColumnLayout3(juejin.cn)[7]。6.综上所述,以上四种常见的列伸缩效果都是通过纯CSS实现的,基本可以满足常见的布局需求。是不是很实用?下面总结了一些要点。实现原理是CSS的resize属性;resize生效的条件是overflow不可见;resize实际上是Chrome下水平和垂直滚动条的交集,改变滚动条的大小可以改变resize的大小;调整大小也可以通过缩放整个容器来实现;resize默认在右下角,可以水平调整翻转到左下角,Chrome完美支持拉伸,而Firefox不行;也可以通过direction改变文档流向的方式,将resize从右下角改为左下角;verticalresize只能通过transformflipping来实现,所以Firefox体验比较差。不同之处。Firefox虽然在垂直方向略有瑕疵,但如果你对兼容性没有太大需求,比如公司内部项目、Electron应用等,那就大胆使用吧,不要被兼容性所束缚.