2013-08-31

iPad:フリックで写真をスライドさせるiPad用Webアプリ

サンプル

iPadのSafariで開き、「ホーム画面に追加」を実施する。
次回、ホーム画面に作成されたアイコンをタップするとフルスクリーンで表示される。

または、iPadのChromeで開けばフルスクリーンで表示される。

フリックで、次の写真が表示されます。
タップで、コメントが表示されます。もう一度タップすると消えます。

以下のサイトを参考にフリックで写真をスライドさせるiPad用Webアプリを作成しました。

①jQueryでフリック/スワイプ動作の画像スライドギャラリーを作成する実験〈リンク〉
②さくっと簡単!jQueryでコンテンツをオーバーレイ表示させる方法〈リンク〉


以下がhtmlです。

①のスクリプトをベースに、②を参考にして、タッチでコメントをオーバーレイさせるスクリプトを追加しました。(追加とコメントしてある部分)

8行目は、Safariでフルスクリーン表示するための記述。

14~16行目は、chromeで開いたときに、仮想的なスクロールを実施することで、ツールバーを非表示にさせるために(フルスクリーンにするために)追加しました。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>フリックでスライドさせるWebアプリ</title>
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="stylesheet" type="text/css" href="css/base.css" media="all" />
<link rel="stylesheet" type="text/css" href="css/common.css" media="all" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">

window.onload = function(){
 window.scroll(0,0);
}  // 追加

// 以下、http://black-flag.net/jquery/20120306-3710.htmlのスクリプトをコピーして作成

$(function(){
 var $setMainId = $('#flickscroll');
 var scrollSpeed  = 300;

 var overlay = false; // 追加 

 var $setMainUl = $setMainId.children('ul'),
 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;
    this.moved = false; // 追加 
   });
  },'touchmove mousemove': function(e){
   if(!this.touched){
    return;
   }
   this.moved = true; // 追加 
   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;

   if (!this.moved) {
    if ( overlay == false ){
              $(".description").fadeIn();
     overlay = true;
    }
    else{
              $(".description").fadeOut();
     overlay = false;
    }
   } // 追加  http://liginc.co.jp/web/js/jquery/39777を参照
   this.moved = false; // 

   if(this.leftBegin > this.left && (!((this.leftBegin) === (leftMax)))){
    $(this).stop().animate({left:((this.leftBegin)-(listWidth))},scrollSpeed);
   } else if(this.leftBegin < this.left && (!((this.leftBegin) === 0))) {
    $(this).stop().animate({left:((this.leftBegin)+(listWidth))},scrollSpeed);
   } else if(this.leftBegin === 0) {
    $(this).css({left:'0'});
   } else if(this.leftBegin <= leftMax) {
    $(this).css({left:(leftMax)});
   }
  }
 });

});
</script>
</head>

<body>

<div id="container">

<div id="flickscroll">
<ul>
<li><img src="img/photo01.jpg" width="1024" height="768" alt="" /><div class="description">アカバナシモツケソウ</div></li>
<li><img src="img/photo02.jpg" width="1024" height="768" alt="" /><div class="description">アサギマダラ</div></li>
<li><img src="img/photo03.jpg" width="1024" height="768" alt="" /><div class="description">イブキジャコウソウ ピラタス蓼科</div></li>
<li><img src="img/photo04.jpg" width="1024" height="768" alt="" /><div class="description">イブキジャコウソウ</div></li>
</ul>
</div><!--/#flickscroll-->

<div id="overlay">
   <p id="text">XXX</p>
</div>

</div><!--/#container-->




</body>
</html>

 


以下がcssです。

base.cssは、①のものをそのまま使いました。
common.cssは、①のものをベースに、
・幅と高さを、1024pxと768pに変更した。
・コメントを表示するdivのclassのcssを追加した。

common.css

@charset "utf-8";

/* =======================================

 CommonElements

======================================= */
body {
 font-size: 100%;
 line-height: 140%;
 font-family: Arial,Helvetica,sans-serif;
 color: #000;
 text-align: center;
 background: #fff;
}


#container {
 margin: 0 auto;
/* width: 1024px; */
 text-align: center;
}

/* #flickscroll
--------------------------- */
#flickscroll {
 margin: 0 auto;
 width: 1024px; 
 height: 768px; 
 text-align: left;
 position: relative;
 top: -20px;
 overflow: hidden;
 cursor: pointer;
}
#flickscroll ul {
 left: 0;
 height: 768px; 
 position: absolute;
 overflow: hidden;
}
#flickscroll ul li {
 width: 1024px;
 height: 768px; 
 float: left;
 display: inline;
 overflow: hidden;
}

.description{
 display: none;
 position: relative;
 padding: 10px;
 top: -128px;
 font-size: 24px;
    width: 1024px;
    height:128px;
    text-align: left;
    color: #eee;
    background: rgba(0,0,0,0.7);
}


 


base.css


@charset "utf-8";

/* =======================================

  CSS BrowserReset BaseElements
 
  (C)BLACKFLAG.NET ALL RIGHTS RESERVED.
  http://black-flag.net/

 ======================================= */

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-collapse: separate;*/
 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;
}