2013年11月25日月曜日

【HTML5】PC・スマホ両用のフォトギャラリー

スマートフォンでフリックして写真を切り替えられるフォトギャラリーがあると思いますが、
探してみるとPCと共通で使えるものはあまりなく、
スマートフォン専用であるものがほとんどでした。

その中で、スマートフォンとPCと共通で使えるフォトギャラリーを見つけましたので
紹介します。


画像をフリック可能なフォトギャラリー


まずは、データフォルダのヘルプページでも使ってるフォトギャラリーです。
PCならマウスでドラッグ、スマートフォンならフリックで画像を切り替えられます。
PCとスマートフォン共通で利用できるので、別々なページに切り替える必要がなく便利です。
下部の画像をクリック/タップしても画像切替が可能です。




ちょっと長いですが、以下のソースコードだけで実装できます。


 
 <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
 <style id='page-skin-1' type='text/css'><!--
 @charset "utf-8";
 
 html, body, div, span, applet, object, iframe,
 h1, h2, h3, h4, h5, h6, p, blockquote, pre,
 a, abbr, acronym, address, big, cite, code,
 del, dfn, em, font, img, ins, kbd, q, s, samp,
 small, strike, strong, sub, sup, tt, var,
 dl, dt, dd, ol, ul, li,
 fieldset, form, label, legend,
 table, caption, tbody, tfoot, thead, tr, th, td {
  margin: 0;
  padding: 0;
  border: 0;
  vertical-align: baseline;
  font-family: inherit;
  font-style: inherit;
  font-weight: inherit;
 /* outline: 0;*/
 }
 
 html { font-size: 75%; filter: expression(document.execCommand("BackgroundImageCache", false, true));}
 img { vertical-align: text-bottom; -ms-interpolation-mode: bicubic;}
 strong { font-weight: bold; }
 ol, ul { list-style: none; }
 table { border-collapse: collapse; border-spacing: 0; }
 caption, th, td { font-weight: normal; text-align: left; vertical-align: top; }
 blockquote:before, blockquote:after,
 q:before, q:after { content: ""; }
 blockquote, q { quotes: "" ""; }
 a:focus { overflow: hidden; }
 option { padding-right: 10px; }
 
 body { font-size: 100%; line-height: 140%; font-family: Arial,Helvetica,sans-serif; color: #000; text-align: center; background: #eaeaea; }
 a:link { text-decoration:none; color: #000;}
 a:visited { text-decoration:none; color: #000;}
 a:active { text-decoration:none; color: #000;}
 a:hover { text-decoration:none; color: #000;}
 h1 { margin-bottom: 20px; padding: 10px 0; background: #000; color: #fff; font-size: 12px; font-weight: bold; text-align: center; }
 h2 { padding: 30px 0; width: 100%; font-size: 12px; }
 
 #container { margin: 0 auto; width: 400px; text-align: center; }
 #flickscroll { margin: 0 auto; width: 400px; height: 400px; text-align: left; position: relative; overflow: hidden; cursor: pointer; }
 #flickscroll ul { top: 0; left: 0; height: 400px; position: absolute; overflow: hidden; }
 #flickscroll ul li { width: 400px; height: 400px; float: left; display: inline; overflow: hidden; }
 #flickthumb { margin: 10px auto; width: 400px; height: 100px; text-align: center; }
 #flickthumb ul { width: 400px; height: 100px; }
 #flickthumb ul li { width: 100px; height: 100px; float: left; cursor: pointer; display: inline; }
 #flickthumb ul li.active { filter:alpha(opacity=100)!important; -moz-opacity: 1!important; opacity: 1!important; }
 #flickscroll ul:after,
 #flickthumb ul:after { content: "."; height: 0; clear: both; display: block; visibility: hidden; }
 #flickscroll ul,
 #flickthumb ul { display: inline-block; overflow: hidden; }
 --></style>

 
 <script language='javascript' type='text/javascript'>
 $(function(){
  var $setMainId = $('#flickscroll');
  var $setThumbId  = $('#flickthumb');
  var scrollSpeed  = 300;
 
  var $setMainUl = $setMainId.children('ul'),
  $setThumbUl = $setThumbId.children('ul'),
  $setThumbLi = $setThumbUl.children('li'),
  $setThumbLiFirst = $setThumbUl.children('li:first'),
  listWidth = parseInt($setMainUl.children('li').css('width')),
  listCount = $setMainUl.children('li').length,
  leftMax = -((listWidth)*((listCount)-1));
 
  $setMainUl.each(function(){
   $(this).css({width:(listWidth)*(listCount)});
  });
 
  var isTouch = ('ontouchstart' in window);
  $setMainUl.bind(
   {'touchstart mousedown': function(e){
    var $setMainUlNot = $setMainId.children('ul:not(:animated)');
    $setMainUlNot.each(function(){
     e.preventDefault();
     this.pageX = (isTouch ? event.changedTouches[0].pageX : e.pageX);
     this.leftBegin = parseInt($(this).css('left'));
     this.left = parseInt($(this).css('left'));
     this.touched = true;
    });
   },'touchmove mousemove': function(e){
    if(!this.touched){
     return;
    }
    e.preventDefault();
    this.left = this.left - (this.pageX - (isTouch ? event.changedTouches[0].pageX : e.pageX) );
    this.pageX = (isTouch ? event.changedTouches[0].pageX : e.pageX);
 
    if(this.left < 0 && this.left > leftMax){
     $(this).css({left:this.left});
    } else if(this.left >= 0) {
     $(this).css({left:'0'});
    } else if(this.left <= leftMax) {
     $(this).css({left:(leftMax)});
    }
   },'touchend mouseup mouseout': function(e){
    if (!this.touched) {
     return;
    }
    this.touched = false;
 
    var $setThumbLiActive = $setThumbUl.children('li.active');
 
    if(this.leftBegin > this.left && (!((this.leftBegin) === (leftMax)))){
     $(this).stop().animate({left:((this.leftBegin)-(listWidth))},scrollSpeed);
     $setThumbLiActive.each(function(){
      $(this).removeClass('active');
      $(this).next().addClass('active');
     });
    } else if(this.leftBegin < this.left && (!((this.leftBegin) === 0))) {
     $(this).stop().animate({left:((this.leftBegin)+(listWidth))},scrollSpeed);
     $setThumbLiActive.each(function(){
      $(this).removeClass('active');
      $(this).prev().addClass('active');
     });
    } else if(this.leftBegin === 0) {
     $(this).css({left:'0'});
    } else if(this.leftBegin <= leftMax) {
     $(this).css({left:(leftMax)});
    }
   }
  });
 
  $setThumbLi.click(function(){
   var connectCont = $setThumbLi.index(this);
   $setMainUl.stop().animate({left:(-(listWidth)*(connectCont))},scrollSpeed);
   $setThumbLi.removeClass('active');
   $(this).addClass('active');
  });
 
  $setThumbLiFirst.addClass('active');
  $setThumbLi.css({opacity:'0.5'});
 
  var agent = navigator.userAgent;
  if(!(agent.search(/iPhone/) != -1 || agent.search(/iPad/) != -1 || agent.search(/iPod/) != -1 || agent.search(/Android/) != -1)){
   $setThumbLi.hover(function(){
    $(this).stop().animate({opacity:'1'},300);
   },function(){
    $(this).stop().animate({opacity:'0.5'},300);
   });
  }
 }); 
 </script>

  
  <div align=center>
   <div id="flickscroll">
   <ul>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device30.png" width=320 height=400></li>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device100.png" width=320 height=400></li>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device200.png" width=320 height=400></li>
   </ul>
   </div><!--/#flickscroll-->
   
   <div id="flickthumb">
   <ul>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device30.png" width="50" height="50" alt="" /></li>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device100.png" width="50" height="50" alt="" /></li>
   <li><img src="http://www.takahara-books.com/Image/Android/data_folder/device200.png" width="50" height="50" alt="" /></li>
   </ul>
   </div><!--/#flickthumb-->
  </div>



たぶん、アレンジすればもう少しいろいろ飾り付けもできるかと思います。
ぜひお試しください☆


参考サイト:jQueryでフリック/スワイプ動作の画像スライドギャラリーを作成する実験

0 件のコメント:

コメントを投稿