0

I am trying to convert this jQuery Code into Vanilla JavaScript code. I'm having trouble with some of the methods. I think I have some of them, but some of them not.

Jquery:

jQuery('.image').click(function() {
  jQuery(this).toggleClass('normal-zoom zoom-in');
});

jQuery('.image').on('mousemove', function(event) {

  var bbox = event.target.getBoundingClientRect();
  var mouseX = event.clientX - bbox.left;
  var mouseY = event.clientY - bbox.top;
  var xPercent = (mouseX / bbox.width) * 100;
  var yPercent = (mouseY / bbox.height) * 100;

  jQuery(this).css('transform-origin', (xPercent+'% ' + yPercent+ '%') );

});

jQuery('.image').on('mouseenter', function() {
  jQuery(this).addClass('zoom-in');
  jQuery(this).removeClass('normal-zoom');
});

jQuery('.image').on('mouseleave', function() {
  jQuery(this).addClass('normal-zoom');
  jQuery(this).removeClass('zoom-in');
});

I tried.

Javascript:

document.querySelector('.image').onclick = function() {
  document.querySelector(this).classList.toggle('normal-zoom zoom-in');
};

document.querySelector('.image').addEventListener('mousemove', function(event) {

  var bbox = event.target.getBoundingClientRect();
  var mouseX = event.clientX - bbox.left;
  var mouseY = event.clientY - bbox.top;
  var xPercent = (mouseX / bbox.width) * 100;
  var yPercent = (mouseY / bbox.height) * 100;

  document.querySelector(this).css('transform-origin', (xPercent+'% ' + yPercent+ '%') );

});

document.querySelector('.image').addEventListener('mouseenter', function() {
  document.querySelector(this).classList.add('zoom-in');
  document.querySelector(this).classList.remove('normal-zoom');
});

document.querySelector('.image').addEventListener('mouseleave', function() {
  document.querySelector(this).classList.add('normal-zoom');
  document.querySelector(this).classList.remove('zoom-in');
});

Where is the error?

1 Answer 1

1

I have added two comments to the code to show two lines I fixed and why they needed fixing.

Additionally, I replaced every instance of document.querySelector(this) with document.querySelector('.image'), because the callbacks inside .onclick and .addEventListener do not bind this to the selected element the same way JQuery does, so you need to re-select the element each time. In your code, this is referencing the callback function, which is not what you want.

document.querySelector('.image').onclick = function() {
  document.querySelector('.image').classList.toggle('zoom-in');// I split this line into two lines, because `.toggle()` can only accept one classname at a time.
  document.querySelector('.image').classList.toggle('normal-zoom');
};

document.querySelector('.image').addEventListener('mousemove', function(event) {
  var bbox = event.target.getBoundingClientRect();
  var mouseX = event.clientX - bbox.left;
  var mouseY = event.clientY - bbox.top;
  var xPercent = (mouseX / bbox.width) * 100;
  var yPercent = (mouseY / bbox.height) * 100;

  document.querySelector('.image').style.transformOrigin = xPercent+'% ' + yPercent+'%';// There is no such `.css()` method on DOM nodes. Instead, set an element's css by using the `style` property.
});

document.querySelector('.image').addEventListener('mouseenter', function() {
  document.querySelector('.image').classList.add('zoom-in');
  document.querySelector('.image').classList.remove('normal-zoom');
});

document.querySelector('.image').addEventListener('mouseleave', function() {
  document.querySelector('.image').classList.add('normal-zoom');
  document.querySelector('.image').classList.remove('zoom-in');
});

I would recommend using this code instead though, as it's cleaner, easier to read, implements DRY practices, and works to prevent bugs related to changes in the DOM.

const imageElement = document.querySelector('.image');

imageElement.addEventListener('click', function() {
  imageElement.classList.toggle('zoom-in');
  imageElement.classList.toggle('normal-zoom');
};

imageElement.addEventListener('mousemove', function(event) {
  const bbox = imageElement.getBoundingClientRect();
  const mouseX = event.clientX - bbox.left;
  const mouseY = event.clientY - bbox.top;
  const xPercent = (mouseX / bbox.width) * 100;
  const yPercent = (mouseY / bbox.height) * 100;

  imageElement.style.transformOrigin = xPercent+'% ' + yPercent+'%';
});

imageElement.addEventListener('mouseenter', function() {
  imageElement.classList.add('zoom-in');
  imageElement.classList.remove('normal-zoom');
});

imageElement.addEventListener('mouseleave', function() {
  imageElement.classList.add('normal-zoom');
  imageElement.classList.remove('zoom-in');
});
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for the explanation! I understand better now.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.