ボタンにイベントを歩いてターゲットを開け閉めするのは、かなり頻繁に実装することになる。ところでこれゾラ繰り返されるパターンである。何度試みをしたが面倒なので実装していないがしばらく前には実装をした。これからはこれ掻いて使うつもりだ。

▶Demoから見る

一応考えは、ボタンに js-open-targetという名前のクラスを置き、 data-target属性にたたんだピョᆺダするtargetの selectorを明示してくれるだろう。これでクラスと属性を付与するだけで折った咲いたことをすることができる。

js

jsコードは以下の通り。

$(document).ready(function(){

  // 開かれるイベントをかける。
  $('.jquery-on-container').on('click', '.js-open-target', function(e){

    // aやsubmitボタンにクラスを付けた場合、リンク移動やsubmitを防ぐ。
    e.preventDefault();
    var target_selector = $(this).data('target');
    $(target_selector).slideDown();
    $(this).removeClass('js-open-target').addClass('js-close-target');
  });

  /*
   * 最初は。js-close-targetクラスがDOMにロードされていない。
   * on関数を使用すると、監視していた要素の中に定められた要素が登場したときのイベントをかける。
   * この場合、。jquery-on-containerを監視しているが。
   * js-close-targetが登場すると閉鎖したイベントをかける。
   * 前の開かれるイベントをon関数には理由も同じだ。
   * クラスをjs-open-targetにしたがjs-close-targetにしたがためだ。
   */
  $('.jquery-on-container').on('click', '.js-close-target', function(e){
    e.preventDefault();
    var target_selector = $(this).data('target');
    $(target_selector).slideUp();
    $(this).removeClass('js-close-target').addClass('js-open-target');
  })

  // jsファイルをドラッグした場合にはコンテンツが見えるようにjsで開くことはjsで消す。
  $('.js-open-target').each(function(){
    var target_selector = $(this).data('target');
    $(target_selector).hide();
  });
});

HTML

そしてこのような HTMLを入れた。

<h2 class="jquery-on-container">
  <!-- キーボードfocusができるようにaタグを利用した。 -->
  <a href="#" class="js-open-target" data-target=".closed-content">Toggle Target</a>
</h2>
<div class="closed-content">
  <p>大衆が歴史の舞台に登場した瞬間を革命であるならば、ウゴ·チャベスのボリバル革命は、2002年4月11日に開始した。</p>
  <p>右翼クーデター勢力はチャベスを拉致して、新しい政府を宣言した。その政府はやっと48時間の間だけ維持された。</p>
  <p>チャベス支持者数万人がチャベスの復帰を要求して大統領官邸を包囲した。</p>
  ...
</div>

この場合、 h2要素のタイトルを .jquery-on-containerで作成し、 .js-open-target要素は、その中に spanに入れた。しかし、 .jquery-on-containerをもっと広い divで倒しても大きく問題になることはない。ただし、 bodyにそのクラスを置かないはいけない。 .live()関数がどのような関数であり、パフォーマンスの問題が発生してdeprecatedされたのだ。もし分からなくて明らかにしてたのに、 .on()関数の件のコメントで説明を書き留めた。

たたんだが咲いたがする要素は closed-contentという名前のクラスが付いた divだ。だから js-open-target要素の data-target.closed-contentというjQuery Selectorを入れてくれた。 jsコードを見れば分かるが、この中にはどんなjQuery Selectorを入れてもされる。さらに、複数本を入れてもされて、複数に影響を与えるSelectorを入れてもされる。

CSS

最後に、CSS3をこっそり利用した。折りたたんだものには広げることができるという意味を、広げたことには折りたたみができるという意味を与えなければならので、 :after仮想セレクタを利用して、三角形の矢印を入れてくれたし、マウスポインタをクリックすることができるという暗示を与える cursorに変えてくれた。

.js-open-target, .js-close-target {
  cursor: pointer;
}
.js-open-target:after {
  content: "▼";
  font-size: .6em;
  font-family: helvetica;
  color: #888;
  vertical-align: middle;
  margin-left: .5em; 
}
.js-close-target:after {
  content: "▲";
  font-size: .6em;
  font-family: helvetica;
  color: #888;
  vertical-align: middle;
  margin-left: .5em; 
}

これ三角形の記号を入れてくれれば、画像を入れるより解像度対応が容易になる。 vertical-align 'プロパティを利用して縦位置を中央に合わせた、 font-size’は文脈に合わせて柔軟に対応できるように 0.6emに指定してくれた。フォントによって形が変わるのを防ぐためにどこでもあるような英文フォントであるhelveticaのフォントに指定してくれた。

さあ、それでは作ったものをデモページで鑑賞すれば良い。

- コメント機能はありません。コメントの代わりに[email protected]にメールを送ってください。