2013年8月31日土曜日

【jQuery】iframe要素をモーダルウィンドウっぽいポップアップで読み込ませる


課題でつかったjQueryの一部を復習かねてまとめます。

こんなかんじで、ある要素をクリックした時点で画面全体をグレーアウトさせるレイヤーとその上にポップアップする外部ファイルを読み込むiframe要素を生成し、グレーアウト部分をクリックするとポップアップもグレーアウトレイヤーも消えて元画面に戻ります。
特にプラグインは必要なく、jQuery本体があれば実装できるつくりになっています。

イメージとしてはこんな感じ。


--------------------------------------------------------------------

HTMLはjQueryが動作しない時、javascriptの動作を許可しないユーザーのために

<a href="URL" target="_blank">リンク文字</a>

と別窓リンクを設定しておきます。
HTMLはこれだけで。

---------------------------------------------------------------------

CSSの設定は以下。

/*グレーアウトのスタイル定義*/
#gray{
background:#000;
opacity:0.8;
width:100%;
height:100%;
position:fixed;
top:0;
left:0;
display:none;
z-index:500;
}

/*ポップアップ部分のスタイル定義*/
#square{
display:block;
width:490px;
height:510px;
z-index:510;
background-color:#fff;
overflow:hidden;
}

#popup{
display:block;
width:490px;
height:510px;
overflow:hidden;
border:none;
}


---------------------------------------------------------------------
以下はjQueryのコード。

$(function(){
 /*-------------------------------
 イベント処理「PopUp」を定義
 --------------------------------*/
 var PopUp = function(){
  //読み込む外部ファイルを取得しておく
  var poplink = ($(this).attr('href'));
  //要素を作成
  $('<div id="gray" class="gray_panel"></div>').appendTo($('#main'));
  $('<div id="square"><iframe id="popup" name="popup"></iframe></div>').appendTo($('#main'))
  .css('display','none');
  //ポップアップを画面中央位置になるよう、位置関係を算出
  var leftposition = Math.floor(($(window).width() - $("#square").width()) / 2);

  //グレー背景をフェードインで表示
  $('#gray')
   .fadeIn("slow")
   .css("display","block");
  //ポップアップ表示領域のスタイル定義
  $('#square')
   .fadeIn("slow")
   .css({
    "position" :"fixed",
    "top"  :"30px",
    "left"  :leftposition,
    "display" :"block",
    "overflow" :"hidden"
   });
  $('#popup')
   //ポップアップ内に外部ファイルを読み込む
   .attr('src',poplink)
   .css({
    "position" :"fixed",
    "top"  :"30px",
    "left"  :leftposition,
    "display" :"block",
    "overflow" :"hidden"
   });

  //クリックして別窓表示という本来の動作をキャンセル
  return false;
 };
 /*-------------------------------
 イベント処理「PopDown」を定義
 --------------------------------*/
 //作成したグレーアウト、iframe、表示領域をフェードアウトさせて削除する
 var PopDown = function(){
  $('#gray,#popup,#square')
   .fadeOut("slow")
   .remove();
 };

 /*-------------------------------
 定義した処理を呼び出す指示
 --------------------------------*/
 //リンクをクリックしたらイベント処理「PopUp」を呼び出し
 $('
リンクの要素名')
  .click(PopUp);
 //グレーアウト部分をクリックしたらイベント処理「PopDown」を呼び出し(追加要素へのイベント処理なのでliveメソッド使用)
 $('#gray').live('click',PopDown);
});

--------------------------------------------------------------------------
ちょこちょこ入れているコメントアウトの通りですが細かく解説をいれると以下のようになります。

1.イベント処理[PopUp]を定義

  //読み込む外部ファイルを取得しておく
  var poplink = ($(this).attr('href'));

ここで、変数poplinkを用意し、クリックした要素(HTMLのリンク文字)が持つリンク先URL(href="URL"のURL)を取得して代入しておきます。
たとえばHTMLで<a href="page1.html" target="_blank">リンク文字</a>としていたら変数poplinkにはpage1.htmlが代入されます。



  //要素を作成
  $('<div id="gray" class="gray_panel"></div>').appendTo($('#main'));
  $('<div id="square"><iframe id="popup" name="popup"></iframe></div>').appendTo($('#main'))
  .css('display','none');

ここでクリックしたときにポップアップしてくる要素を生成します。
ここではグレーアウトさせるためのdiv要素を「gray」、ポップアップするiframeを内包したdiv要素を「square」、外部ファイルを読み込むiframe要素を「popup」とID付しています。
初期状態ではCSS・display:noneで非表示にしています。



 //ポップアップを画面中央位置になるよう、位置関係を算出
  var leftposition = Math.floor(($(window).width() - $("#square").width()) / 2);

これはコメントアウトの通りです。
変数leftpositionに計算式で出した数値を代入します。



 //グレー背景をフェードインで表示
  $('#gray')
   .fadeIn("slow")
   .css("display","block");

ここで画面全体を覆うグレーアウトのdiv要素#grayをfadeInメソッドで表示させます。



//ポップアップ表示領域のスタイル定義
  $('#square')
   .fadeIn("slow")
   .css({
    "position" :"fixed",
    "top"  :"30px",
    "left"  :leftposition,
    "display" :"block",
    "overflow" :"hidden"
   });


ポップアップのiframeを内包したdiv要素・#squareを上記の#grayと同じようにフェードインさせると共に、表示位置をCSSのpositionで設定。ここでpositionのleftに、先ほど用意した変数leftpositionを使います。



$('#popup')
   //ポップアップ内に外部ファイルを読み込む
   .attr('src',poplink)


生成したdivが含むiframe ・「#popup」が読み込む外部ファイルのソースを設定します。
生成した時点では<iframe id="popup" name="popup"></iframe>と、idとname付けしかしていないのでattrメソッドで属性src,値を変数poplinkとして追加します。



 //クリックして別窓表示という本来の動作をキャンセル
  return false;

これもそのまま。javascriptが動作した場合はHTMLに設定している別窓リンクをキャンセルさせます。これって、なんでreturn falseでキャンセルされるのかいまいちわからないまま使っています。(……)



2.イベント処理「PopDown」を定義

//作成したグレーアウト、iframe、表示領域をフェードアウトさせて削除する
 var PopDown = function(){
  $('#gray,#popup,#square')
   .fadeOut("slow")
   .remove();
 };

フェードアウトさせるための処理です。
生成した#gray,#popup,#square三つの要素すべてをフェードアウトして要素を削除します。
この削除がポイント。フェードアウトさせるだけでは、非表示になるだけで、再びリンクをクリックしたタイミングで同一のIDをもつdivやiframeが新たに生成されてしまいます。
単にリンクさせている場合は特に問題なさそうですが、読み込む外部ファイルにアンカーリンクさせていると、アンカーがうまく作動しなくなりました。
なので非表示にさせるタイミングで要素辞自体を一度削除するべきでしょう。



3.定義した処理を呼び出す指示

 //リンクをクリックしたらイベント処理「PopUp」を呼び出し
 $('リンクの要素名')
  .click(PopUp);
 //グレーアウト部分をクリックしたらイベント処理「PopDown」を呼び出し(追加要素へのイベント処理なのでliveメソッド使用)
 $('#gray').live('click',PopDown);
});



リンク文字をクリックした時点、グレーアウトをクリックした時点でそれぞれ定義したイベント処理「PopUp」「PopDown」を呼び出します。
#grayはHTMLのほうにある要素ではなく、jQueryの処理の中で新たに生成・追加した要素なのでliveメソッドを使っています。
このliveメソッドを適用させるタイミングがいまいちわかっておりません。うーん。


---------------------------------------------------------------------------

ざっとこんな感じでした。
HTMLでのリンクで外部ファイルにアンカーリンクを設定していて、removeさせるという考えが全くなく、アンカーが全く効かなくて頭をひねりまくりました。
removeが必要な理由を上で考察しましたが、その理由が正解なのかはわかりません笑

それにiframeを囲むdivも本当に必要だったのか?
iframe要素だけでは成り立たないのか、検証してません。もしかしたら必要ないかもしれません。

いろいろと詰めの甘いソースですが、現在の自分が組めたのはこんなものでした。

2013年8月29日木曜日

課題修了

通っているWEBスクールの最終課題が終了。
ごく簡単なプレゼンと質疑応答があった。他の人の課題を拝見して反省点が噴出。
言い訳を噛ませることはできるんだけど、結局は自分の詰めの甘さが浮き彫りになって情けなく。

一応金魚のECサイトという位置づけだけれども、目的はjQueryの習得でした。
自分が考えたインターフェースを実現させられるか、という自分なりの課題設定で取り組んだ。
ので、これでもかというほどjQueryを実装させている。
結果、商業デザインとしてはなりたたないインターフェースが出来上がった…。
申し訳程度に、更新部分をiframeで外部ファイル化しているだけで、正直拡張性もなく、コーディングも大部分がXHTMLのままで終わり、クロスブラウジングもそこそこの確認でしかなく…という散々な結果に。

それでも当初のイメージをほぼそのまま実現できて、スクリプトも一から組み込んだ部分もあり、単純にプラグインを置いて画像だけ変える、ということに終わらなくて済んだ。
スクリプトを組むということがどういうものなのかを経験できたのが良かったと思う。

今度からは、商業デザインということを考えなくてはならないと思う。
今回の課題サイトを三か月前の自分に納品してガイドラインを用意しても更新作業は困難だと思う。
自分は相手を考えたものづくりをしたかったはず。
サイトを利用する側だけでなく、管理運営する側のことも考えなくちゃ。

合わせてマーケティングに関しても学んでいくことも多い。頑張ろう。

2013年8月19日月曜日

【jQuery】横型コンテンツをイージースクロール【マウスホイール】

jQueryを使って横スクロール

課題サイトで実装したスクロールに関するスクリプトまとめメモ。解説ではないです。
  1. マウスホイールのスクロール方向を横に(プラグイン:「jquery.mousewheel.js」使用)
  2. アンカーリンクをイージースクロールさせる(プラグイン:「jquery.easie.js」使用)
  3. スクロールを余韻を残す動作に変更(上二つのプラグイン併用)

1.マウスホイールのスクロール方向を横にする

二つ前の記事にも記載しましたが、こちらのページを参考にさせていただきました。
プラグイン「jquery.mousewheel.js」を使ってマウスホイールの動作を検知してホイールを上に回した時の処理、下に回した時の処理をそれぞれ設定。

特定の要素上(たとえばテキストエリア上とか)では横スクロールではなく縦スクロールにホイールの挙動を戻したいのを考え中。
(unbindメソッドとか使えばいいのかな?)

2.アンカーリンクをイージースクロールさせる

ページ内リンクをパッと切り替えのように一瞬で飛ぶのではなく、アニメーションでスクロールさせる。
その際、アニメーションの速度や加速を調整するイージング処理を指定できる。jQueryの初期状態ではイージングの種類は「linear」と「swing」しかない。
そこでプラグイン「jquery.easie.js」で様々なイージング処理を追加できる。使い方はhtmlで「jquery.easie.js」を読み込んでおき、アニメーションメソッドのイージング処理指定の部分にプラグインで定義されているイージング処理名をしていするだけ。
イージング処理の種類に関してはこちらのサイトが非常にわかりやすいデモ付きで解説されています。

$(function(){
  $('クリックさせる要素').click(function(){
    $('スクロールさせる要素(bodyなど)').animate({scrollLeft:'0px'},1000,'easieEaseInCubic');
    //.animate({スクロール方向:スクロールをする目的地の数値},スピード,
’イージング処理名’)
    return false;
  })
});


スクロール方向は縦方向ならscrollTop、横方向ならscrollLeftを使用します。いずれもキャメルケースで表記。
スクロールする位置はpositionのtopとleftのようなもの。ピクセル指定。
これはclickした時にanimateメソッドを呼び出し指定した位置までスクロールさせる。
htmlでは通常のアンカーリンクを施しているので、ユーザーがjavascriptを許可しなくても、アンカーリンク自体は動作する。
 

3.スクロールの動作を余韻を残す動作に変更する

これもこちらのページを参考に。
リンク先のページのコードは縦スクロール用なので、scrollTopをscrollLeftに書き換え。

--------------------------------------------------------------------------------
プラグインや公開してくださっている方のコードを使うとなかなかさくっとはいきませんね。
人のコードを読み解きながら実装させていくのは勉強になります。

2013年8月18日日曜日

【困ったメモ】アンカーリンクの位置調整

ちょっとした問題の解決策を探していたけど、なかなか見つからず長期戦になりそうなので後回しにするため、問題把握のためのメモ。

横スクロール型コンテンツの表示領域を950*580にclearfix:hiddenで限定している。この表示領域はposition:relativeとネガティブマージンを使ってウィンドウの上下左右中央寄せにしている。
その表示領域でページ内リンクを利用するとき、リンク先の要素をウィンドウの左端ぴったりに表示するので、思いっきり非表示領域に被ってしまう。

で、じゃあこの非表示部分に被っている分だけマージンを稼いでおけば・・・と考えたんですが(そういう解決方法はたくさんまとめてくれる人がいらっしゃいました)、この表示領域は先述したとおり上下左右中央寄せしているので、被る部分の数値がユーザーの使うディスプレイやブラウザウィンドウの大きさで変わる・・・。

なのでCSSのほうで被る部分の余白を数値で設定しておくのは結局、ウィンドウの大きさを変えればまたズレてしまうのであまり意味はなさそう。
jQueryでアンカーリンクをスムーズスクロールさせているのですが、そこらへんでなんとかならないかなあ。
javascriptでウィンドウ端から表示領域までの距離を検知する方法とかって、ないのかなあ・・・。

スムーススクロールでするするーっと横に移動するのがやりたいんですが、やっぱり作っていると課題が山積みです。

2013年8月17日土曜日

【jQuery】制作中【CSS3】

出遅れている中、課題の金魚ECサイトのコーディング中。
今回は横型のコンテンツなので、ページ遷移などに関して、jQueryを使ってみた。

参考にしたサイトをメモ。

【jQueryでマウスホイールで横にスクロールする横型コンテンツ】

【jQueryでマウスホイールすると余韻が残るイージングスクロールをつくる】

こちらのページを参考にしてjQueryプラグインを使った実装。うーん、ほとんど理解せぬまま動くから、便利だけど、自分で作っておきながらいまいちわかってない不安感。
自分のつくったページを100%理解していたいなんて思ってしまうけど、じゃあそもそもライブラリ使うなって感もあるよな・・・・・・。
ともかく、WEBは惜しみなくその技術をオープンにしてくれる方々のおかげで、こんな自分でも動的コンテンツを作ることができる。とってもありがたいです。

横スクロールで、縦書きのレイアウト部分で出来るなら画像じゃなくテキストとして記述したいと、
WEB上で縦書きを実現する方法はないのかなと探していましたら、ありました。

JavaScript 版 縦書き化ツール「竹取JS」】

こちらはjQueryではなくjsです。
サンプルページがとてもきれい。横/縦書きの切り替えをさせられるのもいい。
今回は結局使わないけれど、機会があったらぜひ使ってみたい。

HTML5の授業の中でCSS3を少しずつ使いだし……
アニメーションロールオーバーが手軽でかっこいい!
透明度調整でなんかイケてる!
角丸いちいちpng画像にしなくてもいいんだ!

と、基礎的なところで感動中。
でも、感動の勢いでついつい無意味に装飾してしまいがちになるので、ほどほどに抑えよう…。
今回は通常の金魚ECサイトにないインターフェースを、というアプローチなので、装飾に凝るのは方向としては間違っていないのですが、機能性を丸無視しちゃあしょうがないですからね。改めてここら辺を念頭に入れておかないと。

PHPの勉強に手が回らない・・・・・・

2013年8月13日火曜日

並行していくこと2

見事に並行できていない。
前回の記事のタイトルが胸に刺さる。

先日無事に自分の行く先が決まった。希望していたWEB職種。
素敵なめぐりあわせに本当に感謝したい。
半月ほどの就職活動で見つかったのも、運が良かったとしか。

おかげでようやく課題に集中できるわけですが……結局、前回の課題と同じほどの作業時間しか残っていない。
はたして形になるのか……なんてのは愚問で、するのです。形に。
しばらく制作ストップしていたので、改めて進行状況を確認しないと…。

気持ちの切り替えを、もっとスマートに。
次の目標は、これですね。

2013年7月27日土曜日

並行していくこと

学校のカリキュラムがDWの操作からjQueryに入った。
まだインストールを終えたところなのでなんとも。数学的思考が全くできない自分には敷居が高いです。
ですが課題作品でモーダルやアニメーションを使う予定であるので、気を引き締めてかからないと。
今のところ課題制作のほうはワイヤーフレームを考えつつ、金魚たちのマスクをじみじみなぞっています。
ビジュアル押しでデザインを考えていると、すぐに機能性を失いそうになるのでサイト設計の難しさを実感中であります。

またぼちぼち就職活動も開始。
やっぱり求人の数が違う。photoshopとillustratorだけのしょぼいスキルだけで求人票を眺めていたころに比べると、未経験者とはいえ応募できるだけ成長したのかなと思います。
もちろん、「実務経験2年以上」の文句を見るたびに、単にスタートラインに立とうとしている程度なのは強く自覚するのですが。

面接でお聞きした話や求人票を見ていると、現場で必要とされている技術は単にHTML+CSS、DW操作に留まらず、PHPやJAVA,javascript(jQueryでなく)も求められているところが多いようです。少数精鋭の制作会社だと当然ですがこの傾向は特に顕著です。
どれも、現在通う学校の授業範囲外・・・たった3か月のコースなのでそこは仕方ないのですが。
講師の先生はとてもわかりやすく教えて下さるし、頼りになる方です。それだけにもっと長く広く深く学校で学べたらなと思ってしまいます。

残念ながらそうもいかないし、もとより職業訓練校は新しい技能習得の足がかりとして、という認識だったので甘えず、独学でも何か一つ、勉強を進めていこうと思いました。

ということでフロントエンドはjQueryを学ぶので、バックエンドを学ぼうと今日図書館で「みるみるPHPがわかる本」を借りてきました。
うーん、なんてやさしそうな題名! 本自体も薄くて入門にはよさそうです。
まだfor構文とは? なんてところをやってるんですが、プログラミングの考え方になれるまで自分は時間がかかりそうです。
とりあえず、黒い画面のコマンドプロンプトをいじくりまわしているだけでテンションが上がるので(パソコンできる人っぽい!)この単純思考のモチベーションを逃さずに少しずつですが勉強を進めていきたいと思います。


関係ないですが、隅田川の花火大会がかわいそうなことになってます。テレ東の中継が大変そうです。