可移动的侧边栏

10 篇文章 0 订阅
7 篇文章 0 订阅

还是老样子,学习 CodingStartup起码课的 实现可调侧栏 (点击传送门,可以观看 哔哩哔哩up 的视频),就来写文章了,虽然不是什么很好的文章,但我就是要写 ,哈哈哈。

今天实现的效果是 可移动的侧栏,鼠标点击拖动,页面重新加载时,可以记录上一次调整的大小,让侧栏保持和上一次调整的大小一致 。以下是修改图:

在这里插入图片描述
开始吧!


关键代码:

  • 鼠标点击 mousedown
  • 鼠标移动 mousemove
  • 鼠标松开 mouseup
  • 让页面元素,不能被鼠标选中的样式:user-select:none;
  • 鼠标样式: cursor: col-resize;
  • 获取页面元素的属性: window.getComputedStyle(element).属性
  • 解绑事件: element.removeEventListener('事件类型',事件名)

步骤:

1、鼠标点击时,记录鼠标的 x 坐标,并获取 左侧栏 的宽度;在鼠标点击事件中,绑定2个事件(鼠标移动 和 鼠标松开)。

2、点击移动时,获取移动后的坐标,算出 左边栏的大小。
新左侧栏的大小 = 原左侧栏的大小 + 移动后鼠标的坐标 - 点击时,鼠标的坐标;
这样,移动后鼠标的坐标 - 点击时鼠标的坐标 的值,就是 左移位负,右移位正; 然后,设置左侧栏的大小。

3、鼠标松开时,解除 移动事件 和 松开事件,并记录 新的左侧边栏的大小,然后存储到本地存储中。

4、在页面开头,获取本地存储中的值,判断是否为 null,不为 null 就把 左侧栏 设置为和他一样的大小。


1、 鼠标点击 拖动条 时,记录鼠标的 x 坐标,并获取 左侧栏 的宽度;在鼠标点击事件中,绑定2个事件(鼠标移动 和 鼠标松开)。

// 给 drag 绑定 鼠标点击事件
drag.addEventListener('mousedown', startDrag);

// 点击的事件
function startDrag (e) {
    // 获取点击时的坐标
    startX = e.clientX;

    // 获取左侧栏的宽度,要在点击时获取,不能在移动的时候获取,因为
    // 每移动获取一次,是一个新的宽度,在加上移动的宽度,变化会很大的。
    scalableWidth = getScalable();  // 300

    // 点击时,给 body 添加不可选中样式
    body.style.userSelect = 'none';

    // 给 body 绑定 鼠标移动 和 鼠标松开事件
    body.addEventListener('mousemove', moveDrag);
    body.addEventListener('mouseup', remove);
}

2、点击移动时,获取移动后的坐标,算出 左边栏的大小。

新左侧栏的大小 = 原左侧栏的大小 + 移动后鼠标的坐标 - 点击时,鼠标的坐标

​ 这样,移动后鼠标的坐标 - 点击时鼠标的坐标 的值,就是 左移位负,右移位正;

​ 然后,设置左侧栏的大小。

// 移动的事件
function moveDrag (e) {
    // 计算移动时,左侧栏的宽度
    let newWidth = scalableWidth + e.clientX - startX;

    scalable.style.width = newWidth + 'px';
}

3、鼠标松开时,解除 移动事件 和 松开事件,并记录 新的左侧边栏的大小,然后存储到本地存储中。

// 解绑的事件
function remove () {
    // 给 body 取消不可选中样式
    body.style.userSelect = 'auto';

    // 再次获取左侧栏的宽度,存储到本地存储中
    localStorage.setItem('scalableWidth', getScalable());

    body.removeEventListener('mousemove', moveDrag);
    body.removeEventListener('mouseup', remove)
}

4、在页面开头,获取本地存储中的值,判断是否为 null,不为 null 就把 左侧栏 设置为和他一样的大小。

// 获取本地存储中的左侧栏的宽度,并进行判断,如果有值,就设置为 左侧栏的宽度;
let localWidth = localStorage.getItem('scalableWidth');
if (localWidth !== null) {
    scalable.style.width = localWidth + 'px';
}

全部代码:

<body>
    <!-- 左侧栏 -->
    <div class="scalable">
        <div class="left-content">
            <img src="xxx" alt="">
        </div>
        <!-- 拖动条 -->
        <div class="drag">
            <i></i>
            <i></i>
        </div>
    </div>
    <!-- 内容栏 -->
    <div class="content">
        <div class="right-content">
            holle word
        </div>
    </div>
</body>

<style>
* {
    padding: 0;
    margin: 0;
}

body {
    display: flex;
    min-height: 100vh;
}

/* 左侧栏 */
.scalable {
    position: relative;
    width: 300px;
    min-width: 100px;  /* 设置最小宽度 */
    height: 100vh;
    background-color: beige;
}

/* 拖动条 */
.drag {
    position: absolute;
    top: 0;
    right: -15px;
    width: 15px;
    height: 100vh;
    /* 设置阴影 */
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
    cursor: col-resize;

    display: flex;
    justify-content: center;
    align-items: center;
}

 /* 拖动条 中的2条线 */
.drag i {
    display: inline-block;
    width: 1px;
    height: 20px;
    background-color: #3e3e3e;
}
.drag i:nth-child(1) {
    margin-right: 5px;
}

.left-content {
    padding: 20px;
}
.left-content img {
    width: 100%;
}

.right-content {
    padding: 20px 20px 20px 40px;
}
</style>

<script>
// 获取 body,拖动条 和 左侧栏
let drag = document.querySelector('.drag');
let body = document.querySelector('body');
let scalable = document.querySelector('.scalable');

// 定义变量,记录 点击时的X
let startX, scalableWidth = 0;

// 获取本地存储中的左侧栏的宽度,并进行判断,如果有值,就设置为 左侧栏的宽度;
let localWidth = localStorage.getItem('scalableWidth');
if (localWidth !== null) {
    scalable.style.width = localWidth + 'px';
}

// 给 drag 绑定 鼠标点击事件
drag.addEventListener('mousedown', startDrag);

// 点击的事件
function startDrag (e) {
    // 获取点击时的坐标
    startX = e.clientX;

    // 获取左侧栏的宽度,要在点击时获取,不能在移动的时候获取,因为
    // 每移动获取一次,是一个新的宽度,在加上移动的宽度,变化会很大的。
    // scalableWidth = window.getComputedStyle(scalable).width;  // 300px
    scalableWidth = getScalable();  // 300

    // 点击时,给 body 添加不可选中样式
    body.style.userSelect = 'none';

    // 给 body 绑定 鼠标移动 和 鼠标松开事件
    body.addEventListener('mousemove', moveDrag);
    body.addEventListener('mouseup', remove);
}

// 移动的事件
function moveDrag (e) {
    // 计算移动时,左侧栏的宽度
    let newWidth = scalableWidth + e.clientX - startX;

    scalable.style.width = newWidth + 'px';
}

// 解绑的事件
function remove () {
    // 给 body 取消不可选中样式
    body.style.userSelect = 'auto';

    // 再次获取左侧栏的宽度,存储到本地存储中
    localStorage.setItem('scalableWidth', getScalable());

    body.removeEventListener('mousemove', moveDrag);
    body.removeEventListener('mouseup', remove)
}

// 获取左侧栏的宽度 函数
function getScalable () {
    return parseInt(window.getComputedStyle(scalable).width, 10);
}
</script>

以上 。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值