js css3实现图片拖拽效果

实现图片拖拽效果,可以使用HTML5中新增的drag and drop API,也可以使用JavaScript和CSS3实现。以下是基于JavaScript和CSS3实现图片拖拽效果的攻略:

前置知识

在实现图片拖拽效果前,需要掌握以下知识:

  • 事件的监听与触发
  • DOM操作
  • CSS3 transform属性
  • HTML5 draggable属性

实现步骤

第一步: 基础HTML结构

我们先来构建基础HTML结构,包含一个容器和多个图片:

<div class="container">
  <img src="img/img1.jpg" alt="">
  <img src="img/img2.jpg" alt="">
  <img src="img/img3.jpg" alt="">
  <!-- ... more images ... -->
</div>

第二步:CSS样式设置

需要为图片和容器设置一些基础的CSS样式,以便后续实现拖拽的效果。其中包括容器属性:设置宽度,居中,边框等,以及图片属性:设置width和height。

.container{
  width: 800px;
  margin: 0 auto;
  border: 1px solid gray;
  text-align:center;
}
.container img{
  width: 200px;
  height: 200px;
  margin:10px;
}

第三步:JavaScript代码实现

至此,我们已经完成了基础HTML结构和基础CSS样式设计。接下来,我们使用JavaScript和CSS3实现图片拖拽效果,主要步骤包括以下几步:

1.创建拖拽状态变量

在JavaScript中,需要手动设置一个用于拖拽的状态变量dragging。在拖拽开始的时候,将变量设置为true,在结束或者取消拖拽的的时候设置为false

let dragging = false;

2.为所有图片添加拖拽支持

为每个图片添加拖拽事件监听,然后在事件处理程序中执行以下步骤:

  • 阻止默认事件
  • 设置当前图片即将拖拽的数据(dataTransfer对象的setData方法)
  • 设置拖拽状态为真

示例代码:

const imgs = document.querySelectorAll(".container img");

for (const img of imgs) {
  img.addEventListener("dragstart", function(event) {
    event.preventDefault();
    event.dataTransfer.setData("text/plain", "");
    dragging = true;
    event.target.classList.add("dragging");
  });
}

在这个示例代码中,我们给每个图片添加了一个事件监听器,该事件监听器在开始拖拽之前阻止了默认的拖拽事件,并向drag and drop API设置了拖拽的数据(使用event.dataTransfer.setData("text/plain", "")方法),然后将拖拽状态变量设置为真,并在当前图片上添加一个拖动中的样式类“dragging”。

3.在外部容器上添加拖拽监听

在外部容器上添加拖拽监听器,绑定拖拽过程中的事件处理程序。在事件处理程序中,可以添加以下步骤:

  • 阻止默认事件
  • 获取当前鼠标的x和y坐标
  • 将鼠标坐标减去拖拽元素的偏移量,得到一个相对于拖拽元素左上角的位置
  • 将拖拽元素的位置设置为该位置
  • 设置拖拽状态为true

示例代码:

const container = document.querySelector(".container");

container.addEventListener("dragover", function(event) {
  event.preventDefault();
  const x = event.clientX;
  const y = event.clientY;
  for (const img of imgs) {
    if (dragging) {
      img.style.transform = `translate(${x}px, ${y}px)`;
    }
  }
});

container.addEventListener("dragend", function(event) {
  dragging = false;
  for (const img of imgs) {
    img.classList.remove("dragging");
    img.style.transform = "";
  }
});

在这个代码示例中,我们为容器添加了拖拽监听器,并执行拖拽过程中的事件处理程序。该事件处理程序阻止默认拖拽事件,然后获取鼠标当前的坐标,并设置图片位置为鼠标坐标。最后,拖动结束时将拖拽状态变量设置为false,为每个图片移除“dragging”类,并重置图片位置。

示例代码

这里提供两个完整的示例代码:

示例一

以下是示例一的完整代码,实现了在页面中拖动图片的效果:

<!-- HTML -->
<div class="container">
  <img src="/path/to/image1.png">
  <img src="/path/to/image2.png">
  <img src="/path/to/image3.png">
  <!-- more images ... -->
</div>

<!-- CSS -->
.container {
  border: 2px dotted gray;
  padding: 20px;
}

.container img {
  height: 60px;
  margin: 10px;
  width: 60px;
}

.container img.dragging {
  opacity: 0.5;
}

<!-- JavaScript -->
<script>
  let dragging = false;
  const images = document.querySelectorAll('.container img');

  for (const img of images) {
    img.addEventListener('dragstart', function(e) {
      e.preventDefault();
      dragging = true;
      e.dataTransfer.setData('text/plain', '');
      e.target.classList.add('dragging');
    });
  }

  document.addEventListener('dragover', function(e) {
    e.preventDefault();
    const x = e.clientX;
    const y = e.clientY;
    for (const img of images) {
      if (dragging) {
        img.style.transform = `translate(${x}px, ${y}px)`;
      }
    }
  });

  document.addEventListener('dragend', function(e) {
    dragging = false;
     for (const img of images) {
      img.classList.remove('dragging');
      img.style.transform = '';
     }
  });
</script>

示例二

以下是示例二的完整代码,实现了从文件夹中拖动图片到页面的效果:

<!-- HTML -->
<div class="container" ondrop="drop(event)" ondragover="dragover(event)">
  Drop images here.
</div>

<!-- JS -->
<script>
  function drop(e) {
    e.preventDefault();
    const files = e.dataTransfer.files;
    for (const file of files) {
      const reader = new FileReader();
      reader.onload = function(event) {
        const img = document.createElement('img');
        img.classList.add('dropped-image');
        img.src = event.target.result;
        document.querySelector('.container').appendChild(img);
      };
      reader.readAsDataURL(file);
    }
  }

  function dragover(e) {
    e.preventDefault();
  }
</script>

<!-- CSS -->
 .container {
   border: 2px dotted gray;
   padding: 20px;
   min-height: 100px;
 }

 .dropped-image {
   height: 60px;
   margin: 10px;
   width: 60px;
 }

这个示例展示了如何实现从文件夹向页面中拖动图片,并在页面中展示它们。在此示例中,我们定义了两个函数drop()dragover(),分别实现了容器的拖放事件。

这个示例中的代码稍微有些复杂,实际上这只是从文件夹中传递图片到容器的方法。但这里的主要思想仍然适用于其他情况:只需将处理拖放时创建图像的代码改为在dragstart事件处理程序中设置传递的数据即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js css3实现图片拖拽效果 - Python技术站

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

相关文章

  • CSS渐变

    CSS渐变是一种通过颜色过渡来创建平滑过渡的技术,可以应用于网页设计中的各种元素,如背景、字体、框架等。这种技术可以帮助制作出显性美感的网页设计。 下面是一些常见的CSS渐变类型: 线性渐变(Linear gradient) 径向渐变(Radial gradient) 重复渐变(Repeating gradient) 渐变函数是一个CSS函数,用于创建渐变颜…

    Web开发基础 2023年3月30日
    00
  • JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】

    【JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】】是一篇介绍如何通过JavaScript实现表单验证的文章,其中利用到了策略模式,将验证数据与逻辑分离开来,以便简化代码,提高代码的可读性和可维护性。 一、数据与逻辑分离的思想 在传统的表单验证方式中,通常直接将验证逻辑写在表单元素的事件触发函数中,这样的方式非常不灵活,代码量也非常大,而且不具备可维…

    css 2023年6月10日
    00
  • Bootstrap4一次重大更新 几乎涉及每行代码

    Bootstrap4 是一款非常流行且使用广泛的前端框架,其能够帮助开发人员快速构建现代化的Web应用程序和网站。Bootstrap4 最近发布了一次重大更新,更新内容涉及到每行代码,为了让大家更好地理解 Bootstrap4 的更新,下面是一份完整攻略。 1. 重要更新 Bootstrap4 最重要的更新是它完全采用了Flexbox布局。在以前的版本中,使…

    css 2023年6月11日
    00
  • 分享33个jQuery与CSS3实现的绚丽鼠标悬停效果

    我们来讲解一下如何实现“分享33个jQuery与CSS3实现的绚丽鼠标悬停效果”。 1. 简介 正文之前,我们先来了解一下整个分享的内容。 这篇文章总结了33个使用jQuery与CSS3实现的绚丽鼠标悬停效果,包括旋转、放大、缩小等效果,主要针对前端开发人员或者对前端开发感兴趣的小白。 2. 准备工作 在开始实现之前,我们需要准备一些工作: 确保你的代码运行…

    css 2023年6月9日
    00
  • VS2010超赞的扩展辅助工具使用总结

    VS2010超赞的扩展辅助工具使用总结 简介 Visual Studio是一款功能强大的集成开发环境。除官方提供的基础功能外,还有许多第三方扩展工具可以提高开发效率、减少出错率、丰富开发体验。本文将介绍一些常用的扩展辅助工具的使用方法,以及它们的优点。 1. ReSharper ReSharper是一个Visual Studio的扩展,提供了一系列的代码辅助…

    css 2023年6月10日
    00
  • 尽量不要使用CSS Expression的原因

    以下是详细讲解“尽量不要使用CSS Expression的原因”的完整攻略。 什么是CSS Expression CSS Expression是一种一个语法结构,用于JavaScript表达式的计算结果,可以被用于样式属性中,例如: width: expression(document.body.clientWidth>800 ? "800p…

    css 2023年6月10日
    00
  • 引入CSS样式的五种方式

    下面是“引入CSS样式的五种方式”的完整攻略: 1. 直接在HTML文件中通过style标签引入CSS样式 <head> <style> /* 在这里编写CSS样式 */ </style> </head> 这种方式最为简单,只需要将CSS代码直接写在HTML文件的style标签中即可。适用于简单的网页或需要快速…

    css 2023年6月9日
    00
  • 详细分析css float 属性以及position:absolute 的区别

    详细分析css float 属性以及position:absolute 的区别 CSS Float 属性 CSS Float 属性常用于制作文字环绕效果。设置浮动属性后,元素会跳出常规的文档流,根据浮动元素的宽度,向左或向右移动至其的包含块的边缘,其他内容会填补其旁边的可用空间。使用 Float 属性的元素被称为浮动元素。 Float 常见取值及应用 flo…

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