å¿ èŠãªç¥èïŒäžçŽCSSãäžçŽäžçŽJavaScript
èŠä»¶ïŒ AndroidãŸãã¯iOSããã€ã¹
è²»ãããæéïŒ 2-3æé
ãœãŒã¹ãããŠã³ããŒã
ãã¢ãèŠã
LightboxãŠã£ãžã§ããã¯ãlightbox.jsã®æåã®ããŒãžã§ã³ã2005幎ã«ãªãªãŒã¹ãããŠä»¥æ¥ãWebäžã§æšæºã«ãªããŸããã Lightboxã¯ã¢ãŒãã«ãã€ã¢ãã°ããã¯ã¹ãäœæããéåžžã¯[次ãž]ãã¿ã³ãš[åãž]ãã¿ã³ã䜿çšããŠã¹ã©ã€ãéã移åãã倧ããªç»åã衚瀺ããŸãã
ã¿ããããã€ã¹ã®äœ¿çšã®ããŒã 以æ¥ãWebãµã€ãã¯ã©ã€ãããã¯ã¹ãæŽæ°ããŠãããŸããŸãªæå床ã§ã®ãžã§ã¹ãã£ãŒã®çžäºäœçšããµããŒãããŠããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ããžã§ã¹ãã£ããµããŒãããã·ã³ãã«ãªã©ã€ãããã¯ã¹ãäœæããæ¹æ³ã瀺ããŸãã ãã®éçšã§ãå®éã®ããã©ãŒãã³ã¹ãæ¹åããããã®ããã€ãã®ç°¡åãªããªãã¯ãšåæ§ã«ãã¿ããã€ã³ã¿ãŒãã§ã€ã¹ã®ç¥èŠãããããã©ãŒãã³ã¹ã®æ¹åã«ã€ããŠå°ãåŠã³ãŸãã
ã¿ããããã€ã¹çšã®ã³ãŒãã®èšè¿°ã¯ããã¹ã¯ãããçšã®ã³ãŒãã®èšè¿°ãšã¯å€§ããç°ãªããŸãã ã§ããã ãå€ãã®ã³ãŒãããã¹ã¯ããããšçµã¿åãããããšãã§ããŸãïŒãŸãããããã¹ãã§ãïŒãããããã®éã«ã¯åžžã«å€§ããªéãããããŸãã
æ¯èŒãã¹ãã§ã¯ãæãäžè¬çãªã¿ããããã€ã¹ã®ããã©ãŒãã³ã¹ã1998幎é ã®ãã¹ã¯ãããã³ã³ãã¥ãŒã¿ãŒã«å¹æµããããšã瀺ãããŠããŸãã éåžžãå ã®iMacãšåçã®çŽ256 MBã®RAMãCPUããã©ãŒãã³ã¹ãåããŠããŸãã ãã¹ã¯ãããã§ããã åäœãããããã«äœ¿çšããæ¹æ³ã¯ãæºåž¯é»è©±ãã¿ãã¬ããã§ã¯æ£ããåäœããŸããã 幞ããªããšã«ããããã®ããã€ã¹ã¯éåžžãã°ã©ãã£ãã¯ã¹ãç¹ã«ç»é¢äžã®ã¢ã€ãã ã®ç§»åçšã«æé©åãããŠããŸãã IOSããã³Android 3.0+ããã€ã¹ã«ã¯ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã°ã©ãã£ãã¯ã¹ããããŸãã
å®éããããã®ããã€ã¹ã¯ããŸãšããªã°ã©ãã£ãã¯ã¹ã«ãŒããåããå®ã£ãœãã³ã³ãã¥ãŒã¿ãŒã§ãããšæ³åã§ããŸãã
ç§ãã¡ã¯éå»20幎éãåãæ¹æ³ã§ã³ã³ãã¥ãŒã¿ãŒãšå¯Ÿè©±ããŠããŸããã ããŠã¹ãã€ã³ã¿ãŒã移åããã³ã³ãããŒã«ãã¿ã³ãã¯ãªãã¯ããŸãã ãã¿ã³ãéãããããã¯ããªã³ã¯ãããã³ã¹ã¯ããŒã«ããŒã¯ããŠãŒã¶ãŒããã³éçºè ã«ãšã£ãŠç¬¬2ã®æ§è³ªã§ãã ã¿ããã€ã³ã¿ãŒãã§ã€ã¹ã¯ããŸã£ããç°ãªãäžé£ã®èŠåãè¡šããŠããŸãã æãäžè¬çãªã®ã¯ãã¹ã¯ã€ããã§ãã ãã¹ã©ã€ãããããšãããã€ãã®èŠçŽ ãäžåã«äžŠãã§ãããã®ããã«è¡šç€ºããããŠãŒã¶ãŒã¯ãã¹ã©ã€ãããžã§ã¹ãã£ã䜿çšããŠèŠçŽ éã移åã§ããŸãã
ã¹ã©ã€ãã¯éåžžã«äžè¬çãªãã¿ãŒã³ã§ããããããŠãŒã¶ãŒã«ãããç¥ãããå¿ èŠãããããŸããããŠãŒã¶ãŒããªã¹ãã«äŒŒããã®ãèŠããšãæ¬èœçã«ã¹ã¯ããŒã«ããããšããŸãã
å€ãã®å Žåãç¹ã«äœéã®æ¥ç¶ãšäœéã®ããã€ã¹ãæ±ãå Žåãã³ãŒããå°ãéãå®è¡ããããšã¯ã§ããŸããã ããããç¥èŠã®æé©åã«çŠç¹ãåããããšãã€ã³ã¿ãŒãã§ã€ã¹ãããé«éã«èŠããããšãã§ããŸãã
ç¥èŠãããããã©ãŒãã³ã¹ãæé©åããç§ã®ãæ°ã«å ¥ãã®äŸã¯TiVoã§ãã 13幎åãæåã®TiVoãå°çãããšãããããã¯éåžžã«äœéã§ããïŒ16 MB RAMãš54 MHz CPUïŒïŒã ç¹ã«äœããåçãããé²é³ãããããå Žåã¯ããªã¢ã³ã³ã§äœããæŒããŠããäœããèµ·ãããŸã§ã«ãéåžžã«é·ãæéãèŠããŠããŸããã ãããã誰ãTiVoãé ããšæå¥ãèšããŸããã§ããã ç§ã®æèŠã§ã¯ãããã¯é³ã«ãããã®ã§ãã TiVoã€ã³ã¿ãŒãã§ãŒã¹ã®æã銎æã¿ã®ããéšåã¯ããã¿ã³ãæŒããåŸã«é³Žãã¡ããã£ãŒã§ãã ãã®é³ã¯ããã«åçãããŸããã TiVoã®ãšã³ãžãã¢ã¯ã次ã«äœãèµ·ããããšããã€ã³ã¿ãŒãã§ãŒã¹ãæ»ãã§ããªãããšããŠãŒã¶ãŒãç¥ã£ãŠããããã«ãã§ããã ãæ©ããµãŠã³ããããŒãããŸããã ãã®çãæ²ã¯ããŠãŒã¶ãŒã®èŠæ±ãèãããããšããŠãŒã¶ãŒã«äŒããŸããã
ãããäžã§ãç§ãã¡ã¯åãããšãè¡ãå¥çŽãäœæããŸããïŒã¹ãããŒã ã¯ãªãã¯åŸãã¹ãããŒãããã«è¡šç€ºãããããããŠãŒã¶ãŒã¯èªåãèãããšããã¡ãã»ãŒãžãåãåããŸãã æºåž¯é»è©±ã§ã¯ãå¥ã®æ¹æ³ã§è¡ãå¿ èŠããããŸãã
ãžã§ã¹ãã£ãŒã¯ãã¯ãªãã¯ãªã©ã®åå¥ã®ã¢ã¯ã·ã§ã³ã§ã¯ãããŸããã ãã ããã€ã³ã¿ãŒãã§ã€ã¹ãé«éã«èŠããããã«ããŠãŒã¶ãŒã«ãã£ãŒãããã¯ãæäŸããå¿ èŠããããŸãã 圌ãã身æ¯ãã§ç€ºãããã«ãäœããã®æ¹æ³ã§ã€ã³ã¿ãŒãã§ã€ã¹ãåããã圌ããç§ãã¡ã«ãèããŠãããããšãç¥ãããŸãã
ããŒã«
ã¬ã¹ãã³ã·ãã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãèŠçŽ ãã§ããã ãéã移åããå¿ èŠããããŸãã 移åããããšã«ãããã€ã³ã¿ãŒãã§ã€ã¹ããªã¯ãšã¹ãã«å¿çããŠããããšããŠãŒã¶ãŒã«ç€ºããŸãã ããã«ã¯JavaScriptã¢ãã¡ãŒã·ã§ã³ã®äœ¿çšãé ãããŸãã 代ããã«ãCSSå€æãšãã©ã³ãžã·ã§ã³ã䜿çšããŸããããã©ãŒãã³ã¹ã®ããã®ãã©ã³ã¹ãã©ãŒã ãšãã©ã³ãžã·ã§ã³ã䜿çšããŠãJavaScriptã®å®è¡ããããã¯ããã«ã¢ãã¡ãŒã·ã§ã³ãæ©èœããããã«ããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ããã¹ãŠã®åããšã¢ãã¡ãŒã·ã§ã³ã«å¯ŸããŠãCSSå€æãšé·ç§»ã䜿çšããŸãã
å¯èœãªéã䜿çšãããå¥ã®æé©åã¯ããæžã蟌ã¿å°çšDOMããšåŒã°ãããã®ã§ãã DOMããã®ããããã£ãšå€ã®èªã¿åãã¯è€éã§ãéåžžã¯äžèŠã§ãã ã©ã€ãããã¯ã¹ã®å Žåãåæåãã§ãŒãºã§ãã¹ãŠã®æž¬å®å€ãçµã¿åãããŠã¿ãŸãã ãã®åŸãJavaScriptã§ç¶æ ãç¶æããå¿ èŠã«å¿ããŠåçŽãªç®è¡æŒç®ãè¡ããŸãã
ã©ã€ãããã¯ã¹ã®äœæ
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãããã€ãã®ãµã ãã€ã«ãå«ãããŒãžãäœæããŸãã ãµã ãã€ã«ãã¯ãªãã¯ïŒãŸãã¯æã§ã¿ããïŒãããšãã©ã€ãããã¯ã¹ãèµ·åããŸãã ãã®åŸãã©ã€ãããã¯ã¹ã§ããŠãŒã¶ãŒã¯æã§ç»åãã¹ã¯ããŒã«ããç»åã«ã¿ããããŠã©ã€ãããã¯ã¹ãçµäºã§ããŸãã
ãžã§ã¹ãã£ã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæãããšãã¯ãç¥èŠãããããã©ãŒãã³ã¹ã®éèŠæ§ã«æ³šæããŠãã ããã ã©ã€ãããã¯ã¹ã§ã¯ãããã¯ãç»é¢äžã§ã®æã®ã¹ã©ã€ãã«ããã¹ã©ã€ãã移åããããšãæå³ããŸãã ãŠãŒã¶ãŒããžã§ã¹ãã£ãŒãåæ¢ãããšãã¹ã©ã€ãã¯æ¬¡ã®äœçœ®ã«ç§»åããããã¹ã©ã€ãã®é·ããååã§ãªãå Žåã¯åã®äœçœ®ã«æ»ãå¿ èŠããããŸãã
ãªã¿ãŒã³ã¢ãã¡ãŒã·ã§ã³ã¯éèŠã§ãã 圌女ã®ãããã§ããŠãŒã¶ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ãæ»ãã§ãããšã¯æããªãã§ãããã
éå§ãã
次ã®ãã¡ã€ã«ãäœæããŸãã
lightbox/
reset.css
slides.css
slides.html
slides.js
æš¡æ§
HTMLã¯ã·ã³ãã«ã«ãªããŸãã ããã¯ãã¢ã®ããã ãã§ã¯ãããŸããã è€éãªDOMããªãŒã¯ãå®çŸ©ã«ããé ããªããŸãã ã¹ã¿ã€ã«ãèŠçŽ DOMæœåºãããã³èŠèŠå¹æã¯ãããè€éãªDOMããªãŒã§ã¯ãã¹ãŠé£ãããªããŸãã ç§ãã¡ã¯ãå®ã£ãœãã³ã³ãã¥ãŒã¿ãŒãã«çŠç¹ãåãããŠããã®ã§ããã¹ãŠãéèŠãªã®ã§ãæåããç©äºãã·ã³ãã«ã«ä¿ã€ããšãéèŠã§ãã
Eric Meyerã®reset.cssã䜿çšããŠCSSã®ç¡å¹åãéå§ããŠããŸãã ãŸããã¹ã±ãŒãªã³ã°ããªãããã«ãã¥ãŒããŒãã調æŽããŸãã
ãã€ãã£ãã®ããºãŒã ã®ã¯ãªãã¯ãããªãã«ããŠããžã§ã¹ãã£ãŒã«å¹²æžããªãããã«ããŸããã ã¯ãªãã¯ã«å¯Ÿããæ£ããå¿çãJavaScriptã«å®è£ ãããŸãã ããºãŒã ããã«ã¯ã¯ãªãã¯ãã¯å¥ã®ã¬ãã¹ã³ã«å€ãããããããã§ã¯çç¥ããŸãã
JSåŽã§ã¯ãjQueryæ§æãåããéåžžã«è»œéãªãã©ãããã©ãŒã ã§ããzepto.jsã䜿çšããŸãã å®éããã©ãããã©ãŒã ã¯å¿ èŠãããŸãããããã®ãã©ãããã©ãŒã ã¯äžéšã®ã¿ã¹ã¯ã®äœæ¥ãå°ãã¹ããŒãã¢ããããŸãã å®éã®ãžã§ã¹ãã£ã€ã³ã¿ã©ã¯ã·ã§ã³ã§ã¯ãçµã¿èŸŒã¿APIã䜿çšããŸãã
<div class="main"> <div class="welcome"> <h1>Welcome to an amazing carousel!</h1> <p>This is an example of a nice touch interface</p> </div> <div class="carousel"> <ul> <li> <a href="http://www.flickr.com/photos/protohiro/6664939239/in/photostream/"> <img data-full-height="427" data-full-width="640" src="http://farm8.staticflickr.com/7142/6664939239_7a6c846ec9_s.jpg"> </a> </li> <li> <a href="http://www.flickr.com/photos/protohiro/6664957519/in/photostream"> <img data-full-height="424" data-full-width="640" src="http://farm8.staticflickr.com/7001/6664957519_582f716e38_s.jpg"> </a> </li> <li> <a href="http://www.flickr.com/photos/protohiro/6664955215/in/photostream"> <img data-full-height="640" data-full-width="427" src="http://farm8.staticflickr.com/7019/6664955215_d49f2a0b18_s.jpg"> </a> </li> <li> <a href="http://www.flickr.com/photos/protohiro/6664952047/in/photostream"> <img data-full-height="426" data-full-width="640" src="http://farm8.staticflickr.com/7017/6664952047_6955870ecb_s.jpg"> </a> </li> <li> <a href="http://www.flickr.com/photos/protohiro/6664948305/in/photostream"> <img data-full-height="428" data-full-width="640" src="http://farm8.staticflickr.com/7149/6664948305_fb5a6276e5_s.jpg"> </a> </li> </ul> </div> </div> </body> <script src="zepto.min.js" type="text/javascript" charset="utf-8"></script> <script src="slides.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript" charset="utf-8"> //this code initializes the lightbox and shows it when the user //clicks on a slide $(document).ready(function(){ var lightbox = new saw.Lightbox('.carousel'); $(document).on('click', 'a', function(e){ e.preventDefault(); lightbox.show(this.href); }); }); </script> </html>
ãµã ãã€ã«ã®ã¹ã¿ã€ãªã³ã°
次ã«ãçŽ æµãªå°ããªãµã ãã€ã«ãšãã®ä»ã®èŠèŠå¹æãè¿œå ããŸãã
html { background: #f1eee4; font-family: georgia; color: #7d7f94; } h1 { color: #ba4a00; } .welcome { text-align: center; text-shadow: 1px 1px 1px #fff; } .welcome h1 { font-size: 20px; font-weight: bold; } .welcome { -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ -moz-box-sizing: border-box; /* Firefox, other Gecko */ box-sizing: border-box; /* Opera/IE 8+ */ margin:5px; padding:10px; box-shadow: 2px 2px 5px rgba(0,0,0,0.5); border-radius: 5px; } .carousel { margin:5px; } .carousel ul li { height: 70px; width: 70px; margin: 5px; overflow: hidden; display: block; float: left; border-radius: 5px; box-shadow: 1px 1px 2px rgba(0,0,0,0.5), -1px -1px 2px rgba(255,255,255,1); }
ã¡ã€ã³ã©ã€ãããã¯ã¹
ã©ã€ãããã¯ã¹çšã®JavaScriptã¯ãããã€ãã®ç°ãªãåŠçãè¡ãå¿ èŠããããŸãã
- ã©ã€ãããã¯ã¹ããŒã¿ãåéããŠåæåãã
- ã©ã€ãããã¯ã¹ã®è¡šç€ºãšé衚瀺
- ã©ã€ãããã¯ã¹ã©ãããŒçšã®HTMLãäœæãã
- ã¹ã©ã€ããäœæãã
- ãžã§ã¹ãã£ãŒã®ã€ãã³ããåŠçãã
ãµãŒãã¹æ©èœ
ã-webkit-transformããšãtranslate3dããäœåºŠãæžã代ããã«ãããã€ãã®ãŠãŒãã£ãªãã£é¢æ°ãäœæããŠãããããç§ã®ããã«ä»äºãããããã«ããŸãã
function prefixify(str) { var ua = window.navigator.userAgent; if(ua.indexOf('WebKit') !== -1) { return '-webkit-' + str; } if(ua.indexOf('Opera') !== -1) { return '-o-' + str; } if(ua.indexOf('Gecko') !== -1) { return '-moz-' + str; } return str; } function setPosition(node, left) { // node.css('left', left +'px'); node.css(prefixify('transform'), "translate3d("+left+"px, 0, 0)"); } function addTransitions(node){ node.css(prefixify('transition'), prefixify('transform') + ' .25s ease-in-out'); node[0].addEventListener('webkitTransitionEnd', function(e){ window.setTimeout(function(){ $(e.target).css('-webkit-transition', 'none'); }, 0) }) } function cleanTransitions(node){ node.css(prefixify('transition'), 'none'); }
ã©ã€ãããã¯ã¹ãŠã£ãžã§ããã¯ãããŒãžãèªã¿èŸŒãŸãããšåæåãããé床ãåäžããŸãã åæåã§ã¯ãããŒãžäžã®ãã¹ãŠã®ãµã ãã€ã«ãæ€çŽ¢ããããŒã¿ã¢ãã«ãäœæããŸãã HTMLã®äœæãšã€ãã³ããã³ãã©ãŒã®ã¢ã¿ããã®ããã«ã©ã€ãããã¯ã¹ãæäŸãããã®ãåŸ ã¡ãŸãã
åæå
ã©ã€ãããã¯ã¹ã®å Žåããããã¯ã»ã¬ã¯ã¿ãŒãå¯äžã®ãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸãã
//clean namespacing window.saw = (function($){ //the lightbox constructor function Lightbox (selector) { var container_node = $(selector), wrapper, chromeBuilt, currentSlide = 0, slideData =[], boundingBox = [0,0], slideMap = {}; function init(){ //init function } return { show: show, hide: hide }; } return { Lightbox:Lightbox }; }($));
inité¢æ°ã¯ããã¹ãŠã®liã¿ã°ããã£ããã£ãããµã ãã€ã«ãèŠã€ããŠãslideDataé åã«æ å ±ãæžã蟌ã¿ãŸãã åæã«ããslideDataãé åã«ãhrefããµã ãã€ã«ã衚瀺ãããslideMapããªããžã§ã¯ããäœæããŸãã ããã«ãããé åå ã®ãã¹ãŠã®ããŒã¿ã埪ç°ããããè¿œå æ å ±ã§DOMãè£ é£Ÿãããããããšãªããã¯ãªãã¯ã§ããŒã¿ããã°ããæ€çŽ¢ã§ããŸãã
function init(){ var slides = container_node.find('li'); slides.each(function(i, el){ var thisSlide = {}, thisImg = $(el).find('img'); thisSlide.url = thisImg.attr('src'); thisSlide.height = thisImg.attr('data-full-height'); thisSlide.width = thisImg.attr('data-full-width'); thisSlide.link = $(el).find('a').attr('href'); //push the slide info into the slideData array while recording the array index in the slideMap object. slideMap[thisSlide.link] = slideData.push(thisSlide) - 1; }); }
åæåã®æ®ãã¯ãshowãã¡ãœããã§è¡ãããŸãã
//this is the function called from the inline script function show(startSlide){ if(!chromeBuilt){ buildChrome(); attachEvents(); } wrapper.show(); //keep track of the viewport size boundingBox = [ window.innerWidth, window.innerHeight ]; goTo(slideMap[startSlide]); }
ã·ã§ã«äœæ
buildChromeé¢æ°ã¯ãã©ã€ãããã¯ã¹ã®HTMLã©ãããŒãäœæãããŠãŒã¶ãŒãã©ã€ãããã¯ã¹ãé衚瀺ãŸãã¯è¡šç€ºãããã³ã«ã©ãããŒãåæ§ç¯ãããªãããã«ã»ããã©ãèšå®ããŸãã 䜿ããããããããã«ãHTMLèªäœã«å¥ã®ãã³ãã¬ãŒãé¢æ°ãäœæããŸããã
var wrapperTemplate = function(){ return '<div class="slidewrap">'+ '<div class="controls"><a class="prev" href="#">prev</a> | <a class="next" href="#">next</a></div>'+ '</div>'; } function buildChrome(){ wrapper = $(wrapperTemplate()).addClass('slidewrap'); $('body').append(wrapper); chromeBuilt = true; }
ã·ã§ã«ãäœæããæåŸã®æé ã¯ã次ãªã³ã¯ãšåãªã³ã¯ã®ã€ãã³ããã³ãã©ãŒãè¿œå ããããšã§ãã
function handleClicks(e){ e.preventDefault(); var targ = $(e.target); if(targ.hasClass('next')) { goTo(currentSlide + 1); } else if(targ.hasClass('prev')){ goTo(currentSlide - 1); } else { hide(); } } function attachEvents(){ wrapper.on('click', handleClicks, false); }
ããã§ãã©ã€ãããã¯ã¹ã·ã§ã«ã¯è€æ°ã®ã¹ã©ã€ãã䜿çšããæºåãã§ããŸããã ã·ã§ãŒæ©èœã§ã¯ãgoToïŒïŒãåŒã³åºããŠæåã®ã¹ã©ã€ããããŒãããŸãã ãã®é¢æ°ã¯ããã©ã¡ãŒã¿ãŒã§èå¥ãããã¹ã©ã€ãã衚瀺ããŸãããå¿ èŠã«å¿ããŠãã£ãããšã¹ã©ã€ããäœæããŸãã ïŒéèŠïŒãgotoãã¯JavaScriptã®äºçŽèªã§ãããããå°æåã§ãgoToãé¢æ°ãæå®ããªãã§ãã ããïŒã
ã¹ã©ã€ãäœæ
ããã§ãç§ãèŠãŠããã¹ã©ã€ãã¯è¡šç€ºé åã«ãããåã®ã¹ã©ã€ããšæ¬¡ã®ã¹ã©ã€ãã¯ãããããç»é¢ã®è¡šç€ºé åã®å·Šå³ã«ãããŸãã ãŠãŒã¶ãŒã[次ãž]ãã¿ã³ãã¿ãããããšãçŸåšã®ã¹ã©ã€ããå·Šã«ç§»åãã次ã®ã¹ã©ã€ãã«çœ®ãæããããŸãã
//for the slides, takes a "slide" object function slideTemplate(slide){ return '<div class="slide"><span>'+slide.id+'</span><div style="background-image:url('+slide.url.replace(/_s|_q/, '_z')+')"></div></div>'; }
代ããã«äœ¿çšããã®ã¯ãïŒå°ãªããšãä»ã®ãšããïŒã¢ãã€ã«ãã©ãŠã¶ã®ã¬ã³ããªã³ã°ãèæ¯ç»åãããã¯ããã«é ãããã§ãã ã¢ãã€ã«ããã€ã¹ã䜿çšããå Žåãéåžžã¯é床ãåªå ãããŸãã ã¢ã¯ã»ã·ããªãã£ã®åé¡ã¯ã ARIA Roleã§ç°¡åã«è§£æ±ºã§ããŸãã
ããèªäœã§ã¯ããbuildSlideãé¢æ°ã¯ããè€éã§ãã ã¹ã©ã€ããã³ãã¬ãŒããä»ããŠããŒã¿ã移åããããšã«å ããŠãã³ãŒãã¯ã¹ã©ã€ãã衚瀺é åã«åãããå¿ èŠããããŸãã äžèŽããªãå Žåã«ç»åãæ¡å€§çž®å°ããæ¹æ³ãèŠã€ããã®ã¯ç°¡åãªäœæ¥ã§ãã ãã©ãŠã¶ã«ãµã€ãºå€æŽãåŠçãããããšãã§ããŸãã
function buildSlide (slideNum) { var thisSlide, s, img, scaleFactor = 1, w, h; if(!slideData[slideNum] || slideData[slideNum].node){ return false; } var thisSlide = slideData[slideNum]; var s = $(slideTemplate(thisSlide)); var img = s.children('div'); //image is too big! scale it! if(thisSlide.width > boundingBox[0] || thisSlide.height > boundingBox[1]){ if(thisSlide.width > thisSlide.height) { scaleFactor = boundingBox[0]/thisSlide.width; } else { scaleFactor = boundingBox[1]/thisSlide.height; } w = Math.round(thisSlide.width * scaleFactor); h = Math.round(thisSlide.height * scaleFactor); img.css('height', h + 'px'); img.css('width', w + 'px'); }else{ img.css('height', thisSlide.height + 'px'); img.css('width', thisSlide.width + 'px'); } thisSlide.node = s; wrapper.append(s); //put the new slide into the start poisition setPosition(s, boundingBox[0]); return s; }
goTo
ãGoToãã¯ãèŠæ±ãããé£æ¥ããã¹ã©ã€ãããã¥ãŒããŒãã«ç§»åããŸãã
function goTo(slideNum){ var thisSlide; //if the slide we are looking for doesn't exist, lets just go //back to the current slide. This has the handy effect of providing //"snap back" feedback when gesturing, the slide will just animate //back into position if(!slideData[slideNum]){ return; } thisSlide = slideData[slideNum]; //build adjacent slides buildSlide(slideNum); buildSlide(slideNum + 1); buildSlide(slideNum - 1); //make it fancy addTransitions(thisSlide.node); //put the current slide into position setPosition(thisSlide.node, 0); //slide the adjacent slides away if(slideData[slideNum - 1] && slideData[slideNum-1].node){ addTransitions(slideData[slideNum - 1 ].node); setPosition( slideData[slideNum - 1 ].node , (0 - boundingBox[0]) ); } if(slideData[slideNum + 1] && slideData[slideNum + 1].node){ addTransitions(slideData[slideNum + 1 ].node); setPosition(slideData[slideNum + 1 ].node, boundingBox[0] ); } //update the state currentSlide = slideNum; }
çŸæç¹ã§ã¯ãã©ã€ãããã¯ã¹ã¯å€ããå°ãªããæ©èœããŠããŸãã 次ã®ã¹ã©ã€ããšåã®ã¹ã©ã€ãã«ç§»åããŠãé衚瀺ãšè¡šç€ºãåãæ¿ããããšãã§ããŸãã æåãŸãã¯æåŸã®ã¹ã©ã€ãã«ãã€å°éããããç¥ãããšãçæ³çã§ããããšãã°ãç°è²ã®ã³ã³ãããŒã«ã衚瀺ã§ããŸãã ããã¯ããã¹ã¯ããããšã¿ããããã€ã¹ã®äž¡æ¹ã«é©çšãããŸãã
ãžã§ã¹ãã£ãŒãµããŒãã®è¿œå
ã»ãšãã©ã®ã¿ããããã€ã¹ã«ã¯ãåçãã¥ãŒã¢ãçµã¿èŸŒãŸããŠããŸãã ãããã®ããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã¯ãiPhoneçšã®ãªãªãžãã«ã®ãã©ããã¥ãŒã¢ãŒã«ç¶ããŠãã€ã³ã¿ãŒãã§ã€ã¹ã«åæããŸãããæãå·Šã«ã¹ã©ã€ããããšã次ã®ã¹ã©ã€ãã衚瀺ãããŸãã ãã£ãŒãããã¯ããŸã£ããæäŸããªããã®å¯Ÿè©±ã®å®è£ ãããã€ãèŠãŸããããžã§ã¹ãã£ãŒãå®äºãããšãã¹ã©ã€ãã¯åçŽã«çœ®ãæããããŸãã é©åãªã¢ãããŒãã¯ãã©ã€ããã£ãŒãããã¯ãæäŸããããšã§ãã ãŠãŒã¶ãŒãæãã¹ã©ã€ãããããšãã¹ã©ã€ããäžç·ã«ç§»åããæ¹åã«å¿ããŠã次ãŸãã¯åã®ã¹ã©ã€ãã衚瀺ãããŸãã ããã«ããããŠãŒã¶ãŒãåçã®ã¹ããªãããåŒã£åŒµã£ãŠãããããªé¯èŠãçããŸãã
ã¿ããã€ãã³ãåŠç
Zeptoãå«ãå€ãã®ã©ã€ãã©ãªã«ã¯ãã¿ããã€ãã³ãã®ãµããŒããå«ãŸããŠããŸãã äžè¬ã«ããããã®äœ¿çšã¯ãå§ãããŸããã ã¿ããã€ãã³ããåŠçããå ŽåããŠãŒã¶ãŒãžã§ã¹ãã£ãšãšãã«èŠçŽ ãæŽæ°ããŸãã é 延ããŠãŒã¶ãŒã«æ°ä»ããšãã€ã³ã¿ãŒãã§ã€ã¹ãé ãæããããŸãã ã€ãã³ãã«ã©ã€ãã©ãªã䜿çšããäž»ãªçç±ã®1ã€ã¯ããã©ãŠã¶ãŒã§ã®æ£èŠåãèš±å¯ããããšã§ãã ã¿ããã€ãã³ãããµããŒããããã¹ãŠã®ã¢ãã€ã«ãã©ãŠã¶ãŒã«ã¯åãAPIããããŸãã
ãã®äŸã§ã¯ãtouchstartãtouchmoveãtouchendã®3ã€ã®æèŠã€ãã³ãããããŸãã ãŸããäœããã®çç±ïŒããã·ã¥ã¡ãã»ãŒãžãªã©ïŒã§ãžã§ã¹ãã£ãäžæããããšãtouchcancelã€ãã³ããçºçããŸãã éçºäžã«ãããããæ£ããåŠçããå¿ èŠããããŸãã
function attachTouchEvents() { var bd = document.querySelector('html'); bd.addEventListener('touchmove', handleTouchEvents); bd.addEventListener('touchstart', handleTouchEvents); bd.addEventListener('touchend', handleTouchEvents); }
ã€ãã³ããã³ãã©ãŒã¯TouchEventãªããžã§ã¯ããåãåããŸãã touchstartã€ãã³ããštouchmoveã€ãã³ãã«ã¯ãtouché åã®ãªããžã§ã¯ãã§ããtouchesããããã£ãå«ãŸããŠããŸãã æãã¹ã©ã€ãããã«ã¯ããclientXããšããããããã£ã1ã€ã ãå¿ èŠã§ãã ããã«ã¯ãããŒãžã®å·Šäžé ã«å¯Ÿããã¿ããäœçœ®ã®å€ãå«ãŸããŠããŸãã
iOSããã€ã¹ã¯ãæ倧11ã®åæã¿ããããµããŒãããŸãã AndroidïŒIce Cream Sandwichã®åïŒã¯1ã€ãããµããŒãããŸããã ã»ãšãã©ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã¯ãã¯ã³ã¿ãããå¿ èŠã§ãã ããè€éãªãžã§ã¹ãã£ãŒã¯ãè€æ°ã®ã¿ãããå¿é ãããŸãã
é¢æ°ãhandleTouchEventsã
æåã«ãç¶æ ããµããŒãããããã«ãã®é¢æ°ã®å€åŽã«ããã€ãã®å€æ°ãå®çŸ©ããŸãã
var startPos, endPos, lastPos;
次ã®ãã©ã³ãã¯ãã€ãã³ããªããžã§ã¯ãã®typeããããã£ã«åºã¥ããŠããŸãã
function handleTouchEvents(e){ var direction = 0; //you could also use a switch statement if(e.type == 'touchstart') { } else if(e.type == 'touchmove' ) { } else if(e.type == 'touchend) { }
touchstartã€ãã³ãã¯ãä»»æã®ã¿ããã€ãã³ãã®éå§æã«çºçãããããããã䜿çšããŠãžã§ã¹ãã£ãéå§ãããå Žæãèšé²ããŸããããã¯åŸã§åœ¹ç«ã¡ãŸãã ã¿ã°å ã«æ®ã£ãŠããå¯èœæ§ã®ããå€æããã¹ãŠåãé€ããŸãã
if(e.type == 'touchstart') { //record the start clientX startPos = e.touches[0].clientX; //lastPos is startPos at the beginning lastPos = startPos; //we'll keep track of direction as a signed integer. // -1 is left, 1 is right and 0 is staying still direction = 0; //now we clean off the transtions if(slideData[currentSlide] && slideData[currentSlide].node){ cleanTransitions(slideData[currentSlide].node); } if(slideData[currentSlide + 1] && slideData[currentSlide + 1].node){ cleanTransitions(slideData[currentSlide + 1].node); } if(slideData[currentSlide - 1] && slideData[currentSlide -1].node){ cleanTransitions(slideData[currentSlide -1].node); } } else if(e.type == 'touchmove' ) {
ãtouchmoveãã§ãã¿ããããclientXãã«æ²¿ã£ãŠç§»åããæéã決å®ããçŸåšã®ã¹ã©ã€ããåãè·é¢ã ã移åããŸãã ã¹ã©ã€ããå·Šã«ç§»åããå Žåã¯ã次ã®ã¹ã©ã€ãã移åããå³ã«ç§»åããå Žåã¯ãããã«å¿ããŠåã®ã¹ã©ã€ãã移åããŸãã ãã®æ¹æ³ã§ã¯ã2ã€ã®ãããã¯ã®ã¿ã移åããŸãããããã«ããã¹ããªããå šäœã移åããŠããããã«èŠããŸãã
}else if(e.type == 'touchmove'){ e.preventDefault(); //figure out the direction if(lastPos > startPos){ direction = -1; }else{ direction = 1; } //make sure the slide exists if(slideData[currentSlide]){ //move the current slide into position setPosition(slideData[currentSlide].node, e.touches[0].clientX - startPos); //make sure the next or previous slide exits if(direction !== 0 && slideData[currentSlide + direction]){ //move the next or previous slide. if(direction < 0){ //I want to move the next slide into the right position, which is the same as the //current slide, minus the width of the viewport (each slide is as wide as the viewport) setPosition(slideData[currentSlide + direction].node, (e.touches[0].clientX - startPos) - boundingBox[0]); }else if(direction > 0){ setPosition(slideData[currentSlide + direction].node, (e.touches[0].clientX - startPos) + boundingBox[0]); } } } //save the last position, we need it for touch end lastPos = e.touches[0].clientX; }else if(e.type == 'touchend'){
ã¹ã©ã€ãã®æåŸã§ãããã«åäœã決å®ããå¿ èŠããããŸããåãæãããæåŸã®ã¹ã©ã€ãã§åæ¢ããŸãã ãŠãŒã¶ãŒãæåŸã®ã¹ã©ã€ãã«çœ®ãããŸãŸã«ããŠãã¹ã©ã€ããã¹ã¯ããŒã«ããããšãããšãã¹ã©ã€ããå ã®äœçœ®ã«æ»ãå¿ èŠããããŸããããã«ãããã¹ã©ã€ããå€æŽãããªãã£ãçç±ããŠãŒã¶ãŒã«ãã£ãŒãããã¯ã§ããŸãã
}else if(e.type == 'touchend'){ //figure out if we have moved left or right beyond a threshold //(50 pixels in this case) if(lastPos - startPos > 50){ goTo(currentSlide-1); } else if(lastPos - startPos < -50){ goTo(currentSlide+1); }else{ //we are not advancing, so we need to "snap back" to the previous position addTransitions(slideData[currentSlide].node); setPosition(slideData[currentSlide].node, 0); if(slideData[currentSlide + 1] && slideData[currentSlide + 1].node){ addTransitions(slideData[currentSlide + 1]); setPosition(slideData[currentSlide + 1].node, boundingBox[0]); } if(slideData[currentSlide - 1] && slideData[currentSlide - 1].node){ addTransitions(slideData[currentSlide - 1]); setPosition(slideData[currentSlide - 1].node, 0 - boundingBox[0]); } } }
ããã§ãåºæ¬çãªèŠçŽ ã¯ãã¹ãŠæŽããŸããã ã·ã³ãã«ãªã¿ããã©ã€ãããã¯ã¹ããããŸãïŒ
翻蚳è ããïŒ
翻蚳ãšã©ãŒãèŠã€ããå Žåã¯ããã©ã€ããŒãã¡ãã»ãŒãžã§ç»é²ã解é€ããŠãã ããã ããããšã