js基础编程-题目16 JS拖拽

这篇博客分享了如何使用JavaScript实现拖拽元素的功能。通过创建一个名为MyDrag的类,实现了运动函数、运动控制函数和窗口大小变化时的更新。运动函数通过调整left和top属性使元素跟随鼠标移动,运动控制函数利用mousedown、mousemove、mouseup和mouseleave事件控制拖拽行为,同时限制元素的移动范围。此外,还讨论了body元素的背景知识,解释了为何在不同情况下背景会覆盖不同的区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理下初学时做过的js基础编程题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦

JS运动

实现JS拖拽

效果展示:抖音视频链接
index.html
首先,我写是考虑三个部分
第一部分:运动函数:让拖拽元素运动,通过事件源对象的 e.pageXe.pageY 属性 取得鼠标点击位置,用固定定位position:fixed 改变 lefttop 属性 使其运动,考虑拖拽部分的移动范围,用判断限制 lefttop 值的范围 。
第二部分:运动控制函数:声明一个 lock 变量,值为true,监听拖拽原始的父级的 mousedown 事件,如果事件源对象的 e.target 时拖拽元素,则允许运动lock = false,通过监听拖拽原始的父级的 mousemove 事件拿到事件事件源对象的 e.pageXe.pageY 属性,执行运动函数,最后监听拖拽原始的父级的 mousemove 事件,禁止运动lock = false,监听拖拽原始的父级的 mouseleave 事件,鼠标离开父级,禁止运动lock = false
第三部分:考虑到窗口大小变化时,更新视口大小的宽高window.innerWidthwindow.innerHeight

<div class="mainArea"></div>
<script src="./index.js"></script>
<script>
new MyDrag(".mainArea","body")//拖拽元素  拖拽元素的父参照物
</script>

index.js

class MyDrag{
  constructor(el,wrap){
    this.el = document.querySelector(el)//拖拽元素
    this.wrap = document.querySelector(wrap)//拖拽元素父参照物
    this.width = window.innerWidth;//可视窗口大小
    this.height = window.innerHeight;//可视窗口大小
    this.init()
  }
  init(){
    this.resize()
    this.update()
  }
  update(){//运动控制函数
    // 实现 控制变量
    let lock = true;
    this.wrap.addEventListener("mousedown",(e)=>{
      // 如果点击的是拖拽元素 允许运动
      e.target.className === this.el.className && (lock = false)
    },false)
    this.wrap.addEventListener("mousemove",(e)=>{
      // 允许运动时,实现运动函数,实现运动
      !lock && this.changeFn(e.pageX,e.pageY)
    },false)
    this.wrap.addEventListener("mouseup",()=>{
      // 鼠标抬起时,禁止运动
      lock =true
    },false)
    this.wrap.addEventListener("mouseleave",()=>{
      // 鼠标移出父参照物,禁止运动
      lock = true
    })
  }
  changeFn(x,y){//拖拽元素的运动函数
    let elW = this.el.offsetWidth ;//获取拖拽元素的宽度
    let elH = this.el.offsetHeight;//获取拖拽元素的高度
    //限制拖拽 left 属性 x 值的范围
    if(x> this.width - 0.5*elW){
      x = this.width - elW
    }else if (x < 0.5*elW){
      x = 0
    }else{
      x -= 0.5*elW
    }
    //限制拖拽 top 属性 y 值的范围
    if(y> this.height - 0.5*elH){
      y = this.height - elH
    }else if (y < 0.5*elH){
      y = 0
    }else{
      y -= 0.5*elH
    }
    // 通过拖拽元素的固定定位上的 left 和 top 属性实现运动
    this.el.style.left = x + "px";
    this.el.style.top = y + "px";
  }
  resize(){//获取可视区域的宽高的函数
    let self = this
    window.addEventListener("resize",function(){
      //窗口大小改变时,更新宽高
      self.width =window.innerWidth
      self.height = window.innerHeight
    },false)
  }
}

index.css

body{
  margin:0;
  position:relative;
  background-color: #ccc;
  height:100vh
}
.mainArea{
  width: 100px;
  height: 100px;
  background: url("./xiaoliu.jpg") no-repeat center/cover;
  border-radius:20px;
  position: fixed;
  left:0;
  right:0;
}

这里扩展下 body 元素的冷知识点

  • body的背景
    如果HTML元素有背景,body元素正常(背景覆盖画布)
    如果HTML元素没背景,body元素的背景覆盖画布

如果我只给body 加上宽高和背景

body {
  width: 100px;
  height: 100px;
  background-color: #ccc;
}

会出现我的宽高是正确的,但是背景是覆盖整个窗口,这就比较奇怪了
在这里插入图片描述
我给html标签加个背景后,再看看

html {
  background-color: #999;
}
body {
  width: 100px;
  height: 100px;
  background-color: #ccc;
}

body的背景又正常了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值