💻 CMG Digital 클론코딩
pc와 모바일에서 각각 다른 애니메이션 효과를 사용하거나 또는 모바일에서는 애니메이션 효과를 사용하고 싶지 않을 경우 matchMedia()를 사용해서 해결 할 수 있다.
또한 페이지가 로드되고 해당 요소의 css를 저장하는 기능을 하는 saveStyles()도 필요하다. gsap 애니메이션 효과는 인라인 스타일로 삽입되기 때문에 css 파일보다 우선적용 된다. 따라서 화면이 리사이즈 될 경우 방금 실행된 애니메이션 때문에 요소의 기존 css가 깨질 수 있어 saveStyle로 인라인 스타일을 지워야 망가지지 않는다.
ScrollTrigger.saveStyles('.sc-intro .floating-txt');
ScrollTrigger.matchMedia({
"(min-width: 1024px)": function(){
gsap.fromTo('.sc-intro .floating-txt', {
opacity: 0
}, {
scrollTrigger: {
trigger: '.sc-intro',
start: 'top 50%',
end: 'top 25%',
scrub: true,
// markers: true,
},
opacity: 1
});
}
});
<div class="container">
<div id="number">0</div>
</div>
.container {
margin-top: 1000px;
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
#number {
font-size: 200px;
font-weight: 700;
color: #000;
}
gsap.registerPlugin(ScrollTrigger);
var startCount = {var: 0};
gsap.to(startCount, {
var: 500,
duration: 3,
onUpdate: changeNumber,
scrollTrigger: {
trigger: '#number',
toggleActions: 'restart none reverse none'
//play pause resume reset
},
})
function changeNumber() {
number.innerHTML = (startCount.var).toFixed();
}
💡 실제 화면 보기
뒤에서 JS로 커서의 top, left 값을 조절해야 하기 때문에 position 속성 정의는 필수이다
커스텀 커서가 실제 커서 위치의 중심에 딱 들어맞도록 transform: translate(-50%, -50%) 속성을 넣어준다.
커스텀 커서가 실제 커서의 위치에 딱 붙어 움직이게 하기 위해서 window에 mousemove 이벤트 추가하고 마우스가 움직일 때마다 실제 커서의 좌표값(pageX, pageY)을 커스텀 커서의 left, top 속성에 넣어준다. (position 속성을 정의한 이유)
좌우 스크롤이 생기는 경우는 드물기 때문에 pageX 값은 그대로 적용이 가능하지만, 상하 스크롤이 생기는 페이지의 경우, Y좌표값만 적용시 스크롤다운 했을 때 커서가 위로 밀리는 현상이 발생하므로 scroll된 값도 함께 고려해주어야 실제 커서와 동일한 위치에 커스텀 커서를 위치시킬 수 있다.
event.pageX, event.pageY는 스크롤을 포함한 전체 문서를 기준으로 마우스 커서의 좌표 값을 가져온다.
브라우저의 크기가 달라도 전체 문서를 기준으로 하기 때문에 마우스의 좌표값은 유지된다.
pageX - 브라우저 전체 페이지에서 x좌표 반환
pageY - 브라우저 전체 페이지에서 y좌표 반환
event.clientX와 event.clientY는 현재 브라우저를 기준으로 마우스 커서의 위치 값을 가져오며 브라우저의 크기와 보는 위치에 따라서 x와 y좌표의 위치가 달라진다.
클라이언트 영역(현재 보여지는 브라우저 화면 기준)을 기준으로 가로, 세로 좌표를 제공
clientX - 스크롤은 무시하고 해당페이지 상단을 0으로 측정하여 클라이언트 영역에서 X위치를 반환
clientY - 스크롤은 무시하고 해당페이지 상단을 0으로 측정하여 클라이언트 영역에서 Y위치를 반환
<div class="cursor"></div>
.cursor {
position: absolute;
transform: translate(-50%, -50%);
width: 1rem;
height: 1rem;
border-radius: 50%;
background-color: orange;
z-index: 100;
}
const mouseCursor = document.querySelector('.cursor');
window.addEventListener('mousemove', function(e){
mouseCursor.style.left = e.clientX + 'px';
mouseCursor.style.top = e.clientY + 'px';
});
flex가 적용된 컨테이너 안에 있는 item들은 html에 입력된 순서대로 배치가된다. 소스코드를 건드리지 않고 css만으로 출력 순서를 변경하고 싶을 경우 order 속성을 사용할 수 있다.
order 속성은 flex item의 순서를 정할 수 있으며 기본값은 0이다. 숫자가 작을 수록 먼저온다. 만약 값이 같을 경우 입력한 순서대로 출력된다.
order속성의 값으로 음수도 가능하며 이것은 특정 아이템을 앞으로 옮기고 싶을 때 유용하다.
부모에 flex가 적용되지 않을 경우에는 사용할 수 없으며 order 속성의 값은 부모가 아닌 그 안에 있는 각각의 items들에게 부여해야 한다.
<div class="container">
<div class="item item1">1번</div>
<div class="item item2">2번</div>
<div class="item item3">3번</div>
</div>
.container {
display: flex; /*order 속성 사용시 부모에 flex 적용 필수 */
flex-direction: column; /*item 세로로 출력*/
width: 500px;
margin: 50px auto;
background: royalblue;
}
.item {
color: #fff;
font-size: 25px;
text-align: center;
padding: 30px 0;
}
📌 order 속성 적용 전 출력 화면
/* 숫자가 작을수록 위에 배치됨 */
.item.item1 {
order: 3;
}
.item.item2 {
order: 1;
}
.item.item3 {
order: 2;
}
📌 order 속성 적용 후 출력 화면
💡 실제 화면 보기
css에는 다양한 선택자가 존재하며 그 중에는 가상 요소 선택자 (Pseudo-Elements)도 있다. 가상요소 선택자 ::selection는 마우스로 드래그 한 영역의 스타일을 변경할 수 있다.
웹 사이트에 테마 컬러가 있을 경우 드래그 선택시 테마 컬러로 선택되도록 배경색을 지정해서 사이트의 통일감을 높일 수 있다.
::selection {
background-color: black;
color: yellow;
}
::-moz-selection {
/* 파이어폭스 */
background-color: black;
color: yellow;
}
📌 선택영역 스타일 변경 전
📌 선택영역 스타일 변경 후
아래 설명은 스크롤 자체의 기능은 살리면서 스크롤바만 없애는 코드이며 웹 브라우저 별로 각기 다른 코드가 필요하다.
요소의 높이가 한정되어 있지 않으면 스크롤 기능이 들어가지 않기 때문에 높이 값을 지정해줘야 정상적으로 적용된다.
<div class="content-box">
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
<p>content</p>
</div>
.content-box {
width: 200px;
height: 200px; /*높이가 한정되어 있어야 스크롤 기능 가능*/
border: 5px solid #000;
border-radius: 5px;
padding: 8px;
box-sizing: border-box;
background: #eee;
overflow-y: scroll; /* y축 스크롤바 생성 */
}
📌 스크롤바 기능만 넣은 출력 화면
.content-box {
overflow-y: scroll; /* y축 스크롤바 생성 */
-ms-overflow-style: none; /* 인터넷 익스플로러 */
scrollbar-width: none; /* 파이어폭스 */
}
.content-box::-webkit-scrollbar {
display: none; /* 크롬, 사파리, 오페라, 엣지 */
}
💡 실제 화면 보기
$('.btn').click(function () {
const scrollTop = $('.section').offset().top;
$('html, body').animate({scrollTop: scrollTop}, 500);
});
const btn = document.querySelector('.btn');
const section = document.querySelector('.section');
btn.addEventListener('click', function() {
section.scrollIntoView({behavior: 'smooth'});
});
구문
clamp(min, prefered, max)
#예시
.title {
font-size: clamp(1rem, 2.5vw, 2rem);
}