Now the mosaic can be assembled in any sequence, but it is necessary to consistently, that is, first to the first mosaic the second, to the second third, to the third fourth, otherwise it will not work, I can not understand how
"use strict"; // ΠΌΠ°ΡΡΠΈΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² IMG. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ var imgs = [] imgs.push(document.getElementById("r1")); imgs.push(document.getElementById("r2")); imgs.push(document.getElementById("r3")); imgs.push(document.getElementById("r4")); // ΠΌΠ°ΡΡΠΈΠ², Ρ
ΡΠ°Π½ΡΡΠΈΠΉ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠΎΠ·Π°ΠΈΠΊΠΈ var expectedPositions = [ [0, 0], [0, 160], [90, 0], [90, 160] ]; // "ΡΠΎΡΠ΅Π΄Π½ΠΈΠ΅" ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠ·Π°ΠΈΠΊΠΈ var neighbors = { 0: [1, 2], 1: [0, 3], 2: [0, 3], 3: [1, 2] } // ΡΠΎΠ±ΡΡΠΈΠ΅, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅Π΅ ΠΏΡΠΈ ΠΊΠ»ΠΈΠΊΠ΅ ΠΌΡΡΡΡ. ΠΠ°ΡΠ°Π»ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ document.onmousedown = function(e) { if (!e.target.classList.contains('draggable')) { return false; } // Π² Π½Π°ΡΠ°Π»Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΊΡΡΡΠΎΡΠ° ΠΎΡΠ½ΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ ΠΈ ΡΠ°ΠΌΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ (Π²Π½ΡΡΡΠΈ ΡΠΎΠ±ΡΡΠΈΡ event) var event = e; var offsetX = e.offsetX; var offsetY = e.offsetY; // ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΠ°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ ΠΏΡΠΈ ΡΠΎΠ±ΡΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ (onmousemove) function moveAt(e) { event.target.style.left = e.pageX - offsetX + 'px'; event.target.style.top = e.pageY - offsetY + 'px'; } // ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ°Ρ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅ΠΊΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΠ°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ // ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π½Π° ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΡΡΡ ΠΌΠΎΠ·Π°ΠΈΠΊΠΈ ΠΈ Π΄Π»Ρ "ΠΏΡΠΈΠ»ΠΈΠΏΠ°Π½ΠΈΡ" ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ Π΄ΡΡΠ³ ΠΊ Π΄ΡΡΠ³Ρ function getCoordDifferenceFromExpected(imgIdx1, imgIdx2) { var img1 = {} var img2 = {} var realDiff = {} var expectedDiff = {} img1.X = parseInt(imgs[imgIdx1].style.left); img1.Y = parseInt(imgs[imgIdx1].style.top); img2.X = parseInt(imgs[imgIdx2].style.left); img2.Y = parseInt(imgs[imgIdx2].style.top); realDiff.X = img1.X - img2.X; realDiff.Y = img1.Y - img2.Y; expectedDiff.X = expectedPositions[imgIdx1][0] - expectedPositions[imgIdx2][0] expectedDiff.Y = expectedPositions[imgIdx1][1] - expectedPositions[imgIdx2][1] var result = { "diff": Math.abs((expectedDiff.X - realDiff.X)) + Math.abs((expectedDiff.Y - realDiff.Y)), "expectedDiff": expectedDiff, "img1": img1, "img2": img2 } return result; } // ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌ function moveAtCoordinates(x, y) { event.target.style.left = x + 'px'; event.target.style.top = y + 'px'; } // ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠ°Ρ "ΠΏΡΠΈΠ»ΠΈΠΏΠ°Π½ΠΈΠ΅" ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ Π² ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ Π½ΡΠΆΠ½ΠΎΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ // Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π΄Π²ΡΡ
"ΡΠΎΡΠ΅Π΄Π½ΠΈΡ
" ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ // Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΠΏΡΡΠΊΠ°Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ function correctPosition() { var id = event.target.id; var alpha = 25; var imgIndex = parseInt(id.replace("r", "")) - 1; var posDiff; for (var i = 0; i < neighbors[imgIndex].length; i++) { posDiff = getCoordDifferenceFromExpected(imgIndex, neighbors[imgIndex][i]) if (Math.abs(posDiff.diff) < alpha) { moveAtCoordinates(posDiff.img2.X + posDiff.expectedDiff.X, posDiff.img2.Y + posDiff.expectedDiff.Y); break; } } } // ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠ°Ρ ΠΌΠΎΠ·Π°ΠΈΠΊΡ Π½Π° ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΡΡΡ // Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΠΏΡΡΠΊΠ°Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ function checkMosaic() { var posDiff; var mosaicAssembled = true; for (var i = 0; i < neighbors[0].length; i++) { posDiff = getCoordDifferenceFromExpected(0, neighbors[0][i]) if (Math.abs(posDiff.diff) != 0) { mosaicAssembled = false; break; } } for (var i = 0; i < neighbors[3].length; i++) { posDiff = getCoordDifferenceFromExpected(3, neighbors[3][i]) if (Math.abs(posDiff.diff) != 0) { mosaicAssembled = false; break; } } if (mosaicAssembled) { setTimeout(alert, 300, "ΠΡ ΡΠΎΠ±ΡΠ°Π»ΠΈ ΠΌΠΎΠ·Π°ΠΈΠΊΡ!"); } } // ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ "Π½Π°Π²Π΅ΡΡ
", ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°Π»Π°ΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°ΠΌΠΈ; Π½Π°ΡΠ°Π»ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ e.target.style.zIndex = 1000; moveAt(e); // ΡΠΎΠ±ΡΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ document.onmousemove = function(e) { moveAt(e); } // ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΎΡΠΏΡΡΠΊΠ°Π½ΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΠΌΡΡΠΈ (Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ) document.onmouseup = function(e) { document.onmousemove = null; correctPosition(); checkMosaic(); document.onmouseup = null; } } // Π·Π°ΠΌΠ΅Π½Π° ΡΡΠ°Π½Π΄Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ document.ondragstart = function() { return false; }; body { background-color: #CCE6FF; } <h1 style="text-align: center">Π‘ΠΎΠ±Π΅ΡΠΈ ΠΌΠΎΠ·Π°ΠΈΠΊΡ!</h1> <p>ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ ΠΊΠ°ΡΡΠΈΠΊΠΈ ΠΌΡΡΠΊΠΎΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠΈΡΡΠ½ΠΎΠΊ</p> <img src="images/r1.gif" id="r1" class="draggable" style="position: absolute; top: 120px; left: 25px;"> <img src="images/r2.gif" id="r2" class="draggable" style="position: absolute; top: 120px; left: 130px;"> <img src="images/r4.gif" id="r4" class="draggable" style="position: absolute; top: 300px; left: 25px;"> <img src="images/r3.gif" id="r3" class="draggable" style="position: absolute; top: 300px; left: 130px;">