@Danila232

Не пойму работу Object.assign() для documentElement?

В общем задача такая: надо чтобы при движении курсора по экрану - для определённого элемента в CSS-свойство transform: rotate подставлялись координаты движения мыши, и типо ты двигаешь курсор по экрану - и этот элемент наклоняется.

// 1й вар
document.addEventListener('mousemove', e => {
	Object.assign(document.documentElement, {
		style: `
                   --move-x: ${(e.clientX - window.innerWidth / 2) * -.005}deg;
		   --move-y: ${(e.clientY - window.innerHeight / 2) * .01}deg;
			  `
		})
})

//2й вар
document.addEventListener('mousemove', e => {
	let moveX = (e.clientX - window.innerWidth / 2) * (-.005) + 'deg';
	let moveY = (e.clientY - window.innerHeight / 2) * .01 + 'deg';

document.querySelector('.layers__container').style.transform = `rotateX(${moveY})`
document.querySelector('.layers__container').style.transform = `rotateY(${moveX})`
})

65a43b596e898331050811.jpeg

У меня есть два варианта решения. Я не до конца понимаю принцип работы 1го варианта, и не понимаю, почему не работает 2й.
Насчёт 1го: как я понял - мы при движении мыши по экрану, берём documentElement(он же тег html) и через Object.assign - копируем туда Объект, в котором есть Ключ 'style'.
ЧТО Я НЕ ПОНЯЛ: Object.assign - это метод копирования свойств одного Объекта в другой. То бишь
мы берём объект documentElement и копируем в него свойства другого Объекта. И как я думал, по такой логике если вызвать
console.log(Object.entries(document.documentElement))

то выведутся все пары ключ+значение, и выведется ключ Style со своим значением. Но его нет.
Но при этом, каким то образом в тег html у нас добавился АТРИБУТ style, в котором уже прописаны его значения из JS.

Если коротко: я не пойму с чего вдруг метод Object.assign инлайново прописал для documentElement АТРИБУТ style. Как он это вообще мог сделать?
65a43b2952039412956307.jpeg

А насчёт 2го варианта: он неправильно работает, видимо один
.style.transform
перезаписывает другой, и в общем движение происходит только по одной Оси. Можно как то исправить?
  • Вопрос задан
  • 371 просмотр
Решения вопроса 1
liaFcipE
@liaFcipE
> не понимаю, почему не работает 2й.

document.querySelector('.layers__container').style.transform = `rotateX(${moveY})`
document.querySelector('.layers__container').style.transform = `rotateY(${moveX})`


Потому, что ты перетираешь значение style.transform двумя разными значениями, второе заменяет первое.

> метод Object.assign инлайново прописал для documentElement АТРИБУТ style.
Не совсем, он буквально сделал:

document.documentElement.style.prop1 = "value1";
document.documentElement.style.prop2 = "value2";

Сам он ничего не прописывал, это уже логика работы DOM ноды и ее API.
Просто прочти документацию к Object.assign, лучше в отрыве от DOM API, ибо у DOM API и его объектов есть свои магические методы, геттеры, сеттеры и прочее:

65a456eb32d63620125871.png

> console.log(Object.entries(document.documentElement)) то выведутся все пары ключ+значение

У "простых" объектов - да, но все сложнее. Если посмотреть MDN описание для Object.entries, то можно увидеть, что он отдает только перечисляемые свойства: An array of strings representing the given object's own enumerable string-keyed property keys.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
IvanU7n
@IvanU7n
1) а зачем Object.assign? document.documentElement.style = '--test: 1;' тоже работает, т.к. это прописано в спецификации:
interface mixin ElementCSSInlineStyle {
  [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};


2) просто объединить два выражения в одну через пробел
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы