Google
SSブログ

レスポンシブWebデザイン導入計画(Parllet の場合 その6(スライドメニュー Animated Border Menus 篇-3)) [公開アプリ]

前回の続きです。

01_entry_img.png

レスポンシブWebデザイン導入計画シリーズでは同じ挿絵を使います。(決して手抜きではありません。)

これまでのあらすじ

ドットインストールのレスポンシブなウェブサイトを作ろう に沿ってParllet(個人で作成・公開しているアルファ版のWeb家計簿)のトップページを改修し、相談役の妻の一言でFacebookやGoogle+のようなスライドメニューの実装をと思い立つ。

jQuery Mobile からスライドメニューの要素だけ取り込もうと目論むも、あえなく失敗。

PageSlide を試すが "overlay" の動きの方が良いと感じ、Animated Border MenusParllet(パレット) に組み込みはじめる。

単純に組み込んだ状態から、 Parllet(パレット) にそぐうように目下修正中。

 

あれ? あらすじが前回と同じだ!

 

スポンサードリンク

 

 

修正に手間取り過ぎってことですね・・。

 

気を取り直して今回も修正を続けていきます。

Parllet(パレット) のトップページのメニューはページ内リンクなので、クリックして飛んだときにメニューは閉じて欲しいが、デフォルトではメニュー内のリンクをクリックしても閉じない。

02_integration_of_border_menus_edit12_1.png

03_integration_of_border_menus_edit12_2.png

 

カスタマイズ用に borderMenu.js をコピーしてjquery.borderMenuPrlt.js(一応少しは慣れているjQueryで記述していく) を用意し、</body>直前のJavascript読込の記述を修正。

<script src="js/borderMenu.js"/script

 ↓

<script src="js/jquery.borderMenuPrlt.js"/script

jquery.borderMenuPrlt.js の修正。(結構変えちゃったので、変更前と変更後でゴン、ゴンと載せます。また、Demo 6 の為だけのコードは今回は不要ということで見通しを良くするためにも消してあります。さらにmobilecheck() の中身も省略です。)

変更前

(function() {

// http://stackoverflow.com/a/11381730/989439
function mobilecheck() {
//省略
}

function init() {
var menu = document.getElementById( 'bt-menu' ),
trigger = menu.querySelector( 'a.bt-menu-trigger' ),
// event type (if mobile use touch events)
eventtype = mobilecheck() ? 'touchstart' : 'click',
resetMenu = function() {
classie.remove( menu, 'bt-menu-open' );
classie.add( menu, 'bt-menu-close' );
},
closeClickFn = function( ev ) {
resetMenu();
overlay.removeEventListener( eventtype, closeClickFn );
};

var overlay = document.createElement('div');
overlay.className = 'bt-overlay';
menu.appendChild( overlay );

trigger.addEventListener( eventtype, function( ev ) {
ev.stopPropagation();
ev.preventDefault();

if( classie.has( menu, 'bt-menu-open' ) ) {
resetMenu();
}
else {
classie.remove( menu, 'bt-menu-close' );
classie.add( menu, 'bt-menu-open' );
overlay.addEventListener( eventtype, closeClickFn );
}
});

}

init();

})();

変更後

;(function() {
// http://stackoverflow.com/a/11381730/989439
function mobilecheck() {
//省略
}
function init() {
var menu = jQuery('#bt-menu'),
trigger = menu.children('a.bt-menu-trigger'),
link = menu.find('ul').find('a'),
// event type (if mobile use touch events)
eventtype = mobilecheck() ? 'touchstart' : 'click',
overlay = menu.children('div.bt-overlay'),
resetMenu = function() {
menu.removeClass('bt-menu-open');
menu.addClass('bt-menu-close');
};
trigger.bind(eventtype, function(ev) {
ev.stopPropagation();
ev.preventDefault();

if (menu.hasClass('bt-menu-open')) {
resetMenu();
} else {
menu.removeClass('bt-menu-close');
menu.addClass('bt-menu-open');
}
});
overlay.bind(eventtype, function(ev) {
ev.stopPropagation();
ev.preventDefault();
resetMenu();
});
link.click(function(ev) {
if (menu.hasClass('bt-menu-open')) resetMenu();
});
}
init();
})();

メニュー内のリンクをクリックして閉じるようにする為に必要だったのは

link.click(function(ev) {
if (menu.hasClass('bt-menu-open')) resetMenu();
});

の部分だけですが、勉強(体当たり独学)を兼ねていろいろ変えました。

  1. addEventListener は jQuery では bind でいけるようなので bind に変えた。
  2. classie.js を使ってやっていたのはタグへのクラスの追加・削除・有無判断だけのようだったので、jQuery でやった(addClass 、removeClass 、hasClass )。
  3. closeClickFn について。「これ、僕、よく分かんないっす!closeClickFn の function の中に closeClickFn が出てくるって再帰とかいうやつ? 再帰? それ未だに分かんない!」ってことで、やりたいことはメニューが開いてる時にメニューの外側の部分(var overlay)をクリックでメニューを閉じる(resetMenu())ことのはずなので、"overlay.bind( ・・・" の部分の記載で実現。
  4. "var overlay = ・・・" の部分で、#bt-menu の配下に<div class="bt-overlay"></div> を作っているが、まどろっこしいと感じたので実際にhtmlソース内に直接<div class="bt-overlay"></div>を記載した。

3. によってclassie.js が不要になったので、</body>の直前の以下の記述は削除。

<script src="js/classie.js"></script>

02_integration_of_border_menus_edit12_1.png

04_integration_of_border_menus_edit13_2.png

05_integration_of_border_menus_edit13_3.png

 

そろそろ、スマホスタイルの時だけ現れるようにして、位置サイズも微調整していきたい。

現時点ではブラウザの幅をスマホサイズに縮めた時に

ヘッダー部分のリンク("Parllet とは" 等)が消え、代わりに右端に "+" の文字のリンクが表示

される。 (この回で実装)

06_integration_of_border_menus_edit13_4.png

 

右端の "+" の代わりに "Animated ・・・" の左端メニューボタン(≡)となるように変更。(変更前のソースはこの回サンプルページのソースを参照のこと)

#footerNavLink {
font-size: 13pt;
font-weight: bold;
float: right;
}
@media all and (min-width: 480px) {
#footerNavLink {
display: none;
}
}

 ↓

@media all and (min-width: 480px) {
#bt-menu {
display: none;
}
}

以下は不要になるので削除

<div id="footerNavLink"><a href="#footerNav">+</a> </div>

<div id="footerNav">
<ul>
<li><a href="#divWhatIsParllet">Parllet とは</a></li>
<li><a href="#divTheOriginOfParllet">Parllet の由来</a></li>
<li><a href="#divBenefitsOfParllet">Parllet のメリット</a></li>
</ul>
</div>

高さを保つために以下を追加

#divIdxHdFrm {
height: 36px;
}

07_integration_of_border_menus_edit14.png

 

メニューボタンの位置とサイズの調整(stylePrlt.css を以下のように変更)

.bt-menu-trigger {
top: 10px;
left: 20px;
width: 50px;
height: 50px;
}
 ↓
.bt-menu-trigger {
top: 34px;
left: 10px;
width: 36px;
height: 36px;
}

08_integration_of_border_menus_edit15.png

 

今の Parllet(パレット) のメニュー数での動きとしては問題ないところまで来たので、次回はメニュー数をワザと増やしてみて、 "Android 2.3 スクロール" 問題と対峙したいと思います。

続きます!

 

12/1 追記

続きを書きました。

 


nice!(0)  コメント(0)  トラックバック(4) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 4

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。