拖动一张图像会拖动另一张图像

2023-12-03

当我拖动上传图片的右侧部分在 mask1 中,比 mask2 中上传的图像正在拖动,但这不应该发生......

Here is 视频链接

另外,如果我仅在蒙版 1 中上传图像并尝试拖动,图像将会消失,但如果我在两个蒙版中上传图像,则图像不会消失

视频链接2

代码笔:https://codepen.io/kidsdial/pen/PVJQrz

<input type="file" id="fileupa" />
<input type="file" id="fileupb" />

<div class="container">

<div class="minaimg masked-imga"   ondragover="onDragOver(event)"ondragover="onDragOver(event)" >
  <div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg">
    <div class="minaimga">

      <img id="target_imga"  alt="">

      <div></div>

    </div>
  </div>
</div>

<div class="minaimg masked-imgb"   ondragover="onDragOverSec(event)"ondragover="onDragOver(event)" >
  <div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg2">
    <div class="minaimgb">

      <img id="target_imgb"  alt="">

      <div></div>

    </div>
  </div>
</div>

</div>

<style>

.container {
    border: 1px solid #DDDDDD;
    width: 612px;
    height: 612px;
    position:relative;
    background:red;
}

.masked-imga

{

  -webkit-mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart1.png);
  mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart1.png);
  -webkit-mask-position: center center;
  mask-position: center center;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;  

  width: 259px;
  height: 278px;
  position: absolute;
    top: 221px;
    left: 23px;

}



.masked-imgb 
{

  -webkit-mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart2.png);
  mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart2.png);
  -webkit-mask-position: center center;
  mask-position: center center;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;  

    width: 416px;
    height: 388px;

    position: absolute;
    top: 111px;
    left: 173px;

}

.minaimga
{
  display: block;
  background-color: white;
  height: 278px;
}

.minaimgb 
{
  display: block;
  background-color: white;
  height: 388px;
}

</style>


<script>

fileupa.onchange = e => {
 target_imga.src = URL.createObjectURL(fileupa.files[0]);   
}

fileupb.onchange = e => {
 target_imgb.src = URL.createObjectURL(fileupb.files[0]);   
}

let prevX = 0, prevY = 0,translateX = 0, translateY = 0, scale = 1, zoomFactor = 0.1;

function onDragStart(evt) {
  if (evt.dataTransfer && evt.dataTransfer.setDragImage) {
evt.dataTransfer.setDragImage(evt.target.nextElementSibling, 0, 0);
  }
  prevX = evt.clientX;
  prevY = evt.clientY;
}

function onDragOver(evt) {
  translateX += evt.clientX - prevX;
  translateY += evt.clientY - prevY;
  prevX = evt.clientX;
  prevY = evt.clientY;
  updateStyle();
}

function updateStyle() 
{ 
let transform = "translate(" +translateX+ "px, "+ translateY + "px) scale("+scale+")"; 

if(document.querySelector('#uploadedImg img'))
document.querySelector('#uploadedImg img').style.transform = transform;
}

function onDragOverSec(evt) {
  translateX += evt.clientX - prevX;
  translateY += evt.clientY - prevY;
  prevX = evt.clientX;
  prevY = evt.clientY;
  updateStyleSec();
}

function updateStyleSec() 
{ 
let transform = "translate(" +translateX+ "px, "+ translateY + "px) scale("+scale+")"; 

if(document.querySelector('#uploadedImg2 img'))
document.querySelector('#uploadedImg2 img').style.transform = transform;
}




</script>

Edit

是因为这两个图像水平和垂直重叠吗?

enter image description here

enter image description here

Edit 2

对于某些人来说,问题仍然不清楚,在下图中,如果用户尝试拖动 B 部分,则 B 部分、C 部分和 D 部分也会拖动,但这种情况不应该发生......

enter image description here


这是我的解决方案。您必须跟踪哪个元素开始拖动。

HTML

<input type="file" id="fileupa" />
<input type="file" id="fileupb" />

<div class="container">

<div class="minaimg masked-imga"   ondragover="onDragOver(event)"ondragover="onDragOver(event)" >
  <div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg">
    <div class="minaimga">
      <div id="dragBox1" class="dragFromHere" style="left:70px;top:120px;"></div>
      <img id="target_imga"  alt="">

      <div></div>

    </div>
  </div>
</div>

<div class="minaimg masked-imgb" ondragover="onDragOverSec(event)" ondragover="onDragOver(event)" ondragend="dragEnd()">
  <div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg2">
    <div class="minaimgb">
      <div id="dragBox2" class="dragFromHere" style="left:160px;top:160px;"></div>
      <img id="target_imgb"  alt="">

      <div></div>

    </div>
  </div>
</div>

</div>

JS

var elemInDrag = null;
var canInitdrag = false;

fileupa.onchange = e => {
 target_imga.src = URL.createObjectURL(fileupa.files[0]);   
}

fileupb.onchange = e => {
 target_imgb.src = URL.createObjectURL(fileupb.files[0]);   
}

let prevX = 0, prevY = 0,translateX = 0, translateY = 0, scale = 1, zoomFactor = 0.1;

function dragEnd() {
  elemInDrag = null; 
  canInitdrag = false;
}

function onDragStart(evt) {
  var x = evt.clientX, y = evt.clientY;
  var divRect1 = document.getElementById('dragBox1').getBoundingClientRect();
  var divRect2 = document.getElementById('dragBox2').getBoundingClientRect();

  if (event.clientX >= divRect1.left && event.clientX <= divRect1.right &&
      event.clientY >= divRect1.top && event.clientY <= divRect1.bottom) {
      // Mouse is inside element.
      canInitdrag = true;
    }

  if (event.clientX >= divRect2.left && event.clientX <= divRect2.right &&
      event.clientY >= divRect2.top && event.clientY <= divRect2.bottom) {
      // Mouse is inside element.
       canInitdrag = true;
    }
  if (canInitdrag) {
  if ((typeof evt.target.id!='undefined') || (evt.target.id==elemInDrag)){
    elemInDrag = evt.target.id;
  if (evt.dataTransfer && evt.dataTransfer.setDragImage) {
    evt.dataTransfer.setDragImage(evt.target.nextElementSibling, 0, 0);
  }
  prevX = evt.clientX;
  prevY = evt.clientY;
  }
  }
}

function onDragOver(evt) {
  if ((typeof evt.target.id!='undefined') && (evt.target.id==elemInDrag)){
  translateX += evt.clientX - prevX;
  translateY += evt.clientY - prevY;
  prevX = evt.clientX;
  prevY = evt.clientY;
  updateStyle();
  }
}

function updateStyle() 
{ 
let transform = "translate(" +translateX+ "px, "+ translateY + "px) scale("+scale+")"; 

if(document.querySelector('#uploadedImg img'))
document.querySelector('#uploadedImg img').style.transform = transform;
}

function onDragOverSec(evt) {
  if ((typeof evt.target.id!='undefined') && (evt.target.id==elemInDrag)){
  translateX += evt.clientX - prevX;
  translateY += evt.clientY - prevY;
  prevX = evt.clientX;
  prevY = evt.clientY;
  updateStyleSec();
  }
}

function updateStyleSec() 
{ 
let transform = "translate(" +translateX+ "px, "+ translateY + "px) scale("+scale+")"; 

if(document.querySelector('#uploadedImg2 img'))
document.querySelector('#uploadedImg2 img').style.transform = transform;
}

CSS

.container {
    border: 1px solid #DDDDDD;
    width: 612px;
    height: 612px;
    position:relative;
    background:red;
}

.masked-imga

{

  -webkit-mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart1.png);
  mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart1.png);
  -webkit-mask-position: center center;
  mask-position: center center;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;  

  width: 259px;
  height: 278px;
  position: absolute;
    top: 221px;
    left: 23px;

}

.dragFromHere {
  border:thin;
  border-style:dotted;
  border-color:red;
  display:inline-block;
  width:80px;
  height:80px;
  position:absolute;
  z-index:99;
  pointer-events:none;
}


.masked-imgb 
{

  -webkit-mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart2.png);
  mask-image: url(http://139.59.24.243/ecom1/site/test/images/heart2.png);
  -webkit-mask-position: center center;
  mask-position: center center;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;  

    width: 416px;
    height: 388px;
    position: absolute;
    top: 111px;
    left: 173px;
}

.minaimga
{
  display: block;
  background-color: white;
  height: 278px;
}

.minaimgb 
{
  display: block;
  background-color: white;
  height: 388px;
}

这样,拖动仅适用于您开始拖动操作的图像,并且当您跨过该区域时,它不会涉及其他元素。

将其与 CSS 剪辑路径相结合以排除两个图像的重叠,您将解决内角的问题。

EDIT:现在只能从红色方块内部启动拖动。这些是元素不重叠的“安全区域”。必须为所使用的每个蒙版图像组合定义安全区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拖动一张图像会拖动另一张图像 的相关文章

  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • 扩展位置绝对div超出溢出隐藏div

    我已经好几个月没有做过CSS了 所以我可能会错过一些简单的东西 但无论解决方案是什么 我都无法弄清楚 所以问题就在这里 这是我的代码的简化版本 div style height 100 width 200px div style margi
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 当百分比填充定义元素高度时忽略 max-height

    The max height当内部填充大于最大高度值时 属性值似乎被忽略 例如 在元素上设置此类会导致最大高度被忽略 max height ignored height 0 or auto makes no difference max h
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 引导行之间的垂直间距

    所以我正在研究布局 为了 响应能力 我决定使用 Bootstrap 现在我猜网格系统有问题 我想要的结果如下 1 4 2
  • 即使在包裹后也具有等宽的弹性项目

    是否可以制作一个像这样的纯 CSS 解决方案 物品有一些min width 它们应该动态增长以填充所有容器宽度 然后换行到新行 列表中的所有项目都应具有相同的宽度 现在看起来是这样的 这就是我希望它看起来像的样子 我已经手动管理这些底部项目
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • 将 CSS 生成的三角形拆分为 2 个水平不同的相同颜色

    正如您应该能够通过此代码看到的那样fiddle http jsfiddle net Xh36r 1 以及下面 我希望能够分割显示在第二个 div 顶部的 CSS 生成的三角形水平均等在 之间orange and green使用的颜色 现在它
  • Ember Data 中出现“超出最大调用堆栈大小”错误的原因可能是什么?

    Ember 发布新版本 3 6 0 后 我开始在控制台中收到错误 rsvp js 24 未捕获 RangeError 超出最大调用堆栈大小 在 WeakMap get 在 getCacheFor metal js 25 在 Computed
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • 元素和 svg 形状之间的白线

    大家好 我正在使用由 shapedivider 生成的 svg 整形器 您可以看到 有一条白线 我不知道为什么它在那里以及如何删除它 请你帮助我好吗 有形状分隔符的代码 custom shape divider bottom 1640714
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • HTML 输入 - 名称与 ID [重复]

    这个问题在这里已经有答案了 使用 HTML 时
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • JavaScript:测试与执行

    我想知道检查字符串 例如邮件 密码等 的最佳方法是什么 i exec a vs i test a exec返回值 test true test 1 way var mail req body mail if check mail exec
  • 如何在表格列标题处垂直旋转文本

    我用过这个数据表 http www datatables net 在我的网页上 这是fiddle http jsfiddle net fxju7 2 链接我放置代码的地方 我想要 第一个数字第二个数字列应该垂直旋转 我已经做到了 但是 问题
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • Internet Explorer 9 是否会因数组和对象文字末尾的额外逗号而卡住?

    现代浏览器和 Node js 等环境允许您说 a 1 b 2 或 1 2 3 这在历史上一直是 Internet Explorer 的问题 Internet Explorer 9 中修复了此问题吗 对此有两种不同的答案 一种是对象初始值设定

随机推荐

  • SQL Server Management Studio 中的存储过程依赖项

    我对MS世界了解不多 但现在恰好我必须使用SQL Server Management Studio 2008 我的问题 我的表中有一个列 我需要查看可能对其进行操作的所有存储过程 我尝试右键单击并转到 查看依赖项 但这似乎并没有返回应有的所
  • XTS 无法将日期时间识别为适当的基于时间的对象

    我正在使用 R 我有一些值和一个日期时间索引 我想将 tibble 转换为 xts 格式 这是示例数据和我使用的代码 Date lt c 2010 01 04 2010 01 04 Time lt c 04 00 00 06 00 00 v
  • 在java中,为什么闭包变量需要声明为final?

    final Object o List l new ArrayList closure over o in lexical scope this add o 为什么一定要o被宣布为最终版本 为什么其他具有可变变量的 JVM 语言没有这个要求
  • 无法在java中访问getJSONArray [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我从 URL 中得到了这个 Json type Fea
  • 从 Eclipse 的组织导入中排除包

    有一些特定的类 例如Closeable File and Container 它们在不起眼的包中具有我极不可能使用的双重类 通常 这不会成为问题 但是当我组织导入时 我必须手动选择要导入的正确类型 有没有办法从组织导入工具中排除特定的包 日
  • MySQL:什么是 LIKE 的反向版本?

    LIKEMySql 中的运算符用于查找包含查询文本的行 例如 select name from user where name like john 这将返回John Smith Peter Johnson etc 如果我需要相反的操作 找到
  • 如何使用 Android 中的 Textwatcher 从 Recyclerview 适配器获取编辑文本位置

    我想知道如何从回收器视图适配器获取编辑文本的位置 我使用 水平Linear Layout中的Card View有三个视图TextView EditText视图和TextView 我想从 Recycler View Adapter 中的 Te
  • 使用 JasperReport 库和 MongoDB 生成 PDF

    所以 mongoDB 运行在 27017 上 我的集合名称是 test try Connection to base String mongoURI mongodb localhost 27017 test MongoDbConnectio
  • 设置诊断:来自 CMakeLists.txt 的插入符号

    我想使用 Visual Studio 2017 中新的 更好的 诊断信息 为了立即对我的所有项目启用它 我想从我的 CMakeLists txt 中声明此标志 I tried set CMAKE CXX FLAGS CMAKE CXX FL
  • 从字符串中删除注释

    我想做一个获取字符串的函数 如果它有内联注释 它将删除它 public class sample public static void main String args String code THIS IS SAMPLE CODE pub
  • 如何获得 Java 中具有重复项的所有组合(递归)?

    我需要找到一种方法来从组合中删除重复项 如下所示 Input 3 和 2 其中 3 是范围 从 1 到 3 2 是每个组合的长度 Output 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 预期产出 1 1 1 2
  • Windows 批处理文件将输出重定向到带有日期/时间的日志文件

    我正在尝试运行一个批处理文件 该文件运行可执行文件并将其输出重定向到日志文件 日志文件必须以日期和时间作为文件名 这是我正在使用的命令 PROGRAMFILES PostgreSQL 9 4 bin vacuumdb exe usernam
  • 奇怪的编译器错误:“未定义对‘main’的引用”

    有人能告诉我这是什么意思吗 usr lib i386 linux gnu gcc i686 linux gnu 4 5 2 crt1 o In function start text 0x18 undefined reference to
  • Reachability 示例代码中的 SCNetworkReachabilityGetFlags 返回时间过长

    我在 iPhone4 上使用 iOS4 1 我还使用最新版本的可达性代码 我的设备没有连接 但代码似乎等待超时 否则设备需要很长时间才能报告可达性状态 在使用 iPhone 3gs 的 iOS 4 0 1 上似乎不会发生这种情况 还有其他人
  • 如何将日期固定为类似格式?

    我收到两种日期格式 1 22 2020 1 22 20 我需要转换1 22 2020 to 1 22 20 我目前使用以下内容 但我不确定如何在添加日期之前进行检查和转换 foreach header as field if preg ma
  • 布局充气器无法到达的语句

    我正在尝试使用将我的布局转换为java对象布局充气机但是当我尝试获取参考时LayoutInflater我的班级收到错误 声明无法访问 这是我的代码 package test app import android content Contex
  • 减速器中的条件

    Is it a bad在减速器中使用条件的想法 像这样的东西 case types SET SOME ACTION if typeof someElement undefined return Object assign state som
  • iOS 相机的亮度

    我正在尝试制作一个应用程序 我必须像这个应用程序一样计算相机的亮度 http itunes apple com us app megaman luxmeter id455660266 mt 8 我找到了这个文件 http b2cloud c
  • 在 R 中获取每年 11 月的第四个星期三

    我有一个时间索引矩阵 xts 对象 我只想要每年 11 月的第四个星期三 require quantmod getSymbols GSPC from 1900 01 01 returns GSPC GSPC WED lt weekdays
  • 拖动一张图像会拖动另一张图像

    当我拖动上传图片的右侧部分在 mask1 中 比 mask2 中上传的图像正在拖动 但这不应该发生 Here is 视频链接 另外 如果我仅在蒙版 1 中上传图像并尝试拖动 图像将会消失 但如果我在两个蒙版中上传图像 则图像不会消失 视频链