class Test extends Component {
//координаты X в данный момент
state = {
x: 0,
}
//Отлавливаем клик
//Задаем позицию "absolute"
//Добавляем новый обработчик на перемещение
onmousedown = (event) => {
/*document.getElementById(*)*/
event.target.style.position = 'absolute';
document.addEventListener('mousemove', this.onmousemove);
}
//Отлавливаем "отпускание" клавиши и удаляем событие перемещения
onmouseup = (event) => {
document.removeEventListener('mousemove', this.onmousemove);
}
//функция перемещения с "центрированием элемента", чтобы курсор мыши оказался по центру элемента (мяча)
onmousemove = (event) => {
this.setState({x: event.clientX})
let footboll = document.getElementById('footboll');
let { top, left, right, bottom } = footboll.getBoundingClientRect();
if(top == event.pageY - 30 || left == event.pageX - 30 || right == event.pageX + 30 || bottom == event.pageY + 30) {
document.removeEventListener('mousemove', this.onmousemove);
}
//Функция "реактивного" перемещения элемента по окну.
this.onPosition(event.pageX, event.pageY);
document.addEventListener('mouseup', (event) => this.onmouseup(event))
}
onPosition = (clientX, clientY) => {
let element = document.getElementById('boll');
let widths = element.getBoundingClientRect().width;
let height = element.getBoundingClientRect().height;
element.style.top = clientY - height /2 + 'px';
element.style.left = clientX - widths /2 + 'px';
}
render() {
return (
<div className="test">
<h3>Тестовый компонент...</h3>
<button className="btn btn-primary">Кликни</button>
<div id="footboll" className="footboll">
<div>x:{this.state.x}</div>
<div className="football-goal"
id="football-goal"></div>
<span id ="boll"
className="boll"
onMouseDown={(event) => this.onmousedown(event)}
onDragStart={(event) => event.preventDefault()}></span>
</div>
</div>
)
}
}
export default Test;