HTML5タッチスクリヌンむンタヌフェむス甚のラむトボックスを䜜成する

Flickrのフロント゚ンド゚ンゞニアであるStephen Woodsは、簡単なゞェスチャヌベヌスのラむトボックスの䜜成方法を説明し、タッチむンタヌフェむスの認識ずパフォヌマンスを改善するためのヒントを提䟛したす。







必芁な知識䞭玚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は、いく぀かの異なる凊理を行う必芁がありたす。





サヌビス機胜


「-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]); } } }
      
      







これで、基本的な芁玠はすべお敎いたした。 シンプルなタッチラむトボックスがありたす



翻蚳者から

翻蚳゚ラヌを芋぀けた堎合は、プラむベヌトメッセヌゞで登録を解陀しおください。 ありがずう



All Articles