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

news2024/10/6 14:32:27

简言

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

内容

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

选择框

选择框就是一个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>

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

结语

结束了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion【古风模型】:喜欢古风的看过来,超写实汉服兼顾现代风格大模型汉服国风桃夭

这次来介绍【Stable Diffusion【古风模型】&#xff1a;喜欢古风的看过来&#xff0c;超写实汉服兼顾现代风格大模型汉服国风桃夭】&#xff0c;对于汉服国风桃妖大模型&#xff0c;不仅在古装国风写实上表现出色&#xff0c;同时该模型也兼容现代风格&#xff0c;并且出图效果…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…

信创基础硬件之芯片

信创基础硬件之芯片 文章目录 信创基础硬件之芯片服务器服务器的定义服务器的功能服务器的构成服务器的性能 处理器&#xff08;CPU&#xff09;CPUGPUDPU CPU的分类按CPU指令集架构分类按CPU体系架构分类 CPU产业链六大国产CPU公司详解海光飞腾鲲鹏兆芯龙芯申威 国产CPU对比从…

自动群发国际短信脚本的详情介绍!

在当今全球化的商业环境中&#xff0c;信息的及时传递显得尤为重要&#xff0c;国际短信作为一种高效、低成本的沟通方式&#xff0c;被广泛应用于企业营销、客户服务、产品推广等领域。 为了满足企业对于群发国际短信的需求&#xff0c;市场上涌现出了许多自动群发国际短信脚…

Golang编译优化——稀疏条件常量传播

文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播&#xff08;constant propagation&#xff09;是一种转换&#xff0c;对于给定的关于某个变量 x x x和一个常量 c …

初探MFC程序混合使用QT

一、背景 随着操作系统国产化替代的趋势越发明显&#xff0c;软件支持国际化、跨平台&#xff0c;已然是必须做的一件事情。原有的软件UI层用的是MFC&#xff0c;将其换成QT&#xff0c;想必是一种较好的方案。对于大型软件&#xff0c;特别是已发布&#xff0c;但还处于不断迭…

43.乐理基础-拍号-常见的拍号与强弱关系

首先拍号的定义&#xff1a;39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 通过 39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 应该可以知道 Y的取值只能是2、4、8、16、32、64。。。。因为Y指的是Y分音符&#xff0c;…

数据库数据恢复—Sql Server数据库文件丢失丢失怎么恢复数据?

数据库数据恢复环境&#xff1a; 5块硬盘组建一组RAID5阵列&#xff0c;划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库&#xff0c;存储空间在操作系统层面划分了三个逻辑分区。 数据库故障&#xff1a; 数据库文件丢失&#xff0c;主要涉及3个…

Adobe系列软件安装

双击解压 先运行Creative_Cloud_Set_Up.exe。 完毕后&#xff0c;运行AdobeGenP.exe 先Path&#xff0c;选路径&#xff0c;如 C:\Program Files\Adobe 后Search 最后Patch。 关闭软件&#xff0c;修图&#xff01;

【LeetCode刷题记录】124. 二叉树中的最大路径和

124 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的…

记录我的程序猿副业首笔创收

在这个充满机遇的数字时代&#xff0c;我&#xff0c;一个普通的程序猿&#xff0c;编程爱好者&#xff0c;终于在云端源想这个平台上收获了属于我的第一桶金。这是一个关于兼职、学习与成长的故事&#xff0c;希望能激发同在编程路上的你&#xff0c;勇敢迈出那一步。 先晒晒…

深度学习论文: SuperPoint: Self-Supervised Interest Point Detection and Description

深度学习论文: SuperPoint: Self-Supervised Interest Point Detection and Description SuperPoint: Self-Supervised Interest Point Detection and Description PDF: https://arxiv.org/pdf/1712.07629 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代…

RuntimeError: Tensor must have a last dimension with stride 1

我在使用torch.view_as_complex将weight转化为复数时&#xff0c;遇到了这样一个错误&#xff1a;由于我在对weight使用view_as_complex之前使用了F.interpolate函数进行了分辨率调整&#xff0c;因此只需对张量weight添加.contiguous()即可。

【商业】SD NAND(贴片式TF卡)性能体验及应用

SD NAND【商业】   外观   NAND与TF卡的区别   雷龙CS SD NAND(贴片式TF卡)性能体验及应用   最后 SD NAND 外观正反示意图 NAND与TF卡的区别 什么是SD NAND&#xff1f;它俗称贴片式T卡&#xff0c;贴片式TF卡&#xff0c;贴片式SD卡&#xff0c;贴片式内存卡&am…

2023年谷歌拒了228万应用,禁了33.3万账号,开发者们应如何应对2024的挑战?

谷歌在上周一公布了去年如何应对恶意应用和恶意行为。 报告指出&#xff0c;去年谷歌在Google Play平台上&#xff0c;通过不断升级安全系统、更新政策规定、运用先进的机器学习技术&#xff0c;以及严格把关应用审核流程&#xff0c;成功阻止了高达228万个不合规的应用程序上架…

家用洗地机应该怎么选?哪个牌子好?市场上主流洗地机品牌推荐

洗地机的出现&#xff0c;让越来越多的家庭享受清洁的过程&#xff0c;给人们腾出来更多的时间陪伴家人和休息。但是在选购一台洗地机前&#xff0c;大家多多少少肯定有些疑问&#xff0c;洗地机到底实不实用&#xff1f;好不好用&#xff1f;能扫干净吗&#xff1f;还有哪些好…

网盘应用:桌面端界面欣赏,这个赛道容不下小玩家。

网盘&#xff08;Cloud Storage&#xff09;是一种云存储服务&#xff0c;允许用户在互联网上存储、管理和共享文件。它提供了一个在线的虚拟硬盘&#xff0c;用户可以通过网络将文件上传到云端&#xff0c;并随时随地访问和管理这些文件。 阿里云盘

Rumor Containment by Blocking Nodes in Social Networks

Abstract 谣言在社交网络中快速传播&#xff0c;可能严重损害我们的社会。在本文中&#xff0c;我们提出了一种基于整数线性规划&#xff08;ILP&#xff09;的数学规划公式&#xff0c;通过阻止建模为线性阈值模型的复杂社交网络中的节点子集&#xff08;称为阻止者&#xff…

apache atlas 如何自定义hook

atals 是开源的数据元数据和数据资产管理平台&#xff0c;平台设计支持强大的图数数据库&#xff0c;nosql&#xff0c;和搜索引擎3个组件构建。都是基于开源构建。 目前市场上开源的元数据管理工具有Atlas&#xff0c; Datahub&#xff0c; Openmetadata等&#xff0c;你要说二…

写一个函数返回参数二进制中1的个数--四种方法及原理解释

虽然本方法是java写的&#xff0c;但是其原理适用于大部分语言 方法一&#xff1a;通过取模%运算取出每一位比特位数值&#xff0c;再进行判断&#xff08;该方法不可判断负数&#xff09; 原理&#xff1a; 通过取模num % 2 1 取出该数的每一个二进制位数&#xff0c;再判…