본문으로 건너뛰기

[JS] Element style에는 단위를 꼭 붙여주자

· 약 4분

회사 프로젝트에서 Vue.js(Vue 2)JavaScript ES6+를 사용하고 있다.

상당한 코드에서 혼재되어 있는 jQuery를 걷어내는 작업을 하다가 알게 된 내용을 적어본다.

jQuery를 걷어내보자

Vue를 사용하고 있으니 jQuery를 사용할 이유가 없을 것 같았다. 따라서 jQuery스러운 코드가 조금이라도 보이면 모조리 걷어내고 싶어졌다.

이미 작성되어있던 플러그인의 내용 중 스크롤 이벤트가 동작하는 코드를 찾았다.

$(window).on('scroll', function () {
$('.box').css({ top: ($(window).scrollTop() / 2) * -1 });
});

코드 해석: jQuery

  1. window 객체를 scroll(스크롤)할 때 👉 스크롤 이벤트 발생
  2. 함수를 실행한다. 👉 어떤 함수를?
  3. .box 엘리먼트의 css 값을 바꾼다. 👉 어떻게?
  4. top에 window의 스크롤 위치를 구해서 2로 나눈 값에 -1을 곱한다.

jQuery와 동일한 로직을 순수 자바스크립트로 아래와 같이 작성했다.

const boxElem = document.querySelector('.box');

window.addEventListener('scroll', () => {
boxElem.style.top = (window.scrollY / 2) * -1;
});

코드 해석: JavaScript

  1. boxElem 상수에 .box를 넣어준다.
  2. window 객체에 scroll 이벤트를 추가한다.
  3. 스크롤 이벤트가 발생하면 함수를 실행한다. 👉 어떤 함수를?
  4. boxElem의 style 속성의 top 값을 'window의 스크롤 위치를 구해서 2로 나눈 값에 -1을 곱한다.'로 변경한다.

...? 하지만, 위 코드는 동작하지 않는다.


jQuery의 CSS API

jQuery API 문서 중 .css()를 찾아봤다.

문서 중간쯤에 이러한 내용이 있다.

When a number is passed as the value, jQuery will convert it to a string and add px to the end of that string. If the property requires units other than px, convert the value to a string and add the appropriate units before calling the method.

내용인 즉, jQuery에서는 숫자값이 들어오면 자동으로 px(픽셀) 단위를 붙여준다는 말이다.

따라서 jQuery는 px이나 rem 따위의 **단위(unit)**를 넣지 않았음에도 기본값인 px를 붙여주기 때문에 작동하는 것이고, 바닐라 자바스크립트로 새로 작성한 코드가 작동하지 않았던 이유는 단위를 누락했기 때문이었다.

Element style에는 단위를 꼭 붙여주자

다시 위의 코드로 돌아가서,

boxElem.style.top = `${(window.scrollY / 2) * -1}px

마지막에 px 단위를 추가해줬다.

const boxElem = document.querySelector('.box');

window.addEventListener('scroll', () => {
boxElem.style.top = `${(window.scrollY / 2) * -1}px`;
});

이제 정상적으로 동작하는 것을 확인했다 😊