컴퓨터/JavaScript

JavaScript (2) - 상단 이동 스크롤 버튼 구현

달서비 2021. 1. 29. 13:49

많은 웹사이트들에서 글이 길어질 것을 대비하여 상단바 기능을 구현합니다. 이번 시간에는 간단하게 상단바 이동 기능을 알아보려고 합니다.

+ 두가지 강의를 준비하려고 합니다. 먼저는 순수하게 상단 이동 스크롤 버튼을 구현하는 것과 두 번째는 요즘 사이트들이 만드는 것처럼 몇몇 사진으로 자연스럽게 animate 되는 것을 실습을 통하여 만들어보려고 합니다.

 

주의사항 : 스크롤 이동 기능을 구현하려고 할때 자바스크립트보다 CSS의 영향이 더 크다고 생각합니다. 그래서 적절한 CSS숙지가 필요할 것 같습니다. (실제로 쓰는 자바스크립트 소스가 얼마 안 됨)

 

알아야 할 것

window (인터넷 브라우저를 다루는 객체, document는 사이트 내부 조작이라면 이것은 외부라고 생각하면된다)
(ex : 즐겨찾기 탭 추가 등등)
window.scrollTo(x,y) (x,y)의 위치로 이동한다. (절대적)
window.scrollTo({top:0, left:0, behavior:smooth}) left(x축위치), top(y축위치)를 특정 행동을 하여 이동한다
(behavior는 auto, smooth가 있는데 auto는 그냥 이동하는 것, smooth는 자연스럽게 넘어가는 효과다)
window.scrollBy(x,y) (x,y)의 위치 만큼 이동한다. (상대적)

 

사용방법

0. 안 움직이는 top 버튼 제작

<!DOCTYPE html>
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <title>fixbutton</title>
    <style>
        .goupbtn{
            top: 90%;
            left: 90%;
            width: 50px;
            height: 50px;
            border-radius: 80%;
            background-color: #ffffff;
            border: red 3px solid;
            position: fixed;
            z-index: 2;
        }
    </style>
</head>
<body>
    <input class="goupbtn" type="button" value="Top"></div>
</body>
</html>

사실 소스코드만 두었을 뿐이지 매우 간단합니다. 위에서 설명한 position과 z-index만 알면 됩니다.

position는 속성들을 담는 그릇입니다. 여기서는 fixed를 사용하였는데 절대적인 위치(x, y) 값에 위치합니다.

z-index는 포토샵의 레이어와 같은 느낌이라 한 개만 할 때는 크지 않지만 여러 개 놓을 때는 사진 보이는 순서가 중요한 것처럼 처리해야 합니다. 그때 사용합니다. 

 

1. 상단으로 이동하는 스크롤 구현하기

window.scrollTo(x,y)를 이용하여 상단 이동 스크롤을 구현해보았습니다. 0번의 예제에 버튼에다가 onclick을 이용하여 단한줄의 스크립트를 추가해보았습니다. (0,0)은 웹페이지에서 가장 위 가장 왼쪽을 상징합니다.

<!DOCTYPE html>
<!--border는 예제를 위해 넣은 거고 실제로 볼 것은 goupbtn 이거만 보시면됩니다.-->
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <title>Topbtn1</title>
    <style>
        .border1{
            border: red 2px solid;
            height: 800px;
            background-color: tomato;
        }
        .border2{
            border: blue 3px solid;
            height: 800px;
            background-color: violet;
        }
        .goupbtn{
            top: 90%;
            left: 90%;
            width: 50px;
            height: 50px;
            border-radius: 80%;
            background-color: #ffffff;
            border: red 3px solid;
            position: fixed;
            z-index: 2;
        }
    </style>
</head>
<body>
    <div class="border1"></div>
    <div class="border2"></div>
    <input class="goupbtn" type="button" value="Top" onclick="clickme()"></div>

    <script>
        function clickme(){
            window.scrollTo(0,0);
        }
    </script>
</body>
</html>

See the Pen Top button ex1 by kmsbio (@kmsbio) on CodePen.

 

 

 

2. 애니메이션 효과로 올라가는 스크롤 구현하기

우선 필자가 사용한 방법의 사용범위다. (https://caniuse.com/)

위의 사용 가능 범주를 크게 보면 사파리에서는 애니메이션 기능이 작동하지 못합니다. 참고하시면 될 것 같습니다.

1번의 예제에서 단 한 줄만 바꾸면 됩니다.

window.scrollTo({top:0, left:0, behavior:smooth})

여기서 behavior:smooth는 자연스러운 애니메이션 효과를 만들어 줍니다.

See the Pen Top button ex2 by kmsbio (@kmsbio) on CodePen.

 

 

 

+ (추가) 순수하게 html로만 위치 이동하는 방법

<a> 태그의 위치를 이용해서 위치 이동을 할 수 있는 방법이 있습니다.

우선 태그를 이용하는 것이라 코드가 꼬이면 어려워 비추천하는 방법이지만 이것도 있다 정도로 알면 될 것 같습니다.

<a href="#id">

id값을 이용하여 해당 위치를 찾는 방법입니다.

<!DOCTYPE html>
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Topbtn3</title>
    <style>
        .border1{
            border: red 2px solid;
            height: 800px;
            background-color: tomato;
        }
        .border2{
            border: blue 3px solid;
            height: 800px;
            background-color: violet;
        }
        .goupbtn{
            top: 90%;
            left: 90%;
            width: 50px;
            height: 50px;
            border-radius: 80%;
            background-color: #ffffff;
            border: red 3px solid;
            position: fixed;
            z-index: 2;
        }
    </style>
</head>
<body>
	<!--#top의 위치를 찾고 이동하는 방식-->
    <div id=top>
        <div class="border1"></div>
        <div class="border2"></div>
    </div>
    <a href="#top"><input class="goupbtn" type="button" value="Top"></div></a>
</body>
</html>