拖动一个图像可以拖动另一个图像
Dragging one image makes other image to drag
当我在 mask1 中拖动上传图像 的右侧时,mask2 中上传的图像正在拖动,但这种情况不应该发生....
这里是video link
此外,如果我只在蒙版 1 中上传图像并尝试拖动,图像会消失,但如果我在两个蒙版中上传图像,则图像不会消失
密码本: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>
编辑
是不是因为那两张图片水平和垂直重叠了?
编辑 2
对于某些问题仍然不清楚,在下面的图片中,如果用户尝试拖动 B 部分,连同 B 部分,C 部分和 D 部分也一起拖动,但那不应该发生.....
为什么要定义两次 ondragover 属性?
无论如何,在定义 onDragOverSec 之后,您稍后将其重写为 onDragOver,
从而触发您用于第一个元素的事件处理程序。
<div class="minaimg masked-imgb" ondragover="onDragOverSec(event)"ondragover="onDragOver(event)" >
附带说明一下,这段代码可以重写得更DRY,方法是将两种情况之间的差异作为变量传递给同一个函数,而不是每个函数的两个副本
您可以使用CSS clip-path 属性 根据需要切断HTML 个元素角。通过工具很容易得到正确的值,请google 'css clip-path maker'.
.masked-imga
-webkit-clip-path: polygon(0 9%, 0 0, 35% 0%, 49% 0, 56% 27%, 73% 46%, 100% 61%, 100% 100%, 65% 100%, 0 100%, 0 100%, 0 30%);
clip-path: polygon(0 9%, 0 0, 35% 0%, 49% 0, 56% 27%, 73% 46%, 100% 61%, 100% 100%, 65% 100%, 0 100%, 0 100%, 0 30%);
.masked-imgb
-webkit-clip-path: polygon(0 9%, 0 0, 35% 0%, 100% 0, 100% 0, 100% 0, 100% 61%, 100% 100%, 58% 100%, 40% 90%, 18% 63%, 0 39%);
clip-path: polygon(0 9%, 0 0, 35% 0%, 100% 0, 100% 0, 100% 0, 100% 61%, 100% 100%, 58% 100%, 40% 90%, 18% 63%, 0 39%);
因为元素相互重叠,我认为最好的解决方法是设置 z-index
。它并不完美,在元素之间切换时,您必须先拖动未重叠的元素。
fileupa.onchange = e => {
target_imga.src = URL.createObjectURL(fileupa.files[0]);
// set z-index
document.querySelector(".masked-imga").style = 'z-index: ' + zIndex++;
}
fileupb.onchange = e => {
target_imgb.src = URL.createObjectURL(fileupb.files[0]);
// set z-index
document.querySelector(".masked-imgb").style = 'z-index: ' + zIndex++;
}
let prevX = 0,
prevY = 0,
translateX = 0,
translateY = 0,
scale = 1,
zoomFactor = 0.1;
let zIndex = 1;
function onDragStart(evt) {
// set z-index of the parent element
evt.target.closest(".minaimg").style = 'z-index: ' + zIndex++;
if (evt.target.nextElementSibling && // fix if .nextElementSibling is not element
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;
}
.container {
border: 1px solid #DDDDDD;
width: 612px;
height: 612px;
position: relative;
background: red;
}
.masked-imga {
-webkit-mask-image: url(https://i.postimg.cc/y8T0y7zY/heart1.png);
mask-image: url(https://i.postimg.cc/y8T0y7zY/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(https://i.postimg.cc/xdTMsB0G/heart2.png);
mask-image: url(https://i.postimg.cc/xdTMsB0G/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;
}
<input type="file" id="fileupa" />
<input type="file" id="fileupb" />
<div class="container">
<div class="minaimg masked-imga" 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 id="masked_imgb" class="minaimg masked-imgb" ondragover="onDragOverSec(event)">
<div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg2">
<div class="minaimgb">
<img id="target_imgb" alt="">
<div></div>
</div>
</div>
</div>
</div>
演示图片
我想这就是您要找的:
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;
let current_elm = null;
function onDragStart(evt) {
if (current_elm != null) return;
if (evt.dataTransfer && evt.dataTransfer.setDragImage) {
evt.dataTransfer.setDragImage(evt.target.nextElementSibling, 0, 0);
current_elm = evt.target;
}
prevX = evt.clientX;
prevY = evt.clientY;
}
function dragEnd(event) {
current_elm=null;
}
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(current_elm != null) current_elm.style.transform = transform;
}
.container {
border: 1px solid #DDDDDD;
width: 612px;
height: 612px;
position: relative;
background: red;
}
.masked-imga {
-webkit-mask-image: url(https://i.postimg.cc/y8T0y7zY/heart1.png);
mask-image: url(https://i.postimg.cc/y8T0y7zY/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(https://i.postimg.cc/xdTMsB0G/heart2.png);
mask-image: url(https://i.postimg.cc/xdTMsB0G/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;
}
<input type="file" id="fileupa" />
<input type="file" id="fileupb" />
<div class="container" ondragover="onDragOver(event)" >
<div class="minaimg masked-imga">
<div draggable="true" ondragstart="onDragStart(event)" ondragend="dragEnd(event)" id="uploadedImg">
<div class="minaimga">
<img id="target_imga" alt="">
<div></div>
</div>
</div>
</div>
<div class="minaimg masked-imgb">
<div draggable="true" ondragstart="onDragStart(event)" ondragend="dragEnd(event)" id="uploadedImg2">
<div class="minaimgb">
<img id="target_imgb" alt="">
<div></div>
</div>
</div>
</div>
</div>
这里我只是在.container
div上定义了ondragover
,这是两个图像的容器。并且在 onDragStart
函数内部,我将当前拖动的元素保存到 current_elm
中,以便在 onDragStart
的另一个调用中没有任何事情发生,直到 current_elm
变为空(如果它不为空则意味着已经有另一个元素正在拖动,因此我们不应该考虑拖动新元素。)并且在 dragEnd
回调函数中,我们应该将 current_elm
设置为 null 以启用如果需要新的拖动过程(我希望你明白我的意思;)。current_elm
的另一个优点是不需要定义两种类型的 updateStyle
函数,因为你可以更新相关元素使用 current_elm
.
如果需要更多解释,请告诉我。
这是我的解决方案。您必须跟踪哪个元素开始拖动。
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剪辑路径结合,排除两张图片的重叠,内角问题就解决了。
编辑:现在只能从红色内部启动拖动 squares.Those 是元素不重叠的 "safe zones"。必须为使用的每个面具图像组合定义安全区域。
当我在 mask1 中拖动上传图像 的右侧时,mask2 中上传的图像正在拖动,但这种情况不应该发生....
这里是video link
此外,如果我只在蒙版 1 中上传图像并尝试拖动,图像会消失,但如果我在两个蒙版中上传图像,则图像不会消失
密码本: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>
编辑
是不是因为那两张图片水平和垂直重叠了?
编辑 2
对于某些问题仍然不清楚,在下面的图片中,如果用户尝试拖动 B 部分,连同 B 部分,C 部分和 D 部分也一起拖动,但那不应该发生.....
为什么要定义两次 ondragover 属性? 无论如何,在定义 onDragOverSec 之后,您稍后将其重写为 onDragOver, 从而触发您用于第一个元素的事件处理程序。
<div class="minaimg masked-imgb" ondragover="onDragOverSec(event)"ondragover="onDragOver(event)" >
附带说明一下,这段代码可以重写得更DRY,方法是将两种情况之间的差异作为变量传递给同一个函数,而不是每个函数的两个副本
您可以使用CSS clip-path 属性 根据需要切断HTML 个元素角。通过工具很容易得到正确的值,请google 'css clip-path maker'.
.masked-imga
-webkit-clip-path: polygon(0 9%, 0 0, 35% 0%, 49% 0, 56% 27%, 73% 46%, 100% 61%, 100% 100%, 65% 100%, 0 100%, 0 100%, 0 30%);
clip-path: polygon(0 9%, 0 0, 35% 0%, 49% 0, 56% 27%, 73% 46%, 100% 61%, 100% 100%, 65% 100%, 0 100%, 0 100%, 0 30%);
.masked-imgb
-webkit-clip-path: polygon(0 9%, 0 0, 35% 0%, 100% 0, 100% 0, 100% 0, 100% 61%, 100% 100%, 58% 100%, 40% 90%, 18% 63%, 0 39%);
clip-path: polygon(0 9%, 0 0, 35% 0%, 100% 0, 100% 0, 100% 0, 100% 61%, 100% 100%, 58% 100%, 40% 90%, 18% 63%, 0 39%);
因为元素相互重叠,我认为最好的解决方法是设置 z-index
。它并不完美,在元素之间切换时,您必须先拖动未重叠的元素。
fileupa.onchange = e => {
target_imga.src = URL.createObjectURL(fileupa.files[0]);
// set z-index
document.querySelector(".masked-imga").style = 'z-index: ' + zIndex++;
}
fileupb.onchange = e => {
target_imgb.src = URL.createObjectURL(fileupb.files[0]);
// set z-index
document.querySelector(".masked-imgb").style = 'z-index: ' + zIndex++;
}
let prevX = 0,
prevY = 0,
translateX = 0,
translateY = 0,
scale = 1,
zoomFactor = 0.1;
let zIndex = 1;
function onDragStart(evt) {
// set z-index of the parent element
evt.target.closest(".minaimg").style = 'z-index: ' + zIndex++;
if (evt.target.nextElementSibling && // fix if .nextElementSibling is not element
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;
}
.container {
border: 1px solid #DDDDDD;
width: 612px;
height: 612px;
position: relative;
background: red;
}
.masked-imga {
-webkit-mask-image: url(https://i.postimg.cc/y8T0y7zY/heart1.png);
mask-image: url(https://i.postimg.cc/y8T0y7zY/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(https://i.postimg.cc/xdTMsB0G/heart2.png);
mask-image: url(https://i.postimg.cc/xdTMsB0G/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;
}
<input type="file" id="fileupa" />
<input type="file" id="fileupb" />
<div class="container">
<div class="minaimg masked-imga" 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 id="masked_imgb" class="minaimg masked-imgb" ondragover="onDragOverSec(event)">
<div draggable="true" ondragstart="onDragStart(event)" id="uploadedImg2">
<div class="minaimgb">
<img id="target_imgb" alt="">
<div></div>
</div>
</div>
</div>
</div>
演示图片
我想这就是您要找的:
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;
let current_elm = null;
function onDragStart(evt) {
if (current_elm != null) return;
if (evt.dataTransfer && evt.dataTransfer.setDragImage) {
evt.dataTransfer.setDragImage(evt.target.nextElementSibling, 0, 0);
current_elm = evt.target;
}
prevX = evt.clientX;
prevY = evt.clientY;
}
function dragEnd(event) {
current_elm=null;
}
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(current_elm != null) current_elm.style.transform = transform;
}
.container {
border: 1px solid #DDDDDD;
width: 612px;
height: 612px;
position: relative;
background: red;
}
.masked-imga {
-webkit-mask-image: url(https://i.postimg.cc/y8T0y7zY/heart1.png);
mask-image: url(https://i.postimg.cc/y8T0y7zY/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(https://i.postimg.cc/xdTMsB0G/heart2.png);
mask-image: url(https://i.postimg.cc/xdTMsB0G/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;
}
<input type="file" id="fileupa" />
<input type="file" id="fileupb" />
<div class="container" ondragover="onDragOver(event)" >
<div class="minaimg masked-imga">
<div draggable="true" ondragstart="onDragStart(event)" ondragend="dragEnd(event)" id="uploadedImg">
<div class="minaimga">
<img id="target_imga" alt="">
<div></div>
</div>
</div>
</div>
<div class="minaimg masked-imgb">
<div draggable="true" ondragstart="onDragStart(event)" ondragend="dragEnd(event)" id="uploadedImg2">
<div class="minaimgb">
<img id="target_imgb" alt="">
<div></div>
</div>
</div>
</div>
</div>
这里我只是在.container
div上定义了ondragover
,这是两个图像的容器。并且在 onDragStart
函数内部,我将当前拖动的元素保存到 current_elm
中,以便在 onDragStart
的另一个调用中没有任何事情发生,直到 current_elm
变为空(如果它不为空则意味着已经有另一个元素正在拖动,因此我们不应该考虑拖动新元素。)并且在 dragEnd
回调函数中,我们应该将 current_elm
设置为 null 以启用如果需要新的拖动过程(我希望你明白我的意思;)。current_elm
的另一个优点是不需要定义两种类型的 updateStyle
函数,因为你可以更新相关元素使用 current_elm
.
如果需要更多解释,请告诉我。
这是我的解决方案。您必须跟踪哪个元素开始拖动。
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剪辑路径结合,排除两张图片的重叠,内角问题就解决了。
编辑:现在只能从红色内部启动拖动 squares.Those 是元素不重叠的 "safe zones"。必须为使用的每个面具图像组合定义安全区域。