当前位置: 首页 > news >正文

使用纯CSS 实现 侧边栏 拖拽效果

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、效果实现原理
  • 二、代码演示
  • 三.简单解释下样式
  • 四 完整的DEMO
  • 总结


前言

`

有不少需求是要拖动改变侧边栏宽高的,以下就是在不适用js ,只使用css 的情况下实现这个效果


一、效果实现原理

使用 textarea 标签的多行文本输入的时候,相信大家看到右下角有块儿区域可以拖动改变 输入框的大小,本次的效果就是使用了这个特性。

二、代码演示

HTML 结构

<div class="columns-box">
	<div class="column-left">
		<!-- 拖拽拖拽触发DOM -->
		<div class="column-resize-bar"></div>
		<!-- 拖拽高亮线条展示 -->
		<div class="resize-line"></div>
		<!-- 左侧内容 展示区域 -->
		<div class="column-left-inner"></div>
	</div>
	<!-- 右侧区域内容 -->
	<div class="column-right"></div>
</div>

CSS 样式 使用 SASS 语法

.columns-box {
    border: 1px solid #666666;
    box-sizing: border-box;
    height: 100%;
    display: flex;
    align-items: stretch;
    > .column-left {
        height: 100%;
        border-right: 1px solid #ff0000;
        min-width: 20px;
        position: relative;
        z-index: 1;
        > .column-resize-bar {
            width: 140px;
            height: 100%;
            min-width: 20px;
            padding-right: 4px;
            box-sizing: content-box;
            max-width: 500px;
            margin-right: -4px;
            resize: horizontal;
            overflow: scroll;
            opacity: 0;
            cursor: e-resize;
            cursor: col-resize;
            &::-webkit-scrollbar {
                width: 20px;
                height: 100vh;
            }
            &:hover {
                + .resize-line {
                    opacity: 1;
                }
            }
        }
        > .resize-line {
            opacity: 0;
            position: absolute;
            top: 0;
            right: -4px;
            bottom: 0;
            width: 4px;
            background-color: #A5B1FF;
            pointer-events: none;
        }
        > .column-left-inner {
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }
    }
    > .column-right {
        flex: 1;
        height: 100%;
        width: 0;
        /* min-width: 0; */
    }
}

三.简单解释下样式

HTML 结构比较简单,就不过多解释,CSS 还是有几行的,稍微解释下

.columns-box 整个可拖拽结构的容器,设置了 flex 属性,里面两个dom,一个.column-left,一个.column-right.column-left 这个dom主要控制左侧宽度,右侧的默认填充满剩余空间,实现原理就是 flex-grow 的效果 ,可以看这篇文章,相对于文章里的介绍只是改变了排列方向,flex-direction: row; 默认值

.column-resize-bar 前面我们说了根据 textarea 效果实现,这里直接使用的 div 通过设置 resize: horizontal; 样式,让它也能拖动大小,通过拖动 它 撑开 .column-left 这个左侧容器,实现完整效果。

.resize-line 是拖拽可以使用时触发的展示效果,也可以不要,因为已经设置过 cursor 效果,只是没那么好看


四 完整的DEMO

使用纯CSS 实现 侧边栏 拖拽效果

总结

样式里面还有一些细节,比如可拖拽的范围只能通过滚动条的宽度设置,必须设置 overflow: scroll 才会显示拖拽的范围等,具体其他的细节可以详细看看CSS 代码,上方demo 中有完整的使用效果。

以上信息如有疏漏或错误欢迎指正,谢谢。

相关文章:

  • 【15】单片机编程核心技巧:逻辑运算与位操作实战
  • Android UI 组件系列(二):Button 使用详解与常见属性
  • 全链条自研可控|江波龙汽车存储“双轮驱动”体系亮相MemoryS 2025
  • Pytesseract识别图片
  • 12 DHCP的内容和HTTP的改良
  • LeetCode27移除元素
  • Android12 使用自定义签名key替换系统默认testkey
  • 上下分层、左右分离的驱动设计思想
  • PMP–知识卡片--情商组成部分
  • java 手搓一个http工具类请求传body
  • Three.js中BufferGeometry 和 BoxGeometry
  • 网络变压器的主要电性参数与测试方法(4)
  • Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航
  • Android Glide 缓存模块源码深度解析
  • SpringBoot缓存抽象:@Cacheable与缓存管理器配置
  • Vite项目中vite.config.js中为什么只能使用process.env,无法使用import.meta.env?
  • SpringCloud Alibaba——入门简介
  • 利用ArcGIS Pro进行爆炸波及建筑分析:详细步骤与技巧
  • 鸿蒙模拟器运行NDK项目失败 9568347
  • 【ai塔罗牌-生命之树】【azure openai】【python】交互塔罗牌demo
  • 文化润疆|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动
  • 阿坝州委书记徐芝文已任四川省政府党组成员
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 外交部就习近平主席将出席中拉论坛第四届部长级会议开幕式介绍情况
  • 富家罹盗与财富迷思:《西游记》与《蜃楼志》中的强盗案