스와이프를 구현하는 플러그인에는 여러가지가 있는데 내비게이터의 인터랙션과 컨텐츠의 인터랙션의 연동이 내 생각만큼 제대로 구현되는 플러그인이 없어서 2가지의 플러그인을 섞어야했다.
Swiper는 간단하면서도 효과적이다.
Swipegory는 살짝 복잡하지만서도 그만큼의 부드러운 인터랙션이 있다. 나름대로 코딩을 올려보지만 정리는 잘 되지 않는다...
#1 . 자바스크립트
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | var mySwiper = new Swiper('.content',{ autoHeight:true, onSlideChangeStart:function(){ var cur_slide_i = $('.content .swiper-slide-active').index(); swipegoryUpdate(cur_slide_i); function swipegoryUpdate(goTo) { var listItems = $('nav li'); var panes = $('.panes'); var prev = goTo - 1; var next = goTo + 1; if(goTo >= 0 && goTo < listItems.length) { listItems.removeClass('prev').removeClass('cur').removeClass('next').removeClass('before').removeClass('after'); $('li', panes).removeClass('prev').removeClass('cur').removeClass('next').removeClass('before').removeClass('after'); listItems.each(function(i) { var li = $(this); var pane = $('li:eq('+i+')', panes); li.attr('style', ''); if(i == prev) { li.addClass('prev'); li.css('margin-left', '0'); pane.addClass('prev'); } else if(i == next) { li.addClass('next'); li.css('margin-left', '-' + li.outerWidth() + 'px'); pane.addClass('next'); } else if(i < goTo) { li.addClass('before'); li.css('margin-left', '-' + li.outerWidth() + 'px'); pane.addClass('before'); } else if(i == goTo) { li.addClass('cur'); var marginLeft = li.outerWidth() / 2; li.css('margin-left', '-' + marginLeft + 'px'); pane.addClass('cur'); } else if(i > goTo) { li.addClass('after'); li.css('margin-left', '0'); pane.addClass('after'); } }); } } } }); $(document).ready(function(){ // update on click $('nav ul li a').on('click', function(e){ e.preventDefault(); var goTo = $(this).parent().index(); swipegoryUpdate(goTo); mySwiper.slideTo(goTo); }); // update on load $(window).load(function() { swipegoryUpdate(0); }); function swipegoryUpdate(goTo) { var listItems = $('nav li'); var panes = $('.panes'); var prev = goTo - 1; var next = goTo + 1; if(goTo >= 0 && goTo < listItems.length) { listItems.removeClass('prev').removeClass('cur').removeClass('next').removeClass('before').removeClass('after'); $('li', panes).removeClass('prev').removeClass('cur').removeClass('next').removeClass('before').removeClass('after'); listItems.each(function(i) { var li = $(this); var pane = $('li:eq('+i+')', panes); li.attr('style', ''); if(i == prev) { li.addClass('prev'); li.css('margin-left', '0'); pane.addClass('prev'); } else if(i == next) { li.addClass('next'); li.css('margin-left', '-' + li.outerWidth() + 'px'); pane.addClass('next'); } else if(i < goTo) { li.addClass('before'); li.css('margin-left', '-' + li.outerWidth() + 'px'); pane.addClass('before'); } else if(i == goTo) { li.addClass('cur'); var marginLeft = li.outerWidth() / 2; li.css('margin-left', '-' + marginLeft + 'px'); pane.addClass('cur'); } else if(i > goTo) { li.addClass('after'); li.css('margin-left', '0'); pane.addClass('after'); } }); } } | cs |
#2. HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <nav> <ul> <li><a href="#item1">소개</a></li> <li><a href="#item2">시설</a></li> <li><a href="#item3">식단</a></li> <li><a href="#item4">서비스금액</a></li> <li><a href="#item5">프로그램</a></li> <li><a href="#item6">환불규정</a></li> <li><a href="#item7">가이드</a></li> <li><a href="#item8">스케쥴</a></li> </ul> <nav> <section class="swiper-container content"> <div class="swiper-wrapper"> <div class="swiper-slide"></div> <div class="swiper-slide"></div> <div class="swiper-slide"></div> </div> </section> | cs |
#3. CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | nav{width:100%;height:50px;background-color: white;border-bottom:1px solid #ebd7ad;} nav.swiper-container ul li.swiper-slide{ text-align: center; display: -webkit-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; align-items: center; } #businessIntro { position: relative; width: 100%; background: #ebd7ad; overflow: hidden; transition: 1s height; transform: translate3d(0, 0, 0); } #businessIntro nav ul { position: absolute; top: 50px; left: 0; width: 100%; height: 50px; background: #fff; border-bottom:1px solid #ebd7ad; } #businessIntro nav li { position: absolute; top: 0; left: 100%; display: block; transition: 0.5s all; transform: translate3d(0, 0, 0); line-height: 50px; height: 50px; font-size: 12px; width:80px; text-align:center; } #businessIntro nav li.prev { left: 0; } #businessIntro nav li.cur { left: 50%; } #businessIntro nav li.cur a { color: #38291f; } #businessIntro nav li.cur a:after { opacity: 1; transform: translate3d(0, 0, 0); } #businessIntro nav li.next { left: 100%; } #businessIntro nav li.before { left: 0; } #businessIntro nav li.after { left: 100%; } #businessIntro nav li a { position: relative; color: #999; text-decoration: none; height: 50px; line-height: 50px; display: block; overflow: hidden; transition: 0.5s color; } #businessIntro nav li a:after { content: ' '; position: absolute; bottom: 0; left: 0; background: #38291f; width: 100%; height: 4px; opacity: 0; transition: 0.5s all; transform: translate3d(0, 3px, 0); } | cs |
'퍼블리싱 > TIP' 카테고리의 다른 글
0부터 목표치 까지 수치 카운트하는 애니메이션 (0) | 2016.04.05 |
---|---|
스크롤 이벤트 (0) | 2016.03.30 |
swipe (0) | 2016.03.02 |
outerWidth() , outerHeight() (0) | 2016.02.26 |
a 태그 클릭이벤트 막기 (0) | 2016.02.26 |