js实现简单div拖拽功能实例

下面是关于如何用 JavaScript 实现简单的 div 拖拽功能的攻略。

1. HTML 结构

首先,在 HTML 中需要先定义要拖拽的 div 元素,代码如下:

<div id="draggable">
  <!-- 这里可以放置需要拖拽的内容 -->
</div>

2. CSS 样式

接着,为这个 div 元素设置样式,使其能够被拖拽,代码如下:

#draggable {
  position: absolute;
  left: 0;
  top: 0;
  width: 100px;
  height: 100px;
  background-color: red;
  cursor: move;
}

关键点:position 属性需要设置为 absolute,同时为了能够通过 lefttop 移动元素,这两个属性应设置为 0

3. JavaScript 功能

最后,我们需要实现 div 拖拽的功能,代码如下:

var div = document.getElementById('draggable');
var dragging = false;
var offset = {x: 0, y: 0};

// 鼠标按下事件:记录位置和状态
div.addEventListener('mousedown', function(e) {
  offset.x = e.offsetX;
  offset.y = e.offsetY;
  dragging = true;
});

// 鼠标松开事件:更新状态
div.addEventListener('mouseup', function() {
  dragging = false;
});

// 鼠标移动事件:更新位置
document.addEventListener('mousemove', function(e) {
  if (dragging) {
    div.style.left = e.clientX - offset.x + 'px';
    div.style.top = e.clientY - offset.y + 'px';
  }
});

代码说明:

  1. 通过 document.getElementById() 获取到要拖拽的 div 元素
  2. 定义 draggingoffset 两个变量,分别表示是否被拖拽和元素的位置偏移量
  3. 监听鼠标按下事件,记录当前鼠标在 div 上的位置和状态,如果鼠标在 div 上按下,dragging 设置为 true
  4. 监听鼠标松开事件,如果鼠标在 div 上松开,dragging 设置为 false
  5. 监听鼠标移动事件,如果 draggingtrue,则根据鼠标在屏幕上的位置和偏移量计算出 div 的新位置,并更新其 lefttop 属性

4. 示例

下面是两个示例,分别演示了最基本的 div 拖拽和添加了限制范围的拖拽效果。

示例一:最基本的 div 拖拽

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>最基本的 div 拖拽</title>
  <style>
    #draggable {
      position: absolute;
      left: 0;
      top: 0;
      width: 100px;
      height: 100px;
      background-color: red;
      cursor: move;
    }
  </style>
</head>
<body>
  <div id="draggable"></div>
  <script>
    var div = document.getElementById('draggable');
    var dragging = false;
    var offset = {x: 0, y: 0};

    div.addEventListener('mousedown', function(e) {
      offset.x = e.offsetX;
      offset.y = e.offsetY;
      dragging = true;
    });

    div.addEventListener('mouseup', function() {
      dragging = false;
    });

    document.addEventListener('mousemove', function(e) {
      if (dragging) {
        div.style.left = e.clientX - offset.x + 'px';
        div.style.top = e.clientY - offset.y + 'px';
      }
    });
  </script>
</body>
</html>

示例二:限制拖拽范围

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>限制 div 拖拽范围</title>
  <style>
    body {
      margin: 0;
      padding: 0;
      height: 100vh;
    }

    #container {
      position: relative;
      height: 100%;
    }

    #draggable {
      position: absolute;
      left: 0;
      top: 0;
      width: 100px;
      height: 100px;
      background-color: red;
      cursor: move;
    }
  </style>
</head>
<body>
  <div id="container">
    <div id="draggable"></div>
  </div>
  <script>
    var container = document.getElementById('container');
    var div = document.getElementById('draggable');
    var dragging = false;
    var offset = {x: 0, y: 0};

    div.addEventListener('mousedown', function(e) {
      offset.x = e.offsetX;
      offset.y = e.offsetY;
      dragging = true;
    });

    div.addEventListener('mouseup', function() {
      dragging = false;
    });

    document.addEventListener('mousemove', function(e) {
      if (dragging) {
        var left = e.clientX - offset.x;
        var top = e.clientY - offset.y;
        var maxLeft = container.offsetWidth - div.offsetWidth;
        var maxTop = container.offsetHeight - div.offsetHeight;
        left = Math.min(Math.max(0, left), maxLeft);
        top = Math.min(Math.max(0, top), maxTop);
        div.style.left = left + 'px';
        div.style.top = top + 'px';
      }
    });
  </script>
</body>
</html>

代码说明:

示例二中,在 mousemove 事件中,使用 Math.min()Math.max() 方法处理 div 的位置,使其不能超出容器的范围。如果想要拖拽的 div 可以在整个页面内自由拖动,可以将容器的高度设置为 100vh

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现简单div拖拽功能实例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS的后代选择器基础使用示例

    来讲解一下CSS的后代选择器基础使用示例的攻略。 什么是后代选择器? 后代选择器是CSS选择器中的一种,用于选择符合特定后代关系的元素。后代选择器使用空格来连接两个不同的选择器,表示选择具有特定关系的父元素和其子孙元素。 后代选择器基础示例 我们可以通过一些实例来说明后代选择器的使用。 示例1:使用后代选择器改变某个元素下的所有段落字体颜色 <html…

    css 2023年6月9日
    00
  • css实现流程导航效果(三种方法)

    针对“css实现流程导航效果(三种方法)”这个主题,我给你详细讲解一下具体的实现步骤和示例方法: 1. 纯CSS实现 实现步骤: 使用<ul>标签创建流程导航菜单; 使用CSS设置菜单样式和布局; 添加CSS伪类:before,在每个<li>标签之前添加步骤流程的序号; 利用:nth-child()选择器来设置每个菜单项不同的颜色,高…

    css 2023年6月10日
    00
  • 移动端开发1px线的理解与解决办法

    我来详细讲解一下“移动端开发1px线的理解与解决办法”的完整攻略。 什么是1px线 1px线,即为移动端上的一个像素线。由于移动端屏幕像素密度较高,不同设备的像素比也不同(例如iPhone 6是2倍像素密度,iPhone X为3倍像素密度),所以在开发过程中,开发者常常会遇到一个让人头疼的问题:如何绘制一条真实的1像素宽的线。 解决方案 border 利用C…

    css 2023年6月10日
    00
  • spring boot 2.x html中引用css和js失效问题及解决方法

    下面是“spring boot 2.x html中引用css和js失效问题及解决方法”完整攻略: 问题描述 在使用Spring Boot 2.x开发web应用时,可能会遇到在HTML文件中引用的CSS和JS失效的问题,无法正确加载页面样式和脚本,这时需要解决这个问题。 解决方法 解决这个问题的方法有两种:一种是将静态资源文件放在Spring Boot提供的默…

    css 2023年6月9日
    00
  • 极酷的三层分离的标准滑动门导航菜单

    下面为大家详细讲解如何制作一个极酷的三层分离的标准滑动门导航菜单。 1. 准备工作 首先,我们需要明确一下需要使用到的技术栈和工具: HTML、CSS、JavaScript jQuery 建议大家在开始编写代码之前,先思考一下设计稿中的导航菜单需要有哪些功能和样式,根据这些要求制定初步的代码构思和规划。 2. HTML结构 首先,我们需要在HTML文件中定义…

    css 2023年6月10日
    00
  • 人人网javascript面试题 可以提前实现下

    如果你要应聘人人网或者其他公司的JavaScript开发岗位,可能需要准备一些面试题。其中,人人网的JavaScript面试题是非常有名的。可以去Github上搜索“RenRenFE-interview”这个repo,找到该题的原题目以及解答。 如果你想提前实现这道面试题,建议按以下步骤进行: 首先,仔细阅读题目要求。该题要求在一个表格中,实现字符计数器、列…

    css 2023年6月11日
    00
  • CSS实现五颜六色按钮组成的导航条效果代码

    下面是CSS实现五颜六色按钮组成的导航条效果代码的完整攻略。 一、HTML结构 首先,我们需要先确定导航条的HTML结构。一般来说,导航条就是一个ul列表,每个li项就是一个导航按钮。下面是一个简单的示例: <ul class="nav"> <li><a href="#">按钮1&l…

    css 2023年6月10日
    00
  • line-height 和 vertical-align 行高与行对齐精解 (图文)

    关于“line-height和vertical-align行高与行对齐精解”的攻略,我会分为以下几个部分来进行详细讲解: 什么是行高和行对齐 line-height属性的使用 vertical-align属性的使用 优化行对齐的技巧 什么是行高和行对齐 在网页中,每一行的文本或者其他内容都是通过一个包裹元素来进行呈现的,这个包裹元素就是行框(line box…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部