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

应用开发2025-11-05 13:50:5994

很多页面布局,拉伸栏布特别是调整的分那种工具类的、比如编辑器、尺寸可视化平台等,拉伸栏布为了充分的调整的分利用屏幕空间,都会提供拖拽调节各个分栏尺寸的尺寸功能,比如像 vscode。拉伸栏布

vscode

抽象开来,调整的分其实就是尺寸这样一个布局,左右、拉伸栏布上下都是调整的分可以调整的,如下:

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

你也可以先看实际效果:CSS 可拉伸分栏布局 2(juejin.cn)[1]。

是拉伸栏布不是非常灵活呢?其实纯 CSS 也是可以实现这样的效果的,一起看看吧!调整的分

一、尺寸基本实现原理

实现这个效果需要借助 resize 特性,源码库可以天然的实现元素拉伸特性。最常见的就是 textarea,默认就是可以拉伸的。

<textarea></textarea>

textare resize

不过,我们这里需要的不是textarea,而是普通的元素。普通的元素要实现这样的效果也很容易,只需要在overflow不是visible的情况下,添加resize属性就行了。

.resizable {

resize: both;

overflow: scroll;

}

resize

原理就是这么简单,那么如何运用呢?

二、自定义右下角 resize

虽然看似可以拉伸,但是可拉伸范围实在是太小了。该如何增加可拉伸范围呢?这里有两种思路:

通过伪元素自定义容器整体放大

先说第一种思路。要定义尺寸,首先需要搞明白 resize指的是免费源码下载什么?经过简单的测试发现,在 chrome 中,resize其实就是横纵滚动条的交界处,比如直接设置滚动条的尺寸。

::-webkit-scrollbar {

width: 20px;

height: 20px;

background-color: rosybrown;

}

resize 其实是滚动条交界处

现在将滚动条高度改大一点:

::-webkit-scrollbar {

width: 20px;

height: 100px;

background-color: rosybrown;

}

可以看到 resize也跟着变化了。

修改 resize 尺寸

当滚动条高度足够大时,右侧就变成整条都可以拉伸了。

::-webkit-scrollbar {

width: 20px;

height: 100vh;

background-color: rosybrown;

}

整列的resize

然后,这个斜线条纹可以用伪元素::-webkit-resizer来修改。

div::-webkit-resizer{

background-color: royalblue;

}

自定义 resize 颜色

不过遗憾的是,这种方式只适合-webkit-浏览器,所以firefox就不行了。

下面来看第二种思路:整体放大。

这里说的整体放大,指的是将整个容器通过transform进行放大,这样一来,右下角的resize也会跟随放大了,比如:

div{

width: 300px;

height: 20px;

transform: scaleY(100);/*足够大的放大倍数*/

overflow: scroll;

resize: horizontal;

}

通过 transfrom 整体放大resize

这样也能达到整条侧边都可以拉伸的目的了。服务器托管

下面来看实际应用吧!

三、两栏拉伸布局

循序渐进,先实现两栏布局。比如这样:

两栏布局

通常这类布局都有一定的约束,比如这里的 MAIN是自适应空间的,SIDE是固定尺寸,先快速写出布局和样式;

SIDE

MAIN

</div>

关键样式如下:

.con{

display: flex;

}

aside{

width: 200px;

}

main{

flex: 1;

}

那么,如何让左边侧边栏居右拖拽功能呢?很简单,将刚才可拉伸的元素放入侧边栏,让宽度由里面的拉伸元素决定(flex 子元素天然支持该特性),内容则用绝对定位覆盖来实现,实现如下:

SIDE
</aside>

由于 firefox的resize无法自定义,所以这里单独一个标签来模拟拉伸轴。

aside{

position: relative;

overflow: hidden;

}

.resize{

width: 200px;

height: 16px;

transform: scaleY(100);

overflow: scroll;

resize: horizontal;

opacity: 0;

}

.line{

position: absolute;

top: 0;

right: 0;

width: 4px;

bottom: 0;

background-color: royalblue;

opacity: 0;

transition: .3s;

pointer-events: none;

}

.resize:hover+.line,

.resize:active+.line{

opacity: 1;

}

这样就实现了左边侧边栏拉伸的功能。

两栏可拉伸布局

四、三栏拉伸布局

有时候会出现两边侧边栏,中间部分是自适应的,如下:

三栏布局

这种如何实现呢?首先按照两栏布局的思路。

SIDE

MAIN

SIDE
</div>

不过这样会有一个很明显的问题,由于resize是在右侧,如果放在右边侧边栏,那肯定就相反了,具体表现就是,往右拉伸,右侧边栏反而增大,不符合直觉。

有没有什么办法让resize到左边来呢?

首先想到的是通过翻转变换,水平方向上翻转可以scaleX(-1)来实现,合并起来就是。

.right .resize{

transform: scale(-1, 100);

}

在 Chrome 下表现不错

Chrome 效果

但是,Firefox 就有点奇怪了。

Firefox 效果

朝右边拖拽,右侧边栏宽度反而增加。究其原因,在 Firefox上,transform水平翻转仅仅改变了视觉上的效果,并没有改变交互行为,有没有办法可以真正改变resize的位置呢?

还真有,不过仅可以改变水平方向上的位置,通过direction属性。这是一个可以改变文档方向流的属性,有些语言方向是从右往左的,所以设置后,resize 也从右侧变到了左侧。

通过 direction 改变resize 位置

所以实现就是。

.right .resize{

direction: rtl;

}

这样下来,Chrome 和 Firefox 均正常了。

Firefox 效果

完整代码可以访问:CSS 可拉伸分栏布局 (codepen.io)[2]或者CSS 可拉伸分栏布局 (juejin.cn)[3]。

五、其他组合分栏效果

组合分栏效果少不了垂直方向上的。

垂直方向的分栏和水平方向大同小异,只需要水平方向上缩放足够大就行了。

.resize-top{

width: 16px;

resize: vertical;

transform: scaleX(100);

}

现在可以尝试实现文章开头布局效果。

SIDE

MAIN

bottom
</div>

不过有个缺陷就是,无法通过direction或者其他手段,将resize真正地从下移到上面。

Firefox 下无法将 resize 移到顶部

只能通过transform: scale(-1, 100);实现了,这样就导致垂直方向上的拉伸在 Firefox 体验不佳。效果如下:

Chrome 表现完美:

Chrome 效果

Firefox 表现差强人意:

Firefox效果(垂直方向不理想)

完整代码可以访问:CSS 可拉伸分栏布局 2(codepen.io)[4] 或者CSS 可拉伸分栏布局 2(juejin.cn)[5]。

继续调整一下,还可以实现这样的布局效果。

完整代码可以访问:CSS 可拉伸分栏布局 3(codepen.io)[6] 或者CSS 可拉伸分栏布局 3(juejin.cn)[7]。

六、总结一下

以上就通过纯 CSS 实现了4种常见的分栏拉伸效果,基本能满足常见的布局需求了,是不是非常实用呢?下面总结一些要点

实现原理是 CSS resize 属性;resize 生效的条件是 overflow 不能是 visible;resize 在 Chrome 下其实是横纵滚动条的交汇处,改变滚动条尺寸可以改变 resize 大小;resize 还可以通过缩放整体容器来实现;resize 默认是在右下角,可以通过水平翻转到左下角,Chrome 完美支持拉伸,Firefox 不行;还可以通过 direction 改变文档流的方式,将 resize 从右下角变到左下角;垂直方向上 resize 只能通过 transform 翻转方式实现,因此 Firefox 体验较差。

虽然 Firefox 在垂直方向上略有缺陷,如果你对兼容性没太多需求,比如公司内部项目,Electron 应用等,那就放心大胆的使用吧,千万不要被兼容性束缚了你的思维。

本文地址:http://www.bzuk.cn/html/1b39499604.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

圣迪威充电器(解放你的充电困扰,体验圣迪威充电器的卓越性能)

舒尔蓝牙动铁耳机的音质与性能如何?(一探舒尔蓝牙动铁耳机的出色音质和卓越性能)

三星S24E310HL显示器的性能和特点详解(三星S24E310HL显示器)

将显示器转变为电视机的方法及优势(以显示器作为电视机使用的关键步骤和注意事项)

关于iptables有价值的信息很多,但是大多都描述的很复杂。假如你想做些基本的配置,下面的 How To 很适合你。 # iptables -L 列出您当前iptables中在规则。假如您是刚刚建立您的服务器,那么可能此时还没有任何规则,而且您应该看到如下: Chain INPUT (policy ACCEPT) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) ◆ 允许建立会话 我们可以允许建立会话来接受流量: # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ◆ 在指定端口上允许入站流量 阻断所有流量您也可以启动系统,但是您可能正在通过SSH工作,所有在您阻断其他流量前有必要允许SSH流量。 为了在22端口号(默认的SSH端口)上的允许流量入站,您可以告诉iptables允许您的网卡接受所有的目的端口为22的TCP流量。 # iptables -A INPUT -p tcp -I eth0 --dport ssh -j ACCEPT 特别的,这将向表中追加(-A)INPUT规则,允许目的端口号为SSH的所有流量进入接口(-i) eth0,以便iptables完成跳转(-j)或动作:ACCEPT 让我们核对下这些规则:(这里仅显示了少数行,您应该看到更多) # iptables -L 现在,让我们允许所有的web流量 # iptables -A INPUT -p tcp -I eth0 --dport 80 -j ACCEPT 检查我们现有的规则 # iptables -L 我们已经指定SSH和web端口为允许通过的TCP流量,但是因为我们还没阻断任何流量,所以到目前为止所有的流量仍然可以进入。 ◆ 阻断流量 一旦一条规则对一个包进行了匹配,其他规则不再对这个包有效。因为我们的规则首先允许SSH和WEB流量,所以只要我们阻断所有流量的规则紧跟其後,我们依然能接受我们感兴趣的流量。大家要做的仅仅是把阻断所有流量的规则放在最後,所以我们需要再次用到它。 # iptables -A INPUT -j DROP 因为我们刚才没有指定一个接口或一个协议,所以除了web和ssh流量外其他任何流量都会被阻断。 ◆ 编辑 iptables 到目前为止我们设置过程中唯一的问题是回环端口(loopbakc)也被阻断了。我们本可以通过指定 -I eth0 来仅仅丢弃eth0上的数据包,但我们也可以为回环端口(loopback)添加一条规则。假如我们追加这条规则,这将太晚了----因为所有的流量已经 被丢弃。我们必须插入这条跪着到第4行。 # iptables -I INPUT 4 -I lo -j ACCEPT 最後2行看起来几乎一样,因此我们可以让iptables列的更详细些。 # iptables -L -v ◆ 日志记录 在上面的例子中,所有的流量都不会被记录。假如您愿意在syslog中记录被丢弃的包, 下面将是最快捷的方式: # iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix iptables denied: --log-level 7 看 提示 段获得更多关于logging的ideas. ◆ 保存 iptables 假如您现在要重新启动机器的话,您的iptables配置将会消失。为了不用每次重新启动时敲入这些命令,您可以保存你的配置,让它在系统启动时自动启动。你可以通过iptables-save 和iptables-restore命令来保存配置。 保存您的防火墙股则到一个文件 # iptables-save >/etc/iptables.up.rules 接着修改 /etc/network/interfaces 脚本自动应用这些规则(末行是添加的) auto eth0 你也可以准备一组规则冰并自动应用它 auto eth0 ◆ 提示 下面的步骤复习了怎样建立你的防火墙规则,并假定它们相对固定(而且对于大多数人来说它们也应该是)。但是假如你要做许多研究工作,你也许想要你的 iptables在你每次重启时保存一次。你可以在 /etc/network/interfaces 里添加像下面的一行: pre-up iptables-restore < /etc/iptables.up.rules post-down iptables-save >/etc/iptables.up.rules 此行将保存规则用于下次启动时使用。 假如你超出了这个指南来编辑iptables,你可能想利用iptables-save和iptables-restore来编辑和测试你的规则。你可以通过使用你喜爱的文本编辑器(此处为gedit)来打开这些规则文件来完成编辑。 # iptables-save >/etc/iptables.test.rules 你会得到一个如下类似的文件(下面是紧接上的例子文件): # Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006 注意到这些都是减去iptables命令的iptables语句。随意编辑这些命令、完成後保存它们。然後简单的测试下: # iptables-restore < /etc/iptables.test.rules 测试完毕後,假如你还没添加iptables-save命令 到 /etc/network/interfaces 里面,记得不要丢失了你的更改: # iptables-save >/etc/iptables.up.rules ◆ 更详细的日志 # Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006 请注意 一个名为 LOGNDROP的链在文件顶部。而且,INPUT链底部标准的DROP被替换成了LOGNDROP,同时添加了协议描述so it makes sense looking at the log。最後我们在LOGNDROP链尾部丢弃了这些流量。下面的行告诉我们发生了什么: * --limit 设置记录相同规则到syslog中的次数 ◆ 禁用防火墙 假如您要临时禁用防火墙,您可以通过下面的命令清空所偶的规则: # iptables -F ◆ 轻松配置通过 GUI 新手可以利用 Firetarter(一个gui工具)---仓库中的可用软件(新立德或apt-get 获得)来配置她或他的iptables规则,而需要命令行知识。请查看指南,尽管…… 配置很简单,但是对于高级用户来说可能远远不能满足。然而它对于大多数的家庭用户来说是足够的…… 。(我)建议您使用firestarter在策略表中将出站配置为 “限制”,而将您需要的连接类型(如用于http的80、https的443,msn chat的1683等等)加入白名单。您也可以通过它查看进出您计算机的活动连接…… 。防火墙会一直保持下去一旦通过向导配置完毕。拨号用户必须在向导中指定它在拨号时自动启动。 firestarter主页: http://www.fs-security.com/ (再次, 仓库源中可用, 不需要编译) 指南: http://www.fs-security.com/docs/tutorial.php 个人笔记:不幸运的是,它没有阻断(或询问用户)特定应用/程序的选项……。因此,我的理解是一旦启用了80端口(例如,用于访问网页),那么任何程序都可以通过80端口连接任何服务器、做任何它想做的事……

使用U盘安装iOS系统的教程(一步步教你在U盘上安装iOS系统,轻松享受全新体验)

Win10系统启动U盘安装教程(快速安装Win10系统的详细步骤及注意事项)

Touchlet平板(解锁无限可能,Touchlet平板领跑未来科技潮流)

热门文章

友情链接

滇ICP备2023006006号-33