ν°μ€ν 리 λ·°
μμ ) μ€νλ² μ€ ννμ΄μ§ μ μνκΈ° ( vanilla js ) - μ¬μ© λΌμ΄λΈλ¬λ¦¬
devOhzl 2023. 11. 14. 00:27lodash.js
π _.throttle(ν¨μ,μκ°)
μ€νλλ ν¨μμ μλ₯Ό κ³μ°ν΄μ€λ€.
νλ‘μ νΈκ° 무거μμ§λ©΄ νλ©΄μ μ€ν¬λ‘€ν λ ν¨μλ₯Ό λ§μ΄ μ€ννλκ² λΆλ΄μ€λ¬μΈ μ μλ€.
0.3μ΄ λ¨μλ‘ λΆνλ₯Ό μ€μ ν¨μκ° μ°λ₯΄λ₯΄ μ€νλλ κ²μ λ°©μ§νλ μ©λλ‘ μ¬μ©
ex) νλ©΄μ΄ μ€ν¬λ‘€ λ λ μ€νλλ ν¨μμ κ°μλ₯Ό μΌμ μκ°μ ν λ²μ©λ§ μ€νλλλ‘ μ νμ κ±Έμλ€.
window.addEventListener('scroll', _.throttle( function () {
console.log('scroll')
}, 300));
gsap cdn
μλ°μ€ν¬λ¦½νΈ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬
π gsap.to(μμ, μ§μμκ°, μ΅μ )
μμμ μ λλ©μ΄μ μ§μμκ°, μ΄λ€ μ λλ©μ΄μ μ μ μ©ν 건μ§μ λν μ¬λ¬κ°μ§ μ΅μ μ λͺ μν μ μλ€.
μμμλ css μ νμλ₯Ό μμ±ν΄λ μΌλ€.
1οΈβ£ μμ 1 ) μμκ° μμ°μ€λ½κ² μ¬λΌμ§κ²
μμκ° 0.6μ΄λμ μ λλ©μ΄μ μ²λ¦¬κ° λλ©΄μ, opacityκ° 0μΌλ‘ μ μ μ ν¬λͺ ν΄μ§λ€.
const badgeEl = document.querySelector('header .badges');
gsap.to(badgeEl, .6, {
opacity: 0,
})
νμ§λ§! opacity : 0 μ μμκ° ν¬λͺ ν΄μ§ κ² λΏμ΄κ³ , μμλ κ·Έλλ‘μ¬μ λ§μ°μ€ ν΄λ¦μ΄ κ°λ₯ν μνκ° λλ€.
π display μμ±λ μΆκ°ν΄μ€λ€.
// μ 체 μ½λ
const badgeEl = document.querySelector('header .badges');
window.addEventListener('scroll', _.throttle( function () {
if(window.scrollY > 500 ) {
gsap.to(badgeEl, .6, {
opacity: 0,
display: 'none',
})
} else {
gsap.to(badgeEl, .6, {
opacity: 1,
display: 'block',
})
}
}, 300));
2οΈβ£ μμ 2 ) μμκ° μμ°μ€λ½κ² λνλκ²
opacity : 0 μ΄μλ μμλ€μ κ° μμμ μ§μ°μκ°μ μΆκ°νμ¬ μμ°¨μ μΌλ‘ λνλκ²νλ€.
const fadeEls = document.querySelectorAll('.visual .fade-in');
fadeEls.forEach(function(fadeEl, index){
gsap.to(fadeEl, 1, {
delay : (index + 1) * .7,
opacity : 1
})
})
3οΈβ£ μμ 3 ) μμκ° λ₯λ₯ λ λ€λλ ν¨κ³Ό μ£ΌκΈ°
function floatingObject(selector, delay, size) {
gsap.to(
selector, // μ νμ
random(1.5, 2.5), // μ λλ§€μ΄μ
λμ μκ°
{
y: size, // yμΆμΌλ‘ 20λ§νΌ μ΄λνλ μ λ΄λ§€μ΄μ
repeat: -1, // 무ν λ°λ³΅
yoyo: true, // μ¬μλ μ λλ§€μ΄μ
μ λ€λ‘ λ€μ μ¬μ
ease: Power1.easeInOut,
delay: random(0,delay)
}
)
}
floatingObject('.floating1', 1, 15)
floatingObject('.floating2', .5, 15)
floatingObject('.floating3', 1.5, 20)
4οΈβ£ μμ 4 ) νμ΄μ§ μλ¨μΌλ‘ μ΄λ
const toTopEl = document.querySelector('#to-top');
toTopEl.addEventListener('click', function(){
gsap.to(window, .7, {
scrollTo: 0
})
})
SwiperJS
νλμ¨μ΄ κ°μ μ νκ³Ό μ¬λ¬ κΈ°λ³Έ λμμ κ°μΆ μ¬λΌμ΄λ λΌμ΄λΈλ¬λ¦¬
new Swiper( μμ, μ΅μ )
π μ΅μ
- direction : λ°©ν₯
- autoplay: μλ μ€ν
{ delay : μ§μμκ° }
- loop : λ°λ³΅
- slidesPreView : νλ²μ 보μ¬μ€ μ¬λΌμ΄λ κ°μ
- spaceBetween : μ¬λΌμ΄λ μ¬μ΄ μ¬λ°±
- centeredSlides: 1λ² μ¬λΌμ΄λκ° κ°μ΄λ° 보μ΄κΈ°
- pagination
- el : νμ΄μ§ λ²νΈ μμ μ νμ
- clickable : μ¬μ©μμ νμ΄μ§ λ²νΈ μμ μ μ΄ κ°λ₯ μ¬λΆ
- navigation
- preEl : μ΄μ μ¬λΌμ΄λ
- nextEl : λ€μ μ¬λΌμ΄λ
new Swiper('.promotion .swiper', {
loop: true,
slidesPerView: 3,
spaceBetween: 10,
centeredSlides: true,
autoplay: {
delay: 5000
},
pagination : {
el: '.promotion .swiper-pagination',
clickable: true, // μ¬μ©μμ νμ΄μ§ λ²νΈ μμ μ μ΄ κ°λ₯ μ¬λΆ
},
navigation: {
prevEl: '.promotion .swiper-prev',
nextEl: '.promotion .swiper-next',
}
})
Youtube API
Youtube λμμμ μ μ΄ν μ μλ€.
https://developers.google.com/youtube/iframe_api_reference?hl=ko
iframe μ½μ μ λν YouTube Player API μ°Έμ‘° λ¬Έμ | YouTube IFrame Player API | Google for Developers
μ ν리μΌμ΄μ μ YouTube νλ μ΄μ΄λ₯Ό μ½μ ν©λλ€.
developers.google.com
μ νλΈ μμμ΄ μΆλ ₯λ μμΉμ μμλ₯Ό μμ±νλ€.
<div class="youtube__cover"></div>
μ΅μ μ μ§μ νκ³ μ€ννλ€.
// This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// This function creates an <iframe> (and YouTube player)
// after the API code downloads.
function onYouTubeIframeAPIReady() {
new YT.Player('player', {
videoId: 'dLgC4yhZ578',
playerVars: { // μμμ μ¬μνκΈ° μν λ³μλ€
autoplay: true, // μλ μ¬μ μ 무
loop: true, // λ°λ³΅ μ¬μ μ 무
playLists: 'dLgC4yhZ578' // λ°λ³΅ μ¬μν μ νλΈ μμ ID
},
events: {
onReady: function(event) {
event.target.mute(); // μμκ±°
}
}
});
}
ScrollMagic
μ€ν¬λ‘€κ³Ό μμμ μνΈ μμ©μ μν μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬μ
λλ€.
λνμ μΌλ‘ μ΄λ€ μμκ° νμ¬ νλ©΄μ 보μ΄λ μνμΈμ§λ₯Ό νμΈν λ μ¬μ©ν©λλ€.
new ScrollMagic.Scene().setClassToggle()
Scene : νΉμ ν μμλ₯Ό κ°μνλ μ΅μ μ μ§μ ν΄μ£Όλ λ©μλ
setClassToggle : ν΄λμ€ μμ±μ μ§μ (toggle λ°©μμΌλ‘)
π νΉμ ν μΉμ μ΄ νλ©΄μ 보μ΄κΈ° μμν λ μ λλ©μ΄μ μ μΆκ°ν΄μ€ μ μλ€.
1οΈβ£ Scene μ΅μ
- triggerElement : 보μ¬μ§μ μ¬λΆλ₯Ό κ°μν μμλ₯Ό μ§μ
- triggerHook : νΈλ¦¬κ±°κ° μμλλ μ§μ
triggerHook: .8
0.8 μ΄λΌλ λ·°ν¬νΈμ μ§μ μ 걸리면 νΈλ¦¬κ±°κ° λλ€
κ°μνλμ΅μ μ ν΅ν΄ ν΄λΉνλ μμκ° νλ©΄μ 보μ¬μ§λ€λΌκ³ νλ¨μ΄ λλ©΄ κ·Έ λ°μ μλ setClassToggleμ΄λΌλ λ©μλλ₯Ό μ€ν
2οΈβ£ setClassToggle(μμ, ν κΈν ν΄λμ€ μ΄λ¦)
setClassToggle(spyEl, 'show')
ν΄λΉνλ μμκ° νλ©΄μ 0.8 μ§μ μ μ§λλ©΄ 'show' ν΄λμ€κ° μΆκ°λλ€.
β μμ
const spyEls = document.querySelectorAll('section.scroll-spy');
spyEls.forEach( function(spyEl) {
new ScrollMagic
.Scene({
triggerElement: spyEl, /* 보μ¬μ§μ μ¬λΆλ₯Ό κ°μν μμλ₯Ό μ§μ */
triggerHook: .8,
})
.setClassToggle(spyEl, 'show')
.addTo(new ScrollMagic.Controller());
})
ν΄λμ€κ° 'scroll-spy' μΈ μμλ€μ κ°μνκ³ μ€ν¬λ‘€ ν¨κ³Όλ₯Ό μ§μ νλ€.
<section class="season-product scroll-spy">
<div class="inner">
<img src="./images/floating3.png" alt="image" class="floating floating3" />
<img src="./images/season_product_image.png" alt="season" class="product back-to-position back-to-right delay-0"/>
<div class="text-group">
<img src="./images/season_product_text1.png" alt="season" class="title back-to-position back-to-left delay-1"/>
<img src="./images/season_product_text2.png" alt="season" class="description back-to-position back-to-left delay-2"/>
<div class="more back-to-position back-to-left delay-3">
<a link="javascript:void(0)" class="btn"> μμΈν 보기 </a>
</div>
</div>
</div>
</section>
.back-to-position {
opacity: 0;
transition: 1s;
}
.back-to-position.back-to-right {
transform: translateX(-150px);
}
.back-to-position.back-to-left {
transform: translateX(150px);
}
.show .back-to-position {
opacity: 1;
transform: translateX(0);
}
.show .back-to-position.delay-0 {
transition-delay: 0s;
}
.show .back-to-position.delay-1 {
transition-delay: .3s;
}
.show .back-to-position.delay-2 {
transition-delay: .6s;
}
.show .back-to-position.delay-3 {
transition-delay: .9s;
}
'back-to-position' ν΄λμ€μΈ μμλ€μ opacity:0 μΌλ‘ μ²μμ 보μ΄μ§ μκ³ ,
'back-to-right / left' ν΄λμ€ cssλ₯Ό ν΅ν΄ xμΆμΌλ‘ -150 , +150 λ§νΌ λ¨μ΄μ Έμλ€.
πμ€ν¬λ‘€μ ν΄μ 0.8 μ§μ μ μ§λ 'show'ν΄λμ€κ° μΆκ°λλ©΄ opacity : 1 λ‘ λ³΄μ΄κ² λλ©΄μ translateX(0)μΌλ‘ xμΆ 0 μ§μ μΌλ‘ λμμ¨λ€.
μΆμ²
νλ‘ νΈμλ μΉ κ°λ°μ λͺ¨λ κ² μ΄κ²©μ°¨ ν¨ν€μ§
'μ€μ΅ μμ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
- Total
- Today
- Yesterday
- Chart
- xμΆμ€ν¬λ‘€
- BarChart
- npm
- chartjs
- Vscodeλ¨μΆν€
- package
- Figma κΈ°μ΄
- νκ²½μ€μ
- SASS
- echarts
- Figma λ²νΌ
- SCSS
- κΉμ볡μ¬
- Location
- VUE
- web
- κ°μ²΄
- javascript
- νλ‘ νΈμλ
- Legend
- package-lock
- piechart
- frontend
- Figma Style
- vscode
- npm install
- figma
- κ°μ²΄λ³΅μ¬
- μμ볡μ¬
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |