'use strict'
const squareBody = document.querySelector('.square-body')
const btnReset = document.querySelector('.btn-reset')
const changePosition = (block, direction) => {
const numA = block.querySelector('.block-number').textContent
const coordinates = block.getBoundingClientRect()
const height = coordinates.height
const width = coordinates.width
const x = coordinates.x + (width / 2)
const y = coordinates.y + (height / 2)
let targetElem
switch (direction) {
case 'top':
targetElem = document.elementFromPoint(x, y - height) || document.elementFromPoint(x - width, 650)
if (targetElem.closest('.square-body')) {
const numB = targetElem.textContent
targetElem.textContent = numA
block.querySelector('.block-number').textContent = numB
}
break;
case 'left':
targetElem = document.elementFromPoint(x - width, y)
if (!targetElem.closest('.square-body')) {
targetElem = document.elementFromPoint(1200, y - height)
}
if (targetElem && targetElem.closest('.square-body')) {
const numB = targetElem.textContent
targetElem.textContent = numA
block.querySelector('.block-number').textContent = numB
}
break;
case 'right':
targetElem = document.elementFromPoint(x + width, y)
if (!targetElem.closest('.square-body')) {
targetElem = document.elementFromPoint(650, y + height)
}
if (targetElem && targetElem.closest('.square-body')) {
const numB = targetElem.textContent
targetElem.textContent = numA
block.querySelector('.block-number').textContent = numB
}
break;
case 'bottom':
targetElem = document.elementFromPoint(x, y + height)
if (!targetElem.closest('.square-body')) {
targetElem = document.elementFromPoint(x + width, 15)
}
if (targetElem && targetElem.closest('.square-body')) {
const numB = targetElem.textContent
targetElem.textContent = numA
block.querySelector('.block-number').textContent = numB
}
break;
}
}
const resetField = () => {
const blocks = document.querySelectorAll('.block')
blocks.forEach((block, index) => {
block.querySelector('.block-number').textContent = index + 1
})
saveNumbers()
}
const getNumbers = () => {
const numbers = JSON.parse(localStorage.getItem('numbers'))
if (numbers) {
const blockNumbers = document.querySelectorAll('.block-number')
blockNumbers.forEach((block, index) => {
block.textContent = numbers[index]
})
}
}
const saveNumbers = () => {
const numbers = []
const blockNumbers = document.querySelectorAll('.block-number')
blockNumbers.forEach(block => {
numbers.push(block.textContent)
})
localStorage.setItem('numbers', JSON.stringify(numbers))
}
getNumbers()
squareBody.addEventListener('click', e => {
if (e.target.closest('.arrow')) {
const block = e.target.closest('.block')
const direction = e.target.closest('.arrow').classList[1]
changePosition(block, direction)
saveNumbers()
}
})
btnReset.addEventListener('click', resetField)
@font-face {
font-family: 'Roboto';
src: url('../fonts/Roboto-Regular.woff2') format('woff2'),
url('../fonts/Roboto-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Roboto';
src: url('../fonts/Roboto-Bold.woff2') format('woff2'),
url('../fonts/Roboto-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: swap;
}
.container{
margin: 0 auto;
max-width: 1170px;
display: flex;
flex-direction: column;
align-items: center;
font-family: Roboto, sans-serif;
}
.square-body{
max-width: 780px;
border: 1px solid black;
display: flex;
flex-wrap: wrap;
justify-content: space-around;
margin: 0 auto;
padding: 5px;
}
.block{
width: 150px;
border: 1px solid black;
height: 150px;
margin-bottom: 5px;
/* Permalink - use to edit and share this gradient: https://colorzilla.com/gradient-editor/#1e5799+0,2989d8+50,207cca+51,7db9e8+90&1+0,0.61+75 */
background: -moz-linear-gradient(45deg, rgba(30,87,153,1) 0%, rgba(41,137,216,0.74) 50%, rgba(32,124,202,0.73) 51%, rgba(89,162,220,0.61) 75%, rgba(125,185,232,0.61) 90%); /* FF3.6-15 */
background: -webkit-linear-gradient(45deg, rgba(30,87,153,1) 0%,rgba(41,137,216,0.74) 50%,rgba(32,124,202,0.73) 51%,rgba(89,162,220,0.61) 75%,rgba(125,185,232,0.61) 90%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(45deg, rgba(30,87,153,1) 0%,rgba(41,137,216,0.74) 50%,rgba(32,124,202,0.73) 51%,rgba(89,162,220,0.61) 75%,rgba(125,185,232,0.61) 90%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#9c7db9e8',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
position: relative;
border-radius: 10px;
}
.block-number{
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 44px;
font-weight: bold;
color: #383030;
}
.block-btn{
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
opacity: 0;
visibility: hidden;
}
.block:hover .block-btn{
opacity: 0.7;
visibility: visible;
background-color: #4e4141;
}
.arrow{
position: absolute;
width: 50px;
height: 50px;
border-radius: 50%;
background-color: white;
cursor: pointer;
color: white;
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: all 0.2s;
}
.arrow:hover{
opacity: 1;
}
.arrow img{
width: 80%;
height: 80%;
}
.left{
left: 0;
top: 50%;
transform: translateY(-50%);
}
.right{
right: 0;
top: 50%;
transform: translateY(-50%)
}
.top{
top: 0;
left: 50%;
transform: translateX(-50%)
}
.bottom{
bottom: 0;
left: 50%;
transform: translateX(-50%)
}
.btn-reset{
padding: 16px 70px;
margin: 30px;
cursor: pointer;
border-radius: 10px;
background: -moz-linear-gradient(45deg, rgba(30,87,153,1) 0%, rgba(41,137,216,0.74) 50%, rgba(32,124,202,0.73) 51%, rgba(89,162,220,0.61) 75%, rgba(125,185,232,0.61) 90%); /* FF3.6-15 */
background: -webkit-linear-gradient(45deg, rgba(30,87,153,1) 0%,rgba(41,137,216,0.74) 50%,rgba(32,124,202,0.73) 51%,rgba(89,162,220,0.61) 75%,rgba(125,185,232,0.61) 90%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(45deg, rgba(30,87,153,1) 0%,rgba(41,137,216,0.74) 50%,rgba(32,124,202,0.73) 51%,rgba(89,162,220,0.61) 75%,rgba(125,185,232,0.61) 90%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#9c7db9e8',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
font-size: 24px;
}
.description{
font-size: 20px;
}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="style/style.css">
<script src="scripts/script.js" defer></script>
<title>Document</title>
</head>
<body>
<div class="wrapper">
<div class="container">
<div class="square-body">
<div class="block">
<div class="block-number">1</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">2</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">3</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">4</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">5</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">6</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">7</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">8</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">9</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">10</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">11</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">12</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">13</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">14</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">15</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">16</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">17</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">18</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">19</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">20</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">21</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">22</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">23</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">24</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
<div class="block">
<div class="block-number">25</div>
<div class="block-btn">
<div class="arrow left"><img src="img/arrow-left.svg" alt=""></div>
<div class="arrow right"><img src="img/arrow-right.svg" alt=""></div>
<div class="arrow top"><img src="img/arrow-up.svg" alt=""></div>
<div class="arrow bottom"><img src="img/arrow-down.svg" alt=""></div>
</div>
</div>
</div>
<button class="btn-reset">Reset</button>
<div class="description">
<p>На каждой клетке вы видите кнопки с направлением, напишите скрипт, чтобы при клике на кнопку, клетка
менялась с соответствующей клеткой своим положением, соответсвенно направлению стрелки.</p>
<p>Если вверх,вниз вправо или влево идти некуда, то происходить ничего не должно(со следующей строкой поменяться можно (например 20 с 21)</p>
<p>При клике на кнопку <b>RESET</b> все клетки должны вставать на свои места</p>
<p>Лезть в вёрстку запрещено, использовать только те классы, что предоставлены</p>
<p>Ошибок в консоли быть не должно</p>
</div>
</div>
</div>
</body>
</html>