【前端】实现快速改变内容大小选择框

简言

简单实现选择框改变内容大小和位置。
在这里插入图片描述

内容

这里实现选择框改变内容大小是让内容宽高等于选择框的百分之百,当选择框大小改变时,内容也会响应的改变。
位置则是根据定位实现的。

选择框

选择框就是一个div,然后定位上下左右四条边和其余角,在定位一个移动位置的按钮,一个简单的选择框就好了。
在这里插入图片描述
然后内容就定位到中间就行,宽高等于选择框百分百(当然你也可以选择实时改变内容区域大小)。

改变对应边角等元素的鼠标指示图类型。
在这里插入图片描述
编写逻辑时,一般完整操作就是鼠标点击边-》不松手移动鼠标-》鼠标抬起。

由于边宽或高太小,在鼠标移动时容易移出去,所以,我们给html的body添加移动和抬起事件,边本身添加按下事件开启操作

在这里插入图片描述
由于有多个操作方式,所以我们定义一个全局属性来表示当前操作状态,0表示未开始操作,1-6分别表示各种操作,操作时改变宽高选择框逻辑在mousemove事件下实现。
在这里插入图片描述

左边 和上边 在拖动时,也要实时改变元素的偏移值,这样位置才不会发生改变。

源码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>改变大小</title>
  <style>
    body {
      width: 100vw;
      height: 100vh;
    }

    #drag_wrapper {
      position: absolute;
      top: 100px;
      left: 100px;
      padding: 2px;
      user-select: none;
    }

    .box {
      /* width: 100px;
      height: 100px; */

    }

    .box>*:first-child {

      width: 100%;
      height: 100%;
    }

    .line {
      background: linear-gradient(90deg, #000 0%, #fff 10%) repeat;
    }

    .top {
      position: absolute;
      top: 0px;
      left: 0px;
      width: 100%;
      border-top: 2px dashed #000;
      cursor: ns-resize;
    }

    .bottom {
      position: absolute;
      bottom: 0px;
      left: 0px;
      width: 100%;
      border-bottom: 2px dashed #000;
      cursor: ns-resize;

    }

    .right {
      position: absolute;
      top: 0px;
      right: 0px;
      height: 100%;
      border-right: 2px dashed #000;
      cursor: ew-resize;
    }

    .left {
      position: absolute;
      top: 0px;
      left: 0px;
      height: 100%;
      border-right: 2px dashed #000;
      cursor: ew-resize;
    }

    .round {
      position: absolute;
      top: -15px;
      left: calc(50% - 5px);
      width: 10px;
      height: 10px;
      background-color: #ccc;
      cursor: move;
    }

    .resize {
      position: absolute;
      right: 0;
      bottom: 0;
      width: 6px;
      height: 6px;
      background-color: #000;
      cursor: nwse-resize;
    }

    /* table {
      width: 100%;
      height: 100%;
    } */
  </style>
</head>

<body>
  <div id="drag_wrapper">
    <div class="box">

      <table tabindex="1" class="zsk-table">
        <tr>
          <td>1-1</td>
          <td>1-2</td>
          <td>1-3</td>
          <td>1-4</td>
          <td>1-5</td>
        </tr>
        <tr>
          <td>2-1</td>
          <td>2-2</td>
          <td>2-3</td>
          <td>2-4</td>
          <td>2-5</td>
        </tr>
        <tr>
          <td>3-1</td>
          <td>3-2</td>
          <td>3-3</td>
          <td>3-4</td>
          <td>3-5</td>
        </tr>
        <tr>
          <td>4-1</td>
          <td>4-2</td>
          <td>4-3</td>
          <td>4-4</td>
          <td>4-5</td>
        </tr>
        <tr>
          <td>5-1</td>
          <td>5-2</td>
          <td>5-3</td>
          <td>5-4</td>
          <td>5-5</td>
        </tr>
      </table>
    </div>
    <div class="line left"></div>
    <div class="line top"></div>
    <div class="line right"></div>
    <div class="line bottom"></div>
    <div class="round"></div>
    <div class="resize"></div>
  </div>
  <script>
    let drag_wrapper = document.querySelector("#drag_wrapper")
    let box = document.querySelector(".box")

    let rightD = document.querySelector(".right")
    let topD = document.querySelector(".top")
    let leftD = document.querySelector(".left")
    let bottomD = document.querySelector(".bottom")
    let moveD = document.querySelector(".round")
    let resizeD = document.querySelector(".resize")
    let state = 0
    topD.addEventListener("mousedown", (e) => {
      state = 1 // 上
    })
    rightD.addEventListener("mousedown", (e) => {
      state = 2 // 右
    })
    bottomD.addEventListener("mousedown", (e) => {
      state = 3 // 下
    })
    leftD.addEventListener("mousedown", (e) => {
      state = 4 // 左
    })
    moveD.addEventListener("mousedown", (e) => {
      state = 5 // 移动
      initX = e.clientX
      initY = e.clientY
      initLeft = drag_wrapper.offsetLeft
      initTop = drag_wrapper.offsetTop
    })
    resizeD.addEventListener("mousedown", (e) => {
      state = 6 // 同时改变宽高

    })
    let initLeft = initTop = 0, initX = initY = 0
    document.body.addEventListener("mousemove", (e) => {
      let width, height, moveX, moveY
      switch (state) {
        case 1:
          height = box.offsetHeight + drag_wrapper.offsetTop - (e.clientY - 2)
          box.style.height = height + "px"
          drag_wrapper.style.top = e.clientY - 2 + "px"
          break;
        case 2:
          width = e.clientX - drag_wrapper.offsetLeft - 2
          box.style.width = width + "px"
          break;
        case 3:
          height = e.clientY - drag_wrapper.offsetTop - 2
          box.style.height = height + "px"
          break;
        case 4:
          width = drag_wrapper.offsetLeft + box.offsetWidth - (e.clientX - 2)
          box.style.width = width + "px"
          drag_wrapper.style.left = e.clientX - 2 + "px"
          break;
        case 5:
          moveX = e.clientX - initX
          moveY = e.clientY - initY
          console.log(moveX, moveY);
          drag_wrapper.style.left = initLeft + moveX + "px"
          drag_wrapper.style.top = initTop + moveY + "px"
          break;
        case 6:
          width = e.clientX - drag_wrapper.offsetLeft - 2
          height = e.clientY - drag_wrapper.offsetTop - 2
          box.style.width = width + "px"
          box.style.height = height + "px"
          break;
        default:
          break;
      }

    })
    document.body.addEventListener("mouseup", (e) => {
      console.log(e.clientX)
      state = 0
      initX = initY = 0
      initLeft = initTop = 0
    })
  </script>
</body>

</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结语

结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FastText 算法原理及使用方法

文章目录 1. 前言2. 模型架构2.1 Hierarchical Softmax2.2 n-gram 特征 3. 训练及评估4. 使用5. 参考 1. 前言 FastText 是一个由 Facebook AI Research 在2016年开源的文本分类器&#xff0c;它的设计旨在保持高分类准确度的同时&#xff0c;显著提升训练和预测的速度。 论文…

https证书免费申请

https证书也称SSL证书或是TLS证书&#xff0c;主要是用于网站实现https加密访问。 1、工作原理&#xff1a;HTTPS证书在HTTP协议基础上加入了SSL/TLS协议层&#xff0c;实现数据的加密传输。当用户访问启用HTTPS的网站时&#xff0c;浏览器会与网站服务器建立一个安全连接。这个…

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…

STM32、GD32驱动PCA9685控制舵机源码分享

一、PCA9685介绍 PCA9685是一种16通道PWM&#xff08;脉宽调制&#xff09;控制器芯片&#xff0c;由NXP Semiconductors公司生产。它具有高速I2C总线接口&#xff0c;可以通过I2C总线与微控制器或其他设备进行通信。PCA9685广泛应用于各种需要精确控制多路PWM信号的应用&…

一种利用MPLS实现IPv4网络向IPv6网络过度的技术

前言 6PE&#xff08;IPv6 Provider Edge&#xff09;是一种利用MPLS&#xff08;(Multi-Protocol Label Switching&#xff09;&#xff0c;实现IPv4网络向IPv6网络过渡的技术。6PE技术能够使得多个IPv6孤岛网络采用MPLS LSP隧道&#xff0c;跨越IPv4 MPLS骨干网相互进行通信…

碳课堂|如何开展碳排放核算? ISO 14064-2 项目层次要点解读

为提高企业组织碳排放报告信誉度&#xff0c;国际标准化组织&#xff08;ISO&#xff09;发布了ISO14064标准&#xff0c;其中《ISO 14064-2 项目层次上对温室气体减排和清除增加的量化、监测和报告的规范及指南》提供了项目策划阶段的原则要求&#xff0c;以及项目实施阶段的量…

VBA中类的解读及应用第十二讲:限制复选选择(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

Mybatis Plus二级缓存 使用@CacheNamespace 失效@CacheNamespace和@CacheNamespaceRef

1、注解 CacheNamespace(flushInterval 100000,eviction LruCache.class,readWrite false,size 1024)2、xml配置 <cache eviction "LRU" flushInterval "100000" readOnly "true" size "1024"/> 二级缓存&#xff0c;配置文…

基础设施即代码——灵活构建具备弹性和可扩展性的基础设施

本书的初衷是帮助大家更好地编写基础设施即代码(Infrastructure as Code&#xff0c;IaC)&#xff0c;并且能够在不影响关键业务系统的情况下&#xff0c;稳定高效地变更基础设施资源。本书重点介绍了个人、团队或公司在基础设施系统中应用的模式与实践&#xff0c;聚焦能够应用…

【C++】——内存管理

&#x1f600;&#x1f600;前言 好久没更新了&#xff0c;五一小长假&#xff0c;有点玩脱了&#xff0c;今天赶紧补一篇博客&#xff0c;回回状态 一 c/c内存分配 下面看下面一段代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; i…

华为eNSP中型企业局域网网络规划设计(上)

敲半天一个闪退全™给我干没了呜呜呜&#xff0c;eNSP&#xff0c;wcnm&#xff01;wcnm&#xff01;wcnm&#xff01; →b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;下&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩←…

抖音小店怎么运营?最全的运营攻略来了?

大家好&#xff0c;我是电商糖果 很多开好店铺的小伙伴&#xff0c;都会遇到一个难题&#xff0c;那就是不会运营店铺。 可能好几个月才出十几单&#xff0c;甚至体验分都没有弄出来。 说实话&#xff0c;这种情况糖果见多了。 糖果做抖音小店也有四年多了&#xff0c;也开…

【全开源】Java淘宝客多商户系统APP源码任务聚合优惠券多商户源码

功能特点&#xff1a; 商户管理&#xff1a;支持多商户入驻&#xff0c;包括商户的注册、审核、信息维护等功能。同时&#xff0c;系统可以对商户进行分类、排序和搜索&#xff0c;方便管理。全行业覆盖√ miui52086商品管理&#xff1a;提供商品发布、编辑、上下架等功能&…

PMP考试没过怎么办?如何补考?(附复核流程)

最近刷小红书&#xff0c;看很多人都在晒PMP通过的成绩截图&#xff0c;一方面为大家开心&#xff0c;终于拿到了期盼已久的PMP&#xff0c;但同时也有宝子发挥失常没通过考试&#xff0c;所以这期针对没考过的宝子们&#xff0c;出一期复盘文章&#xff0c;无论结果如何&#…

QT4-升级到QT5(1)

1.C报错汇总_nafxcwd.lib error lnk2001-CSDN博客1 1.QT3Support QWidget::setShown 改为QWidget::setVisible 2.头文件 #include<QWidget> 3.部分函数替换

印章常见问题如何防?君子签电子印章实现管章、用章、控章一体化

企业公章管理和使用关乎企业经营&#xff0c;近年来&#xff0c;各类印章问题层出不穷&#xff1a;“通过PS、图片章伪造授权、合同等文件”、“冒充公司员工利用假身份、假印章签约”、“管理层私刻印章伪造业务材料”等常见假印章套路&#xff0c;让企业防不胜防&#xff0c;…

内网渗透(二)

预备知识 什么是域&#xff1f; 域是若干台计算机组成的集合&#xff0c;一个电脑也是。域中的电脑是分等级的&#xff0c;分为域控和成员机。 如何安装域&#xff1f; 在服务器管理中添加服务器角色&#xff0c;添加域服务 如何加入域? 首先一定要修改DNS服务器 ip为域…

解密某游戏的数据加密

前言 最近有个兄弟通过我的视频号加我&#xff0c;咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注&#xff0c;于是通过抓包工具测试了下&#xff0c;发现数据有时候是明文&#xff0c;有时候确实密文&#xff0c;大致看了下有这几种加密&#xff1a;Md5aes、Md5&a…

squeeze的用法

squeeze是压缩张量的命令 import torch a torch.randn(1,3) print(a) print(a.shape) 比如说squeeze&#xff08;&#xff1f;&#xff09;括号里是啥 就是在哪个维度上删除维度为1 之后的结果 比如上上面那个里子 a是&#xff08;[[]]&#xff09; 但是在下面那个例子中d…

软胶囊弹性检测:确保药品质量与患者安全的关键步骤

软胶囊弹性检测&#xff1a;确保药品质量与患者安全的关键步骤 在医药领域&#xff0c;软胶囊作为一种常见的药物载体&#xff0c;其质量的优劣直接关系到药物的有效性和患者的安全。软胶囊的弹性作为其质量评估的重要指标之一&#xff0c;不仅影响其储存和运输的稳定性&#x…