๊ตญ๋น์ง์ D+48
Front-end ๋ฏธ๋ํ๋ก์ ํธ 4์ผ์ฐจ
- ์คํฌ๋กค ์ ๋๋ฉ์ด์ ์ถ๊ฐ -
์ค๋ ํ ์ผ
- ์คํฌ๋กค์์น์ ๋ฐ๋ผ ํ์ฌ์น์ ์์น์ ์น์ ์์น์ ๋ฐ๋ฅธ Y์ ์๋๊ฐ์ ๊ตฌํ๋๋ก ์ค์
- section0์ ๋ํ ์คํฌ๋กค ์ ๋๋ฉ์ด์ ์ถ๊ฐ ๋ฐ ํ ์คํธ
ํ์ผ ๊ตฌ์ฑ ๋ฐ ๋ด์ฉ
• style.css
- ์คํฌ๋กค ์ ๋๋ฉ์ด์ ์์ ๋ํ๋ฌ๋ค ์ฌ๋ผ์ก๋ค๋ฅผ ์ํด์ ์ด๊ธฐ์ ๋ถํฌ๋ช ๋๋ฅผ 0์ผ๋ก ์ค์ ํด์ฃผ์๋ค.
.section0-message {
opacity: 0; /* ๋ถํฌ๋ช
๋ : 0 */
font-size: 4.5rem;
font-weight: bold;
width: 100%;
height: 6rem;
left: 0;
top: 5em;
text-align: center;
}
• index.html
- ๊ฐ๋ฉ์์ง๋ง๋ค ์ด๋ฒคํธ๋ฅผ ๊ฑธ์ด์ฃผ๊ธฐ ์ํด์ ํด๋์ค๋ช ์ ๊ฐ๊ฐ a, b, c, d๋ก ์ค์ ํด ์ฃผ์๋ค.
<section id="section-0" class="scroll-section">
<div class="section0-product-name">
<h1 class="product-name">Real Apple Pro</h1>
</div>
<div class="sticky-element section0-message a">
<p>์จ์ ํ ๋น ์ ธ๋ค๊ฒ ํ๋ ๋น๊น</p>
</div>
<div class="sticky-element section0-message b">
<!-- <p>๋์ ๊ฑด๊ฐ์ ์ฑ์์ฃผ๋ ํฅ๊ธฐ</p> -->
</div>
<div class="sticky-element section0-message c">
<!-- <p>๊นจ๋ํ ์์ฐ์ ์ ์ ํจ</p> -->
</div>
<div class="sticky-element section0-message d">
<!-- <p>์๋กญ๊ฒ ์
๊ฐ๋ฅผ ์ฐพ์์จ ๋งคํน</p> -->
</div>
</section>
• main.js
- ์คํฌ๋กค์ด๋ฒคํธ ์ถ๊ฐ๋ฅผ ์ํด ํ์ํ ํจ์๋ค์ ์์ฑํด ์ฃผ์๋ค.
- getPrevSetionHeight : ํ์ฌ ์น์ ์ ์์ ์๋ ์น์ ์ ๋์ด์ ํฉ
- playAnimation : ์ ๋๋ฉ์ด์ ๋์ ํจ์
- calcValue : ๋น์จ์๋ฐ๋ฅธ CSS๊ฐ์ ๊ณ์ฐํด์ฃผ๋ ํจ์
// ํ์ฌ ์น์
์ ์์ ์๋ ์น์
์ ๋์ด ํฉ.
const getPrevSectionHeight = function()
{
// ํ์ฌ ์น์
์ด 0 ==> 0
// ํ์ฌ ์น์
1 ==> section0์ ๋์ด
// ํ์ฌ ์น์
2 ==> section0์ ๋์ด + section1์ ๋์ด
let prevHeight = 0;
for(let i = 0; i < currentSection; i++)
{
prevHeight = prevHeight + sectionSet[i].height;
}
return prevHeight;
}
// messageA_opacity_out : [0, 1, {start: 0.05, end: 0.14}]
const calcValue = function(values)
{
let result = 0;
let rate = 0;
const height = sectionSet[currentSection].height;
let partStart; // start ์คํฌ๋กค๊ฐ
let partEnd; // end ์คํฌ๋กค๊ฐ
let partHeihgt; // end - start
if(values.length === 2)
{
// 1. ์คํฌ๋กค ๋น์จ์ ๊ตฌํ๋ค.
rate = sectionYOffset / height;
// 2. ๋น์จ์ ๋ฐ๋ฅธ ์ค์ ์ ์ฉํ CSS๊ฐ์ ๊ณ์ฐํ๋ค.
result = (rate * (values[1] - values[0])) + values[0];
}
else if(values.length === 3)
{
// step01) ๋ชจ๋ ๊ฐ๋ค์ ๋น์จ์ด ์๋ ์ค์ ํ ํ๋ค.
partStart = values[2].start * height;
partEnd = values[2].end * height;
partHeihgt = partEnd - partStart;
// ์ค์ ํ ๋ฒ์๊ฐ์ ๋ฒ์ด๋ ๊ฐ์ 0๋๋ 1๋ก ์ค์ ํด์ค๋ค.
if(sectionYOffset < partStart)
{
result = values[0];
}
else if(sectionYOffset > partEnd)
{
result = values[1];
}
else
{
// step02) sectionYOffset์์ partStart๊ฐ์ ๋นผ๋ด์ด ์ค์ ๋ฒ์๋ด์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๊ณ
// ๋ฒ์๊ฐ์ ๋น์จ์ ๊ตฌํ๋ค.
rate = (sectionYOffset - partStart) / partHeihgt;
// step03) ๊ฐ์ cssํ ํ์ฌ result์์ ๋ฃ์ด์ค๋ค.
result = (rate * (values[1] - values[0])) + values[0];
}
}
return result;
}
const playAnimation = function()
{
let value;
let scrollRate = sectionYOffset / sectionSet[currentSection].height;
let objects = sectionSet[currentSection].objs;
switch(currentSection)
{
case 0:
if(scrollRate <= 0.25)
{
if(scrollRate <= sectionSet[currentSection].vals.messageA_opacity_out[2].end)
{
value = calcValue(sectionSet[currentSection].vals.messageA_opacity_out);
}
else if(scrollRate > sectionSet[currentSection].vals.messageA_opacity_out[2].end)
{
value = calcValue(sectionSet[currentSection].vals.messageA_opacity_in);
}
console.log('message A๋ฅผ ์ ๋๋ฉ์ด์
');
}
else if((scrollRate > 0.25) && (scrollRate <= 0.5))
{
value = calcValue(sectionSet[currentSection].vals);
console.log('message B๋ฅผ ์ ๋๋ฉ์ด์
');
}
else if((scrollRate > 0.5) && (scrollRate <= 0.75))
{
value = calcValue(sectionSet[currentSection].vals);
console.log('message C๋ฅผ ์ ๋๋ฉ์ด์
');
}
else if((scrollRate > 0.75) && (scrollRate <= 1))
{
value = calcValue(sectionSet[currentSection].vals);
console.log('message D๋ฅผ ์ ๋๋ฉ์ด์
');
}
// 1. messageA์ ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค. --> ๋ฌดํ๋ฐ๋ณต ์ฐ๋ ค ์์์ํ๋ค.
break;
case 1:
// 2. ์คํฌ๋กค ๊ฐ์ ๋ฐ๋ผ ์ ์ฉํด์ผํ CSS๊ฐ์ ๊ณ์ฐํ๋ค.
// 3. ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฉํ๋ค.
break;
default:
break;
}
objects.messageA.style.opacity = value;
}
๊ฒฐ๊ณผํ๋ฉด
๋ฐ์ํ
'์๋ > ๊ตญ๋น์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[D+49] Front-end ๋ฏธ๋ํ๋ก์ ํธ 5์ผ์ฐจ : ์คํฌ๋กค ์ ๋๋ฉ์ด์ ๊ตฌ์ฒดํ (0) | 2022.11.30 |
---|---|
[D+49] ์ด๋ฏธ์ง, ์บ๋ฒ์ค (0) | 2022.11.30 |
[D+48] Animation ๋ณต์ต (0) | 2022.11.28 |
[D+47] CSS Animation ๊ฐ๋ (0) | 2022.11.28 |
[D+47] Front-end ๋ฏธ๋ํ๋ก์ ํธ 3์ผ์ฐจ : section ๋ ์ด์์ ์ค์ (0) | 2022.11.27 |
๋๊ธ