$inputTag.addEventListener('keyup', (event) => { (...) if(event.keyCode === 13) { items.push(value); $notification.classList.add('Notification--show'); $notification.classList.remove('Notification--hide'); $itemList.innerHTML = items.map(item => `${item}`).join(''); } setTimeout(() => { $notification.classList.add('Notification--hide'); $notification.classList.remove('Notification--show'); }, 20..
๋ฌธ์ window.addEventListener('scroll', function (event) { let {scrollTop, scrollHeight, clientHeight} = event.target.scrollingElement; let ratio = (scrollTop / contentHeight) * 100; //์ ์ฒด ๋ฌธ์์ ๋ํ ํ์ฌ ์คํฌ๋กค๋ ๋น์จ๋ฅผ ํผ์ผํธํ scrollBar.style.transform = `translateX(-${100 - ratio}%)`; scrollBar.style.transition = 'transform 0.5s ease-out'; }) ๋ค์๊ณผ ๊ฐ์ด ์คํฌ๋กค๋ ๋น์จ์ ๋ฐ๋ผ Scroll Indicator๊ฐ ๋์ ์ผ๋ก ์์ง์ด๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์๋ค. ํ์ง๋ง ์คํฌ๋กค์ด ๋๊น..
๋ฌธ์ li.addEventListener('click', () => { const obj = { image: this.dataset.image, ...JSON.parse(this.dataset.user) } modal.classList.add('active'); thumbnail.src = obj.image; profileImg.src = obj.medium; userName.textContent = obj.name; insta.textContent = obj.instagram_username; }) https://choi95.tistory.com/106 JS ์์์ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ฒด ๋์ ํ ๋น https://unsplash.com/documentation#get-a-random-photo Unsplas..
https://unsplash.com/documentation#get-a-random-photo Unsplash API Documentation | Free HD Photo API | Unsplash Getting started This document describes the resources that make up the official Unsplash JSON API. If you have any problems or requests, please contact our API team. Creating a developer account To access the Unsplash API, first join. Registering your appl unsplash.com ๋ค์๊ณผ ๊ฐ์ด API๋ฅผ ํตํด ์ด..
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์๋ค์ ํตํด ์คํฌ๋กค ์์น์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ Header ๋์์ธ์ด ๋๋๋ง๋๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์๋ค. scrollTop window.addEventListener('scroll', (event) => { let {scrollTop} = event.target.scrollingElement; //document.documentElement.scrollTop || document.body.scrollTop nav.classList.add('active'); //active ํด๋์ค ์ฌ๋ถ์ ๋ฐ๋ผ ํค๋ ๋์์ธ์ด ์์ดํ๊ฒ ์๋ if(scrollTop = 50 ) ? nav.classList.add('active') : nav.classList.remove('active'); }) Window ์ธํฐํ์ด์ค์ ..
document.addEventListener('click', function (event) { if(event.target === document.querySelector('button')) return; (...) }, false); ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค๋ ์์ด๋๋ช ์ด ์ง์ ๋์ด ์์ง ์์ ๋ฒํผ ์์๋ฅผ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ด์์ ์๋ณํ๊ธฐ ์ํด์ ์กฐ๊ฑด๋ฌธ์ ์์ฑํ์๋ค. ํ์ง๋ง ์ฌ๋ฌ ๋ฒํผ ์ค ๊ฐ์ฅ ์ฒ์์ ์๋ ๋ฒํผ ์์๋ง ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค. ๋ฌธ์ ํด๊ฒฐ Document.querySelector()๋ ์ ๊ณตํ ์ ํ์ ๋๋ ์ ํ์ ๋ญ์น์ ์ผ์นํ๋ ๋ฌธ์ ๋ด ์ฒซ ๋ฒ์งธ Element๋ฅผ ๋ฐํํฉ๋๋ค. ์ผ์นํ๋ ์์๊ฐ ์์ผ๋ฉด null์ ๋ฐํํฉ๋๋ค. querySelector๋ก ์ฐธ์กฐํ ๋ ธ๋ ๊ฐ์ฒด๋ ๋ฌธ์ ๋ด ์ฒซ ๋ฒ์งธ Elem..
๋ค์๊ณผ ๊ฐ์ด Progress-Bar๋ฅผ ๊ตฌํํ ๋, ๋ฒํผ์ ํด๋ฆญํ ๋ค์ ์งํ ๋ฐ ์์์ width ๊ฐ์ด 25%๊ฐ ๋์์ ๊ฒฝ์ฐ ํด๋น ์ ๋๋ฉ์ด์ ์ ์ข ๋ฃ์ํค๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์๋ค. if(elem.style.getPropertyValue('width') === range * current) { //ํ์ฌ ์งํ ๋ฐ ๊ฐ๋ก ๋๋น๊ฐ ์ง์ 25%์ ๋๋ฌํ์ ๊ฒฝ์ฐ clearInterval(intervalId); //์ ๋๋ฉ์ด์ ์ข ๋ฃ current++; } ํ์ง๋ง ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ๊ณ ์งํ ๋ฐ๋ ๋์์ด ์ข ๋ฃ๋์ง ์์ ์ฑ ๋ฌดํ ๋ฃจํ๋ก ๋น ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค. getPropertyValue์ ๋ฐํ๊ฐ ๋ฌธ์ getPropertyValue๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ฌธ์ ๊ฐ ์์๋ค. The CSSStyleDeclar..
startTimer : function(){ if(!this.isPending) { this.timerId = setInterval(() => { this.currentSec+=1; if(this.currentSec >= 60) { this.currentMin+=1; this.currentSec = 0; } document.querySelector('#min').textContent = `${this.currentMin < 10 ? `0${this.currentMin}` : `${this.currentMin}`}`; document.querySelector('#sec').textContent = `${this.currentSec < 10 ? `0${this.currentSec}` : `${this.cur..