Запустить преобразование CSS в позиции мыши

Я просто хочу, чтобы преобразование началось с позиции щелчка мыши.

Не работает (как я и ожидал). Почему бы и нет и что мне следует изменить?

var x, y;
const hint = document.getElementById('hint');
const pageOverlay = document.getElementById('pageOverlay');

document.addEventListener("DOMContentLoaded", () => {

  document.addEventListener("click", (e) => {
    console.info('clicked at ' + x + ', ' + y);
    hide(hint);
    expand(pageOverlay);
  });

  document.onmousemove = function (e) {
    x = e.clientX;
    y = e.clientY;
  };
});

function hide(elm) {
  elm.setAttribute("style", "visibility: hidden; opacity: 0");
}

function expand(elm) {
  elm.setAttribute("style", 
   "transform-origin:" + x + "px " + y + "px;" +
   "visibility: visible;" +
   "opacity: 1;" +
   "transform: scale(1)");
}
.pageOverlay {
  position: fixed;
  z-index: 1000;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
  background: lightblue; 
  opacity: 0;
  visibility: hidden;  
  transition: 0.8s linear;
  transform: scale(.2);
}
<span id = "hint">Click somewhere!<br/><br/>
 I want/expect the transformation to start at the mouse position.</span>
 
 <div id = "pageOverlay" class = "pageOverlay">
  <h1>Overlay</h1> 
 </div>

Коден: https://codepen.io/r-w-c/pen/jOoPRBY

Как вы ожидаете, что это сработает?

Steffen 15.05.2024 13:21

@Steffen: Как я уже писал. Там, где вы щелкаете, я хочу, чтобы наложенный div расширялся (масштаб от 0,2 до 1).

RWC 15.05.2024 13:25

Правильно ли я понимаю, что оверлей должен расти из того места, где пользователь нажал, или как выглядит предполагаемый результат?

NoOorZ24 15.05.2024 13:51

Учитывая то, как вы расположили элемент, я не думаю, что это сработает, просто изменив источник преобразования. Если я правильно понял, как именно вы хотите, чтобы это вело себя (тоже не совсем уверен), то я думаю, вам придется сначала позиционировать элемент по координатам щелчка (вероятно, по центру вокруг этого x/y), а затем выяснить, где установить начало координат так, чтобы при расширении из этой начальной позиции при конечном размере 100vh/100vh оно выглядело так, как если бы оно изначально было позиционировано в 0/0.

CBroe 15.05.2024 13:57

@CBroe, это может иметь смысл. Я попробую это, посмотрим, сработает ли это. Спасибо.

RWC 15.05.2024 13:59

@CBroe, к сожалению, это не сработало. elm.setAttribute("style", "left: " + x + ";" + "top: " + y + ";" + "width: 100vw;" + "height: 100vh;" + "transform-origin:" + x + "px" + y + "px;" + "видимость: видимый;" + "непрозрачность: 1;" + "transform: масштаб(1)"); } Все равно начните преобразование с другой позиции (я думаю, 0,0).

RWC 15.05.2024 14:08

@NoOorZ: Точно.

RWC 15.05.2024 14:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я не совсем понимаю, чего вы хотите, но думаю, что понял. Проблема сохраняется, поскольку вы анимируете не только эффект масштабирования, но и изменение положения элемента. Если изменить свойство перехода на transition: transform 0.8s linear;, наложение мгновенно переместится, а затем начнет расширяться.

var x, y;
const hint = document.getElementById('hint');
const pageOverlay = document.getElementById('pageOverlay');

document.addEventListener("DOMContentLoaded", () => {

  document.addEventListener("click", (e) => {
    console.info('clicked at ' + x + ', ' + y);
    hide(hint);
    expand(pageOverlay);
  });

  document.onmousemove = function (e) {
    x = e.clientX;
    y = e.clientY;
  };
});

function hide(elm) {
  elm.setAttribute("style", "visibility: hidden; opacity: 0");
}

function expand(elm) {
  elm.setAttribute("style", 
   "transform-origin:" + x + "px " + y + "px;" +
   "visibility: visible;" +
   "opacity: 1;" +
   "transform: scale(1)");
}
.pageOverlay {
  position: fixed;
  z-index: 1000;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
  background: lightblue; 
  opacity: 0;
  visibility: hidden;  
  transition: transform 0.8s linear;
  transform: scale(.2);
}
<span id = "hint">Click somewhere!<br/><br/>
 I want/expect the transformation to start at the mouse position.</span>
 
 <div id = "pageOverlay" class = "pageOverlay">
  <h1>Overlay</h1> 
 </div>

Я считаю, что @RWC, возможно, тоже неправильно смотрит на "transform-origin:" + x + "px " + y + "px;". Это исходная координата относительно трансформируемого объекта, как хорошо объяснено и показано здесь Developer.mozilla.org/en-US/docs/Web/CSS/transform-origin Итак, если вы нажмете на всю веб-страницу по адресу 1,1 анимация начнется с 1,1 внутри анимируемого элемента, а не с 1,1 страницы. Чтобы обеспечить соответствие эффекту трансформации, вам нужно будет использовать x,y щелчка, чтобы переместить элемент в эти x,y, а затем отметить звездочку transform-origin в фиксированном месте (например, «центр»).

LuxZg 15.05.2024 14:02

@LuxZg Я тоже так думал, но элемент имеет размеры 100vw и 100vh, поэтому transform-origin перемещает его по экрану, хотя и не идеально. Если вы удалите transform: scale(1) из функции expand, вы увидите, что она перемещается.

Steffen 15.05.2024 14:06

Спасибо @Steffen Steffen, ваш фрагмент кода делает именно то, что я хотел, и ваше объяснение точное. Я думал, что Transform-Origin работает по-другому. С анимацией и трансформациями особо не занимался.

RWC 15.05.2024 14:23

Вот демо: codepen.io/r-w-c/pen/QWRbrzB Страница будет содержать больше изображений, и если вы нажмете на изображение, вы как будто расширите это изображение. Я также хотел бы иметь эффект перекрестного затухания, но мне еще предстоит выяснить, как это сделать. Определенно не эксперт по CSS.

RWC 15.05.2024 14:36

Другие вопросы по теме