좌우형 슬라이드 갤러리 - 바닐라 스크립트 > 그누보드5 팁자료실

그누보드5 팁자료실

좌우형 슬라이드 갤러리 - 바닐라 스크립트 정보

좌우형 슬라이드 갤러리 - 바닐라 스크립트

본문

이미지는 몇장이라도 상관없지만 가로 세로 길이가 똑 같은 이미지여야 합니다.

image_1 부터 원하는 갯수만큼 숫자를 붙여 나가면서 이미지 주소를 대입하면 자동으로 만들어집니다.

제이쿼리나 다른 라이브러리를 이용한 슬라이드 갤러리는 많지만 순정 바닐라 스크립트로 코드를 짜 논 걸 본적이 없어서 한번 만들어 보았습니다. 

 

1. 전후진 버튼 클릭 후에는 자동넘기기시 전후진 방향 자동 감지.

2. 이미지가 제자리를 찾기 전에 버튼을 눌러도 반응이 없게 하는 "광분클릭 방지소스" 첨가

3. 가장 하단 <div style=width:960px> 의 가로는 퍼센트나 픽셀값을 바꾸면 바꾸는대로 알아서 이미지가 비율대로 리사이징 됩니다.

4. 옵션은 주석이나 스타일을 보면 금방 알 수 있습니다. 

5. 기타 문제점이 보이면 차후 수정해 나갈게요.

 


<style>
#buttonDiv { display:flex; justify-content:center; align-items:center; }
.spanButton { cursor:pointer; margin-left:5px; opacity:0.7; border-radius:50%; }
.slideNum { font-family:Times New Roman; font-size:24px; font-weight:bold; color:#ffffff; }
</style>
<script>
hwRatio = 540 / 960; // 이미지 세로 가로 사이즈 - 세로부터 입력할 것
slideSpeed = 10; // 슬라이드 속도, 숫자가 작아질수록 빨라짐
btnMargin = 20; // 하단과의 간격, 0을 주면 무슨 옵션인지 알 것임
autoSec = 4; // 자동넘기기 시간, 0을 주면 자동옵션 무력화
slideRadius = "40px"; // 갤러리 라운드 테두리 픽셀이나 퍼센트값
btnBasic = "#ffffff"; // 개별버튼 색상
btnTarget = "#000000"; // 현재버튼 색상
nextImage = "https://blog.kakaocdn.net/dn/bniCh0/btq8bsg19MB/PJUsaJdJkpJdbkHcWUC9wk/img.png"; // 전진버튼 주소
prevImage = "https://blog.kakaocdn.net/dn/I1GYB/btq8bL8uxVv/guiZYpTMedre9zj97Y1jk0/img.png"; // 후진버튼 주소
image_1 = "https://blog.kakaocdn.net/dn/csRR08/btq799CI5aa/PtkHLaFABEh5GUk7Zdp8OK/img.jpg";
image_2 = "https://blog.kakaocdn.net/dn/1i2I1/btq8bsVCBHv/WccnmtYuL4C4KjEdqSCenK/img.jpg";
image_3 = "https://blog.kakaocdn.net/dn/xBQjY/btq8aOLB6zE/kvl0wXU5HGOa5wRj943fck/img.jpg";
image_4 = "https://blog.kakaocdn.net/dn/qyzaz/btq8bMl03Lh/zqchlJvs17HYcflcKJsJF1/img.jpg";
image_5 = "https://blog.kakaocdn.net/dn/qTFDC/btq8at8K8pH/yxX7giOadkys9yhlH3ssKk/img.jpg";
image_6 = "https://blog.kakaocdn.net/dn/ba1PN1/btq79NzZi9L/xRllNJgag5mwfeKrhdw2AK/img.jpg";
image_7 = "https://blog.kakaocdn.net/dn/3J3Ch/btq79MntdX8/mg1zUkOWgplDDKIg5KXUUk/img.jpg";
image_8 = "https://blog.kakaocdn.net/dn/bnCInn/btq799JxU9n/0IdjW0Y9gG78W577ey0eBK/img.jpg";
image_9 = "https://blog.kakaocdn.net/dn/KRlrB/btq8aNzdErU/CB8kbDIfKmehHHAKEc59J0/img.jpg";
for (imageTotal = 0; this["image_" + (imageTotal + 1)]; imageTotal++);
imgNumber = autoCount = npMode = 1;
slidePosition = 0;
function slideMode(slide) {
    slidePosition = Number(galleryTable.style.marginLeft.slice(0, -1));
    slideGallery = function() {
        if (slidePosition == slide) clearInterval(slideInterval);
        else {
            if (Math.abs(slidePosition - slide) <= 0.5) slidePosition = slide;
            else slidePosition += (slide - slidePosition) / slideSpeed;
            galleryTable.style.marginLeft = slidePosition + "%";
        }
    }
    slideInterval = setInterval(slideGallery, 10);
}
function autoMode() {
    autoCount += 1;
    if (autoCount == autoSec + 1) galleryGo(npMode ? "next" : "prev"), autoCount = 1;
}
if (autoSec > 0) setInterval(autoMode, 1000);
function slideClick() {
    if (slidePosition % 100 == 0) {
        for (img = 1; img <= imageTotal; img++) {
            this["btn_" + img].style.width = this["btn_" + img].style.height = img == arguments[0] ? "20px": "15px";
            this["btn_" + img].style.backgroundColor = img == arguments[0] ? btnTarget: btnBasic;
        }
        slideMode(-100 * ((imgNumber = arguments[0]) - 1));
        autoCount = 1;
        currentNum.innerText = ("0" + imgNumber).slice(-2);
    }
}
function galleryGo() {
    if (arguments[0] == "next") slideClick(imgNumber == imageTotal ? 1 : imgNumber + 1), npMode = 1;
    else if (arguments[0] == "prev") slideClick(imgNumber == 1 ? imageTotal : imgNumber - 1), npMode = 0;
    else slideClick(arguments[0]);
}
onresize = function() {
    slideHeight = galleryDiv.offsetWidth * hwRatio;
    galleryDiv.style.height = buttonTable.style.height = slideHeight + "px";
    buttonTable.style.marginTop = -slideHeight + "px";
    buttonDiv.style.marginTop = -(btnMargin + 40 * hwRatio) + "px";
}
function slideHtml() {
    document.write("<div id=galleryDiv style=overflow:hidden;border-radius:" + slideRadius + ">");
    document.write("<table id=galleryTable cellpadding=0 cellspacing=0 style=width:" + imageTotal * 100 + "%;height:100%;table-layout:fixed;margin-left:0%>");
    for (img = 1; img <= imageTotal; img++) document.write("<td style=background-image:url(" + this['image_' + img] + ");background-size:contain></td>");
    document.write("</table><table id=buttonTable style=width:100% cellpadding=20 cellspacing=0>");
    document.write("<td align=left><img style=cursor:pointer src=" + prevImage + " onclick=galleryGo('prev')></td><td align=right><img style=cursor:pointer src=" + nextImage + " onclick=galleryGo('next')></td></table>");
    document.write("<div id=buttonDiv><span id=currentNum class=slideNum style=margin-right:10px></span>");
    for (img = 1; img <= imageTotal; img++) document.write("<span id=btn_" + img + " class=spanButton style=background-color:" + btnBasic + " onclick=galleryGo(" + img + ")></span>");
    document.write("<span id=totalNum class=slideNum style=margin-left:10px></span></div></div>");
    totalNum.innerText = ("0" + imageTotal).slice(-2);
    btn_1.style.marginLeft = "0px";
    galleryGo(1);
    onresize();
}
</script>
<div style=width:100%><script>slideHtml()</script></div>

 

--------------------

 

2021년 8월 15일 오후 9시 50분에 2가지 문제점을 수정하여 다시 올렸습니다.

 

1. 1픽셀씩 삑사리나는 오류 수정

2. 모바일 가로 세로 회전시 새로고침 없는 리사이징 구현

추천
11

댓글 32개

확실한 AS
전 아무리 봐도 소스를 이해할 수 없지만 비타주리님이 계시니까...^^

기분좋은 대체휴일 아침입니다.
오늘도 행복하세요.

게시판 갤러리 최신글로도 활용할 수 있겠군요~
최신글이나 게시글의 리스트로도 가능하지요.
다만 내공이 좀 필요합니다. 개별이미지에 링크도 걸어야 하구요.
그것보다는 가로 세로 썸네일 이미지 크기가 게시물마다 다 틀려서 그걸 게시글을 작성할 때부터 염두에 두지 않으면 시각적으로는 별로입니다.
감사합니다.
모바일에서 볼때 세로로 보다가 가로로 보면 리사이징 부분에서 문제가 있네요.ㅜㅠ
새로고침이 필요합니다.
꼭 올려놓고 나면 보이네요.
요즘 정말 좋은자료 많이 올려 주셔서 대단히 감사드리며, 매우 잘 사용하고 있습니다. 이제는 조금 덜 덥네요. 건강하세요.

이런 움직임은 동일한 속도로 움직이는 등속운동이 아니라 처음에는 빨랐다가 서서히 느려지는 역가속 운동이 필요한데 이걸 구현하려면 극한값 접근이 필요해요.
이걸 다른 말로는 플래시 용어로 탄성스피드라고 합니다.

문제는 도착지 좌표 100 지점에 한없이 가까워진다 해도 그 수치는 대부분 100 이 되지 않는다는 것입니다. 99.999 등을 찍죠
탄성함수는 셋인터벌로 주는데 섬세하게 소스를 쓰려면 100지점에 이르면 셋인터벌을 중지시켜 클리어 해 주어야 컴에 부하가 덜 먹습니다.
하지만 99.999 로 수치가 나오니 눈에 보이기는 100 이지만 컴은 계속 클리어 되지 않고 탄성함수를 찍게 된다는 것이죠.

그래서 저는 반올림하여 100 이 되면 좌표가 100이 되면서 100이 되면 탄성함수를 멈추게 하는 소스를 썼는데요.

하지만 마이너스 좌표를 간과했어요.
마이너스는 -99.5 의 반올림 이 -100 이 아니라 -99 입니다.
그래서 0.5 를 걸쳐가는 부분에서 1픽셀의 삑사리가 나는 것이 보입니다. 죄표에 따라 좌우에 1픽셸 이동이 더해지거나 부족한 부분이 보이고 있네요.
결국 다음에는 100보다 0.5 작거나 또는 0.5 크거나 라는 조건문으로 바꾸어서 코드를 수정해야 할 것 같습니다.ㅜㅠ
제 갤러리 소스는 제가 보아도 특별한 효과들이 꽤 있습니다. 이건 가장 기본적인 것이지요.
문제는 모두 액션 스크립트로 만든 것이라 몽땅 자바 스크립트로 치환해야 해요.ㅜㅠ
한 10개쯤 치환하고 게시글 첨부파일이나 아니면 인덱스 페이지에 링크 걸고 이미지 안에 텍스트 효과 줘서 사용할 수 있게 한 후 컨텐츠몰에 등록해 볼까 합니다.
소스도 바닐라라서 플러그인이 다 필요없거든요.
시간이 좀 걸릴 듯요,
바닐라스크립트가 뭔지 검색해보니까 jquery와 같은 것을 사용하지 않고 순수하게 자바스크립트로만 코딩한 것이라고 나오는데, 정말로 자바스크립트로만 작성하셨네요.
어디에나 코드를 붙여넣기하고 이미지 경로만 정해주니까 잘 나오고 좋습니다.
늘 말씀드리지만 대단 하십니다.
새글에 슬라이드를 넣어보았습니다.
고맙습니다.
http://pws.co.kr/bbs/new.php

적용해 봤네요. 멋집니다.
근데, 이게 모바일에서 보니 손가락으로 넘기질 못하는거 같아요
좌우 버튼을 눌러야만 넘어가는데, 손가락으로 좌우 넘길수는 없을까요?
도와주세요,.
감사합니다.
전체 2,427 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT