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

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

时间:2023-04-05 17:24:34 HTML5

CSS实现了一个可以拉伸和调整大小的列布局,会提供拖拽调整每列大小的功能,比如抽象vscode,其实就是这样的布局,大家也可以先看看实际效果:CSSStretchableColumnLayout2(codepen.io)是不是很灵活呢?其实纯CSS也可以达到这样的效果。一起来看看吧。一、基本实现原理要实现这个效果,需要用到resize特性,自然可以实现元素拉伸特性。最常见的是textarea,默认可以拉伸但是,这里我们需要的不是textarea,而是普通的元素。普通元素实现这种效果也很容易,只需要在不可见溢出的时候加上resize属性即可。resizable{resize:both;的原理overflow:scroll;}这么简单,那么怎么用呢?2、自定义右下角resize虽然看起来是可以伸缩的,但是伸缩范围太小了。如何增加伸缩范围?这里有两种思路:通过伪元素自定义容器的整体缩放先说第一种思路。定义size首先要明白resize指的是什么?经过简单的测试,发现在chrome中,resize其实是水平和垂直滚动条的交界处,比如直接设置滚动条的大小::-webkit-scrollbar{width:20px;高度:20px;background-color:rosybrown;}现在增加滚动条的高度::-webkit-scrollbar{width:20px;高度:100px;background-color:rosybrown;}可以看到,当滚动条的高度足够大时,resize也会发生变化,右侧变为Theentirestripcanbestretched::-webkit-scrollbar{width:20px;高度:100vh;background-color:rosybrown;}然后,这个对角条纹可以用伪元素::-webkit-resizerdiv修改::-webkit-resizer{background-color:royalblue;}不幸的是,这种方法只适用于-webkit-浏览器,因此firefox将无法运行。再来看第二个思路:整体缩放。这里说的整体放大是指通过transform将整个容器放大,这样右下角的resize也会放大,比如div{width:300px;高度:20px;transform:scaleY(100);/*足够的放大倍数*/overflow:scroll;resize:horizo??ntal;}这样也可以达到拉伸整个边的目的。让我们来看看实际应用。3、分步实现两栏拉伸布局,先实现两栏布局。例如,这种类型的布局通常有一定的限制。比如这里的MAIN是自适应空间,SIDE是固定大小的。一、快速编写布局和样式

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