본문 바로가기

티스토리 스크롤 반응 탑(top) 다운(down) 버튼

by JINYH 2022. 1. 7.
728x90
반응형

'탑(Top) 버튼' 및 '다운(Down) 버튼'

PC를 통한 웹사이트 방문의 경우 키보드 (Home btn & End btn / Page Up btn & Page Down btn)와 마우스 (Mouse Scroll & Cursor)가 있기 때문에 없어도 괜찮을 수 있지만, Mobile을 통한 웹사이트 방문의 경우 화면 이동 시에 손으로 계속 조작해야 하는 불편함이 있기 때문에 필수 기능이라고 할 수 있다.

 

본 글은 웹사이트 방문자의 편의를 높여 주는 '탑(Top) 버튼' 및 '다운(Bottom) 버튼' 생성 방법에 대한 내용이다.

 

총 7단계에 걸쳐 풀이했으니 하나하나 보면서 적용해 보기 바란다.

 

 

 

 

 


 

 

 

 

 

★ 미리 보기

 

버튼은 화면 우측 하단에 위치한다.

스크롤을 내리면 '탑 버튼'이 사라지면서 '다운 버튼'이 나타나고, 스크롤을 올리면 '다운 버튼'이 사라지면서 '탑 버튼'이 나타난다.

 

01-탑-다운-버튼-완료

 

 

 

 

 

★ 파일 준비

 

'버튼 이미지 파일'을 공유하니 아래와 같이 티스토리에 업로드한다.

 

btn_png.zip
0.01MB
02-파일-업로드

 

 

 

 

 

아래는 '버튼 이미지 파일'을 직접 준비할 경우의 참고사항이다.

 

 

 

① 세트 이미지 사용

아래 예시와 같이 디자인 톤 앤 매너를 고려하여 세트 이미지 사용을 추천한다.

03-버튼-세트-이미지

 

 


② PNG 이미지 사용

좌측 예시와 같이 버튼 모양 외에 배경이 없는 PNG 형식 이미지 사용을 추천한다. 만약 우측 예시와 같은 이미지를 사용할 경우 CSS에 'border-radius: 50%'를 넣어 사각형을 원형으로 변경할 수 있다.

04-png-이미지-사용

 

 

 

③ 파일 이름 지정

HTML과 CSS에 '버튼 이미지 파일'의 이름이 코드로 삽입되니 '버튼 이미지 파일'의 이름을 정확하게 지정 후 업로드한다.

 

 

 

④ 파일 크기 지정

HTML과 CSS에서 '화면 상 버튼의 크기'를 변경할 수 없으니 '버튼 이미지 파일'의 가로 및 세로 크기를 정확하게 지정 후 업로드한다.

 

 

 

⑤ 파일 변경 시 적용 지연

버튼의 디자인을 변경하기 위해서 '기존 버튼 이미지 파일'을 삭제한 후 다른 디자인의 '새로운 버튼 이미지 파일'을 업로드할 경우, 화면을 새로고침을 해도 화면 상에서는 '새로운 버튼 이미지 파일'의 적용이 일시적으로 지연될 수도 있다.

 

 

 

 

 

1] 기본형 탑 버튼

 

가장 먼저 화면 우측 하단에 버튼을 생성해 보겠다.

 

 

 

1-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

화면에 버튼을 생성하고, 버튼 클릭 시 화면 최상단으로 올라가는 효과를 설정하는 코드다.

 

<!-- 탑버튼 시작 -->

// 화면에 버튼 생성
<div id="btn_top" title="위로"><img src='./images/btn_top.png' alt='top' /></div>

// 버튼 클릭 시 효과 설정
<script>
  $("#btn_top").click(function() {  // 버튼 클릭 시
		$('html,body').scrollTop(0);  // 스크롤탑이 '0'이 된다는 - 스크롤이 제일 위로 올라간다는 의미
	});
</script>

<!-- 탑버튼 끝 -->


</body>

06-탑-버튼-html-적용

 

id="btn_top"

해당 div의 id를 'btn_top'으로 설정한다는 의미이며, id인 'btn_top'을 변경할 경우 '$("#btn_top")'과 같이 이후에 삽입하는 모든 'btn_top'을 동일하게 변경해야 한다.

 

title="위로"

마우스 커서를 버튼 위에 올렸을 때 나타나는 텍스트이며, '위로', 'Top' 등 기호에 맞게 삽입하면 된다.

 

img src='./image/btn_top.png'

기 업로드한 '버튼 이미지 파일'의 위치 경로를 의미하며, 'btn_top.png'는 파일 이름과 파일 형식이니 업로드한 '버튼 이미지 파일'에 맞게 삽입한다.

 

alt='top'

해당 이미지의 대체 텍스트를 의미하며, '검색 엔진 최적화(SEO)'를 위해 꼭 삽입해야 한다.

 

 

 

 

 

1-2] CSS 작업

아래 코드를 CSS에 삽입한다.

화면 상 버튼 생성 위치를 설정하는 코드다.

 

/* 탑버튼 스타일 */
#btn_top {
position: fixed;
right: 10px;
bottom: 40px;
z-index: 999; 
}
position: fixed; 위치 고정
right: 10px; 화면 우측 기준 10px 이격
bottom: 40px; 화면 하단 기준 40px 이격
z-index: 999; 레이어 개념, 숫자가 클수록 위에 위치

07-탑-버튼-css-적용

 

 

 

 

 

1-3] 작업 결과

① 버튼이 화면 우측 하단에 생성

② 버튼이 스크롤 위치와 관계없이 상항 출력

③ 버튼 클릭 시 화면 최상단으로 바로 이동

 

08-탑-버튼-적용-완료-pc

 

 

 

버튼의 위치를 'bottom: 40px;'로 설정함에 따라 PC에서 볼 때는 버튼이 하단에서 많이 이격 되어 있는데, bottom을 40px 정도로 해줘야 아래와 같이 모바일에서 볼 때는 버튼이 '하단 광고 배너'에 가려지지 않는다.

 

09-탑-버튼-적용-완료-mobile

 

 

 

 

 

2] 스타일을 적용한 탑 버튼

 

다음은 버튼에 스타일을 적용해 보겠다.

 

 

 

2-1] CSS 작업

아래 코드를 CSS에 삽입한다.

버튼이 본문 내용을 가리지 않도록 버튼에 투명도를 주고, 버튼이 시각적으로 부각 및 강조될 수 있도록 버튼에 그림자 효과와 마우스 오버 효과를 설정하는 코드다.

 

/* 탑버튼 스타일 */
#btn_top {
position: fixed;
right: 10px;
bottom: 40px;
z-index: 999;
opacity: 0.5;
border-radius: 50%;
box-shadow: 0 0 10px rgba(0, 0, 0, .4);
}
#btn_top:hover{
background-color: black;
transition: 0.3s;
transform: scale(1.1);
}
opacity: 0.5; 투명도 0.5 적용
border-radius: 50%; 모서리 라운드 50% 적용
box-shadow: 0 0 10px rgba(0, 0, 0, .4); 그림자 적용
:hover{ 마우스 오버 시 효과 설정
background-color: black; 배경 컬러 black 적용
transition: 0.3s; 효과 적용 시간 0.3s 적용
transform: scale(1.1); 크기 확대 1.1 적용

10-탑-버튼-효과-css

 

 

 

 

 

2-2] 작업 결과

① 버튼에 투명도 효과를 주어 버튼이 본문 내용을 가리지 않게 출력

② 버튼에 그림자 효과를 주어 버튼이 시각적으로 입체감 있게 출력

③ 마우스 오버 효과를 주어 버튼이 반응형으로 강조 및 확대되게 출력

 

11-탑-버튼-효과-적용-pc
12-탑-버튼-효과-적용-mobile
좌측 이미지 - 변경 전 / 우측 이미지 - 변경 후

 

 

 

 

 

3] 부드럽게 이동하는 탑 버튼

 

다음은 버튼 클릭 시 부드럽게 이동하는 효과를 적용해 보겠다.

 

 

 

3-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

버튼 클릭 시 화면 최상단으로 바로 이동하지 않고 일정 시간을 두고 이동하게 하는 코드로, 코드에 있는 '800'을 기호에 맞게 수정해서 이동 속도를 변경할 수 있다. 숫자가 클수록 천천히 이동한다.

 

<!-- 탑버튼 시작 -->

// 버튼을 화면에 생성
<div id="btn_top" title="위로"><img src='./images/btn_top.png' alt='top' /></div>

// 버튼 클릭 시 효과 설정
<script>
  $("#btn_top").click(function() {  // 버튼 클릭 시
		$('html,body').animate( {  // 애니메이션 적용
			scrollTop : 0  // 스크롤탑이 '0'으로 올라갈 때
		}, 800);  // 800에 걸쳐서 이동
		return false;
	});
</script>

<!-- 탑버튼 끝 -->


</body>

13-탑-버튼-부드럽게-이동

 

 

 

 

 

3-2] 작업 결과

① 버튼 클릭 시 화면 최상단으로 부드럽게 이동

 

14-탑-버튼-부드럽게-이동-완료

 

 

 

3번까지는 '탑 버튼'에 대한 기본적인 내용이었고, 4번부터는 사용자 경험 극대화를 위해 사용자 조작에 따라 반응하는 버튼을 생성해 보겠다.

 

 

 

 

 

4] 스크롤을 내리면 나타나는 탑 버튼

 

'탑 버튼'은 웹사이트 방문자가 스크롤을 일정 부분까지 내렸을 경우에만 필요로 하는 기능이기 때문에 화면 최상단에서부터 나타날 필요는 없다.

 

해서 스크롤을 일정 부분까지 내리면 나타나는 버튼을 생성해 보겠다.

 

 

 

4-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

버튼이 화면 최상단 (첫 화면)에서는 나타나지 않고 스크롤 탑이 '1000' 보다 클 때만 나타나게 하는 코드로, '1000'을 기호에 맞게 수정해서 원하는 부분에서만 버튼이 나타나게 할 수 있다.

 

<!-- 탑버튼 시작 -->

// 버튼을 화면에 생성
<div id="btn_top" title="위로"><img src='./images/btn_top.png' alt='top' /></div>

<script>
// 버튼을 hide한 상태로 문서 준비 (버튼을 최상단에 출력하지 않음)
  $(document).ready(function() {
		$("#btn_top").hide();

// 스크롤 시 효과 설정
  $(window).scroll(function() {  // 스크롤 시
		if($(this).scrollTop() > 1000) {  // 스크롤탑이 '1000'보다 클 때
			$("#btn_top").fadeIn();  // 버튼이 fadein되며 출력
			}
		else {  // 반대로 '1000'보다 작을 때
			$("#btn_top").fadeOut();  // 버튼이 fadeout되며 제거
			}
		});

// 버튼 클릭 시 효과 설정
  $("#btn_top").click(function() {  // 버튼 클릭 시
		$('html,body').animate( {  // 애니메이션 적용
			scrollTop : 0  // 스크롤탑이 '0'으로 올라갈 때
		}, 800);  // 800에 걸쳐서 이동
		return false;
	});
});
</script>
<!-- 탑버튼 끝 -->


</body>

15-탑-버튼-스크롤-내리면-노출

 

 

 

 

 

4-2] 작업 결과

① 화면 최상단 (첫 화면)에서는 버튼 제거

② 스크롤을 일정 부분까지 내리면 버튼 출력

③ 스크롤을 일정 부분까지 올리면 버튼 제거

 

16-탑-버튼-스크롤-내리면-노출

 

 

 

 

 

5] 스크롤을 멈추면 나타나는 탑 버튼

 

'탑 버튼'은 웹사이트 방문자가 스크롤을 내리면서 글을 읽고 있는 중에는 필요로 하지 않기 때문에 항상 나타나 있을 필요는 없다.

 

해서 다음은 스크롤을 움직이면 사라지고 멈추면 나타나는 버튼을 생성해 보겠다.

 

 

 

5-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

스크롤 탑이 '1000' 보다 클 때 버튼을 숨기는 코드로, fadein 코드와 동시 적용되기 때문에 스크롤이 '1000' 보다 큰 위치에서는 스크롤을 움직이면 버튼이 사라지고 멈추면 버튼이 나타난다.

 

<!-- 탑버튼 시작 -->

// 버튼을 화면에 생성
<div id="btn_top" title="위로"><img src='./images/btn_top.png' alt='top' /></div>

<script>
// 버튼을 hide한 상태로 문서 준비 (버튼을 최상단에 출력하지 않음)
  $(document).ready(function() {
		$("#btn_top").hide();

// 스크롤 시 효과 설정
  $(window).scroll(function() {  // 스크롤 시
		if($(this).scrollTop() > 1000) {  // 스크롤탑이 '1000'보다 클 때
			$("#btn_top").fadeIn();  // 버튼이 fadein되며 출력
			}
		else {  // 반대로 '1000'보다 작을 때
			$("#btn_top").fadeOut();  // 버튼이 fadeout되며 제거
			}
        if($(this).scrollTop() > 1000) { // 스크롤탑이 '1000'보다 클 때
			$("#btn_top").hide();  // 버튼 숨기기
			}
		});

// 버튼 클릭 시 효과 설정
  $("#btn_top").click(function() {  // 버튼 클릭 시
		$('html,body').animate( {  // 애니메이션 적용
			scrollTop : 0  // 스크롤탑이 '0'으로 올라갈 때
		}, 800);  // 800에 걸쳐서 이동
		return false;
	});
});
</script>
<!-- 탑버튼 끝 -->


</body>

17-탑-버튼-스크롤-움직이면-제거-html

 

 

 

 

 

5-2] 작업 결과

① 스크롤이 움직일 때는 버튼 제거

② 스크롤이 멈췄을 때만 버튼 출력

 

18-탑-버튼-스크롤-움직이면-제거-적용-완료

 

 

 

 

 

6] 스크롤을 올릴 때만 나타나는 탑 버튼

 

웹사이트 방문자에게 '탑 버튼'이 가장 필요한 순간은 스크롤을 위로 올릴 때다.

 

해서 다음은 스크롤을 올릴 때만 나타나는 버튼을 생성해 보겠다.

 

 

 

6-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

스크롤의 위치와 관계없이 스크롤을 올리는지 내리는지 항상 감지할 수 있도록 '스크롤 이벤트' 코드를 삽입했다. (코드 내에 있는 코멘트는 정확한 내용이 아니니 참고만 바란다.)

 

<!-- 탑버튼 시작 -->
// 화면에 버튼 생성
<div id="btn_top" title="위로"><img src='./images/btn_top.png' alt='top' /></div>

<script>
	// 버튼을 hide한 상태로 문서 준비 (화면 최상단에 버튼 출력하지 않음)
	$(document).ready(function() {
		$("#btn_top").hide();

// 버튼 클릭 시 효과 설정
  $("#btn_top").click(function() {  // 버튼 클릭 시
		$('html,body').animate( {  // 애니메이션 효과 적용
			scrollTop : 0  // 스크롤탑이 '0'으로 올라갈 때
		}, 800);  // 800에 걸쳐서 이동
		return false;
	});

        
var didScroll;
		// 스크롤 시 효과 설정
		$(window).scroll(function(event) {  // 스크롤 시 스크롤 이벤트 감지
			didScroll = true;  // didScroll의 변수값을 true로 설정
			});
		
		// hasScrolled() 실행
		setInterval(function() {
			if(didScroll) {
				hasScrolled();
				didScroll = false;  // 다시 didScroll의 변수값을 false로 설정
				}
			}, 250);  // 0.25초마다 didScroll 상태 재설정


var lastScrollTop = 0;  // 현재 스크롤 위치를 항상 '0'으로 설정
var delta = 1;  // 현재 스크롤 위치에서 상하 관계 없이 '1' 이상 스크롤링 후부터 동작 실행
		function hasScrolled() {
		var st = $(window).scrollTop();  // 입력하기 쉽게 코드명 지정
		if(Math.abs(lastScrollTop - st) <= delta)  // delta값보다 더 스크롤되었는지 확인
			return; 
		if (st > lastScrollTop) {  // 스크롤 방향 확인 - st가 lastScrollTop('0')보다 커졌다면, 즉 스크롤을 내렸다면
			$("#btn_top").fadeOut();  // 버튼을 fadeout
		} else {
			if(st + $(window).height() < $(document).height()) {  // 스크롤 방향 확인 - st가 lastScrollTop('0')보다 작아졌다면, 즉 스크롤을 올렸다면
				$("#btn_top").fadeIn();  // 버튼을 fadein
			}
		}
		lastScrollTop = st;  // 실시간 반응을 위해 재설정
	}


});
</script>
<!-- 탑버튼 끝 -->


</body>

 

 

 

 

 

6-2] 작업 결과

① 스크롤을 내릴 때는 버튼 제거

② 스크롤을 올릴 때만 버튼 출력

 

19-탑-버튼-스크롤-올릴때만-노출

 

 

 

 

 

7] 스크롤을 내릴 때만 나타나는 다운 버튼

 

마지막으로 기존 생성한 '탑 버튼'과 부드럽게 교차되며, 스크롤을 내리면 나타나고 올리면 사라지는 '다운 버튼'을 생성해 보겠다.

 

 

 

7-1] HTML 작업

아래 코드를 HTML의 </body> 위에 삽입한다.

 

<!-- 탑버튼 끝 -->


<!-- 다운버튼 시작 -->
// 화면에 버튼 생성
<div id="btn_bottom" title="아래로"><img src='./images/btn_bottom.png' alt='bottom' /></div>

<script>
	// 버튼을 hide한 상태로 문서 준비 (화면 최상단에 버튼 출력하지 않음)
	$(document).ready(function() {
		$("#btn_bottom").hide();

// 버튼 클릭 시 효과 설정
  $("#btn_bottom").click(function() {  // 버튼 클릭 시
		$('html,body').animate( {  // 애니메이션 효과 적용
			scrollTop : $(document).height() - 1800 // 문서 하단에서 '-1800'으로 이동 // 또는 $("#footer").offset().top
		}, 800);  // 800에 걸쳐서 이동
		return false;
	});

        
var didScroll;
		// 스크롤 시 효과 설정
		$(window).scroll(function(event) {  // 스크롤 시 스크롤 이벤트 감지
			didScroll = true;  // didScroll의 변수값을 true로 설정
			});
		
		// hasScrolled() 실행
		setInterval(function() {
			if(didScroll) {
				hasScrolled();
				didScroll = false;  // 다시 didScroll의 변수값을 false로 설정
				}
			}, 250);  // 0.25초마다 didScroll 상태 재설정


var lastScrollTop = 0;  // 현재 스크롤 위치를 항상 '0'으로 설정
var delta = 1;  // 현재 스크롤 위치에서 상하 관계 없이 '1' 이상 스크롤링 후부터 동작 실행
		function hasScrolled() {
		var st = $(window).scrollTop();  // 입력하기 쉽게 코드명 지정
		if(Math.abs(lastScrollTop - st) <= delta)  // delta값보다 더 스크롤되었는지 확인
			return; 
		if (st > lastScrollTop) {  // 스크롤 방향 확인 - st가 lastScrollTop('0')보다 커졌다면, 즉 스크롤을 내렸다면
			$("#btn_bottom").fadeIn();  // 버튼을 fadein
		} else {
			if(st + $(window).height() < $(document).height()) {  // 스크롤 방향 확인 - st가 lastScrollTop('0')보다 작아졌다면, 즉 스크롤을 올렸다면
				$("#btn_bottom").fadeOut();  // 버튼을 fadeout
			}
		}
		lastScrollTop = st;  // 실시간 반응을 위해 재설정
	}


});
</script>
<!-- 다운버튼 끝 -->

 

 

 

'탑 버튼'과 '다운 버튼'의 코드 차이

구분 탑 버튼 다운 버튼
id btn_top btn_bottom
title 위로 아래로
img src btn_top.png btn_bottom.png
alt top bottom
$(" ") $("#btn_top") $("#btn_bottom")
scrollTop : 0 $(document).height() - 1800
스크롤 내릴 때 fadeout fadein
스크롤 올릴 때 fadein fadeout

 

 

 

 

 

7-2] CSS 작업

아래 코드를 CSS에 삽입한다.

'탑 버튼'과 교차될 수 있도록 같은 위치에 삽입한다.

 

/* 다운버튼 스타일 */
#btn_bottom {
position: fixed;
right: 10px;
bottom: 40px;
z-index: 999;
opacity: 0.5;
border-radius: 50%;
box-shadow: 0 0 10px rgba(0, 0, 0, .4);
}
#btn_bottom:hover{
background-color: black;
transition: 0.3s;
transform: scale(1.1);
}

20-다운-버튼-적용-css

 

 

 

 

 

7-3] 작업 결과

① 스크롤을 내릴 때는 '탑 버튼' 제거 및 '다운 버튼' 출력

② 스크롤을 올릴 때는 '탑 버튼' 출력 및 '다운 버튼' 제거

 

21-다운-버튼-적용-완료

 

 

 

 

 

 

728x90
반응형