首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js+限制拖动范围

在JavaScript中实现拖动元素并限制其拖动范围,通常涉及到事件监听和处理。以下是一些基础概念和相关实现细节:

基础概念

  1. 拖动事件
    • mousedown:鼠标按下时触发。
    • mousemove:鼠标移动时触发。
    • mouseup:鼠标释放时触发。
  • 坐标计算
    • 使用event.clientXevent.clientY获取鼠标在视口中的坐标。
    • 使用元素的offsetLeftoffsetTop获取元素相对于其包含块的偏移量。

实现步骤

  1. 绑定事件
    • 在目标元素上绑定mousedown事件。
    • document上绑定mousemovemouseup事件,以便在整个文档范围内跟踪鼠标移动和释放。
  • 记录初始位置
    • mousedown事件中记录鼠标按下时的坐标和元素的初始位置。
  • 计算新位置
    • mousemove事件中计算鼠标移动的距离,并更新元素的位置。
  • 限制拖动范围
    • 在更新元素位置时,检查新的位置是否超出允许的范围,如果超出则限制在边界内。

示例代码

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Drag and Limit Range</title>
    <style>
        #draggable {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            top: 50px;
            left: 50px;
            cursor: move;
        }
        #container {
            position: relative;
            width: 500px;
            height: 500px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="draggable"></div>
    </div>

    <script>
        const draggable = document.getElementById('draggable');
        const container = document.getElementById('container');

        let isDragging = false;
        let startX, startY, initialLeft, initialTop;

        draggable.addEventListener('mousedown', (e) => {
            isDragging = true;
            startX = e.clientX;
            startY = e.clientY;
            initialLeft = draggable.offsetLeft;
            initialTop = draggable.offsetTop;

            document.addEventListener('mousemove', onMouseMove);
            document.addEventListener('mouseup', onMouseUp);
        });

        function onMouseMove(e) {
            if (!isDragging) return;

            const dx = e.clientX - startX;
            const dy = e.clientY - startY;

            let newLeft = initialLeft + dx;
            let newTop = initialTop + dy;

            // 获取容器的边界
            const containerRect = container.getBoundingClientRect();
            const draggableRect = draggable.getBoundingClientRect();

            // 限制拖动范围
            newLeft = Math.max(containerRect.left, Math.min(newLeft, containerRect.right - draggableRect.width));
            newTop = Math.max(containerRect.top, Math.min(newTop, containerRect.bottom - draggableRect.height));

            draggable.style.left = `${newLeft}px`;
            draggable.style.top = `${newTop}px`;
        }

        function onMouseUp() {
            isDragging = false;
            document.removeEventListener('mousemove', onMouseMove);
            document.removeEventListener('mouseup', onMouseUp);
        }
    </script>
</body>
</html>

解释

  1. HTML结构
    • #container:拖动范围的边界。
    • #draggable:可拖动的元素。
  • CSS样式
    • #draggable设置为绝对定位,以便可以通过lefttop属性移动。
    • #container设置为相对定位,并添加边框以便观察拖动范围。
  • JavaScript逻辑
    • mousedown事件中记录初始位置和鼠标位置。
    • mousemove事件中计算新的位置,并检查是否超出容器边界。
    • mouseup事件中停止拖动,并移除事件监听器。

通过这种方式,可以实现元素的拖动并限制其拖动范围。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

限制QLineEdit的数值输入范围

SIGNAL(textEdited(QString)')) 发出 信号 如果设置了验证 该信号在通过验证才能发出 (设置为只读时貌似发不出 没有具体测试)  在使用QLineEdit输入数值时,经常遇到限制其范围的需要...Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数的数值范围: 例1: [cpp] view plaincopy...限制浮点数输入范围为[-999999.9999,999999.9999]  [cpp] view plaincopy QRegExp rx("^(-?...)");   QRegExpValidator *pReg = new QRegExpValidator(rx, this);   lineEdit->setValidator(pReg);   限制浮点数输入范围为...");   QRegExpValidator *pReg = new QRegExpValidator(rx, this);   lineEdit->setValidator(pReg);   限制浮点数输入范围为

11.9K10
  • 精准控制:Python 输入数值范围限制详解

    前言在实际开发过程中,经常需要对用户输入的数值进行限制,以确保输入的数据在合理的范围内。这不仅能防止程序错误,还能提高用户体验。...作为一名测试工程师,掌握如何在 Python 中限制输入数值范围是非常有用的技能。本文将详细介绍如何使用 Python 实现这一功能,包括基础方法和高级应用。...基础方法:使用 while 循环首先,我们来了解如何使用基础的 while 循环和条件判断来限制用户输入的数值范围。示例代码以下是一个简单的示例,要求用户输入一个 1 到 10 之间的数值。...示例代码以下示例展示了如何使用自定义异常来限制输入数值范围。...如果匹配成功,进一步检查数值是否在范围内。总结本文详细介绍了如何在 Python 中限制输入数值的范围,涵盖了基础方法、高级方法、正则表达式和 GUI 界面。

    19200

    Element-UI日历组件支持时间范围以及限制选择时间跨度

    每次只能选7天,是指选择的是10号,则以10号为基准点前推6天则是4号后推6天则是16号,选择的范围则是4号到16号(还得考虑180天的限制和今天日期的限制)。 示例: ?...为了好测试,我们把180天的限制改为20天,其实这是两个功能:1....时间范围为20天;2.单次时间跨度7天,我们分步实现: 1.时间范围为20天 let millisecondOfDay = 1 * 24 * 60 * 60 * 1000 data:{ pickerOptions...选择的是20日,前后加减6天范围就是7天了。但是此时还有2个问题: 选择的范围超过了20天的范围,比如上图的今天时间是9号,明显已经超过了限制不能选择9号之后的日期。...左右边界的限制计算时要加上20天这个限制,也就是左边界要取20天的左边界和选择时间跨度7天的左边界中大的,右边界取今天日期和时间跨度7天的右边界中小的。

    7K20

    Android面试题之Kotlin中怎么限制函数参数的取值范围、取值类型等

    在Kotlin中,限制函数参数的取值范围和取值类型可以通过多种方式实现,包括使用类型系统、条件检查以及自定义类型等。以下是一些常见的方法: 1....使用类型系统限制参数类型 Kotlin的类型系统允许你通过参数类型限制参数可以接受的值。例如,如果只想接受某些枚举值作为参数,可以使用枚举类型。...使用条件检查 在函数内部进行条件检查,限制参数的值。...使用数据类或封装类 可以使用数据类或封装类来限制参数的取值范围。...age: Int ) // Validation can be performed using a Validator from javax.validation 以上是Kotlin中实现参数取值范围和取值类型限制的一些常见方法

    20410

    Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数

    在日常开发中,我们会遇到一些情况,在使用Element-UI 限制用户的日期时间范围的选择控制(例如:查询消息开始和结束时间,需要限制不能选择今天之后的时间)。...我们这里使用的是 DatePicker 日期选择器: Element官网日期控件地址,新手对于日期使用限制时间,可能不太理解写限制规则的方式。接下来我们将详细的解读日期限制的参数设置。...全方位的透彻理解怎么限制日期控件的时间。 官方文档日期限制说明: ?...  // 此处 time 的形参,time默代表选择器的每一个当前时间,用于判断这些时间是否可选.   // 通过 return time > 某个时间 或者 return time 限制时间的选择范围...time, return 出一个大于或者小于的公式,即可来设置日期的使用范围。

    3.1K20

    手写实战应用:Vue拖拽插件的应用与选择

    介绍图片vue-drag-resize是一个用于拖拽,缩放的组件根据网上搜索到的使用教程,都是照着文档翻译了一遍,根本解决不了我想要的问题花了几天时间,于是记录下了这个组件的一些使用教程简单使用限制拖拽范围修改组件的默认样式拖拽的层级拖拽的点击事件安装使用图片...vue-drag-resize是一个专门用于vue项目的拖拽组件,定义元素可拖拽,或者可缩放,或者二者兼有;可限制拖拽的最大与最小值、拖拽的范围是否超出其父元素;并且支持触摸事件安装npm i -s vue-drag-resize...限制拖拽范围如果不设置拖拽范围,可以在整个页面进行拖拽 图片可以使用parent-limitation限制只在父元素内拖动也可以手动设置拖拽范围的宽高parentW,parentH//指定只在父元素内拖动... 图片//自由设置拖动范围 拖动的元素在最上层,此时就需要监听拖动元素,把当前元素设置为最高级使用@clicked事件监听,当点击拖动元素时,可以传如此元素的索引,把此元素的层级设置为最高,其他的设置为最低<template

    41330

    基于Vue的拖拽插件的实战应用,但最后我还是选择了手写

    介绍 vue-drag-resize是一个用于拖拽,缩放的组件 根据网上搜索到的使用教程,都是照着文档翻译了一遍,根本解决不了我想要的问题 花了几天时间,于是记录下了这个组件的一些使用教程 简单使用 限制拖拽范围...修改组件的默认样式 拖拽的层级 拖拽的点击事件 安装使用 vue-drag-resize是一个专门用于vue项目的拖拽组件,定义元素可拖拽,或者可缩放,或者二者兼有;可限制拖拽的最大与最小值、拖拽的范围是否超出其父元素...限制拖拽范围 如果不设置拖拽范围,可以在整个页面进行拖拽 可以使用parent-limitation限制只在父元素内拖动 也可以手动设置拖拽范围的宽高parentW,parentH //指定只在父元素内拖动... //自由设置拖动范围 <vue-drag-resize :parentW="2000" :parentH...,始终保持拖动的元素在最上层,此时就需要监听拖动元素,把当前元素设置为最高级 使用@clicked事件监听,当点击拖动元素时,可以传如此元素的索引,把此元素的层级设置为最高,其他的设置为最低 <template

    1.8K60

    FL Studio2023免费升级到21中文版本

    ,拖动图中的彩色圆点可以调节频率,最大到20K赫兹,这个范围是人耳能听到的范围,往上拖动则是对该频段的增益,反之为减弱,但有范围,并不是无限增益或减弱,范围为-18db-18db。...图19:增益/减弱范围而上端的英文则是将频段分为几类,除了可拖动圆点之外,右半部分则是横向和竖向调节频率,按鼠标滚轮即可重置,效果如图:图20:调节频率除了均衡器,另外再讲一下电音制作中经常用到的混响效果器...除了直接对音效进行调节外,还可通过改变“外部环境”来改变音效,拖动图中转动的图标即可,它就是“外部环境”,可比作是房子,上下拖动则是改变房子的大小,房子越大回音时间就越长,反之越短,而左右拖动则是改变房子形状...在混响中也需要对声音的频段进行限制,所以混响界面中的“L.CUT”为低切,即切低频,“H.CUT”为高切,为切高频,“L.CUT”一般调至250HZ-300HZ即可,高切根据实际情况而定,跟前文所讲的EQ...均衡器原理相似,都是控制频率,如图:图23:低切除了这两个效果器之外,混音台中还有其他效果器,例如“相位”、“压缩”、“限制”等等,因篇幅有限,无法全盘讲解,有机会再给大家奉上。

    75620
    领券