<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>たねっぱ！ &#187; javascript</title>
	<atom:link href="https://taneppa.net/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://taneppa.net</link>
	<description>コツコツあつめるWeb作りのためのたね　たねっぱ！Web系情報ブログ　Webのお役立ちネタ配信中！</description>
	<lastBuildDate>Tue, 09 May 2023 00:02:06 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>レスポンシブサイトで必要になるレイアウト変化に関わるJSの処理</title>
		<link>https://taneppa.net/responsive_js/</link>
		<comments>https://taneppa.net/responsive_js/#comments</comments>
		<pubDate>Wed, 20 Jul 2016 00:45:59 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3031</guid>
		<description><![CDATA[レスポンシブサイトでは「ブラウザ幅によってレイアウトが切り替わる」という特性からほぼ毎回必要になるようなJSの処理があります。今回はその処理に関してご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>レスポンシブサイトの案件が最近多く、作っている中で「ブラウザ幅によってレイアウトが切り替わる」という特性からほぼ毎回必要になってくるJSの処理が固まってきました。</p>
<p>そこで今回、僕自身がレスポンシブサイトを作成する際にどのようなJSを準備として毎回書いているかご紹介したいと思います。</p>
<h2 id="-">現在のレイアウトの状況を判別する関数の作成</h2>
<p>レスポンシブサイトを作成していると、「スマホレイアウトの時だけこの処理をしたい」といったような、現在のレイアウトの状況を取得したい場面が頻繁に登場します。</p>
<p>そのため、以下のようなコードをいつも記述しています。</p>
<h3 id="css">CSS</h3>

<pre class="brush: xml; title: ; notranslate">#MqMark {
  display: none;
}

@media (min-width: 1016px){
  #MqMark {
    font-family: 'pc';
  }
}
@media (min-width: 768px) and (max-width: 1015px) {
  #MqMark {
    font-family: 'tb';
  }
}
@media (max-width: 767px) {
  #MqMark {
    font-family: 'sp';
  }
}</pre>

<h3 id="javascript">javascript</h3>

<pre class="brush: xml; title: ; notranslate">var MYAPP = {};

(function($, win) {
  var $win = $(window);

  MYAPP.getLayout = function() {
    var $mqMark = $('#MqMark');
    var layout  = $mqMark.css('font-family').replace(/&quot;/g, '');

    return layout;
  };
})(jQuery, window);</pre>

<h3 id="-">解説</h3>

<p>このコードでは、「&lt;div id=&#8221;MqMark&#8221;&gt;&lt;/div&gt;」といったメディアクエリ判定用（display: none;を使用して見栄えに影響がないようにしている）の要素をHTMLに記述しておき、その要素の状態を取得することにより現在のレイアウトを判別しています。</p>

<p>前述のようなコードを準備しておくと</p>

<pre class="brush: xml; title: ; notranslate">if (MYAPP.getLayout() === 'sp') {
  // スマホレイアウトの時だけこの中に入る
}</pre>

<p>といったような条件分岐が可能になります。</p>

<p>特徴的なのは、現在のレイアウトの取得を、「#MqMark」のfont-familyによって行っている点です。（<a href="http://qiita.com/r_abe01/items/a3a2e94b5162d949037b">こちら</a>の記事を参考にさせていただきました。）</p>
<p>実装が気持ち悪いことは気持ち悪いのですが、CSS側との連携等考えると一番スマートなやり方だと感じ自分は使わせて頂いています。</p>
<h2 id="-">レイアウト切り替わり時にイベントを発生させる。</h2>
<p>他にも、「レイアウトが切り替わった瞬間に特定の処理をさせたい」等といった場面も頻繁に遭遇します。</p>
<p>自身がよく遭遇する場面としては、「PCレイアウトで３列で並べているパネル型のアイテムがあり、それをtile.jsで高さを揃えている」状況でかつ「スマホレイアウトだと３列から２列に切り替わる」といったような場面によく遭遇します。こういう場合に切り替わりのタイミングに合わせて処理を実行する必要が出てきます。</p>
<p>このために、以下のコードを前述のコードに加えて準備しています。</p>
<h3 id="javascript">javascript</h3>

<pre class="brush: xml; title: ; notranslate">(function($, win) {
  var $win = $(window);

  MYAPP.EVENT_LAYOUTCHANGE = 'layoutchange';

  $(function() {
    // layout trigger
    (function() {
      var oldLayout = false;
      $win.on('resize load', function() {
        var currentLayout = MYAPP.getLayout();

        if (currentLayout !== oldLayout) {
          var event = $.Event(MYAPP.EVENT_LAYOUTCHANGE);

          event.newLayout = currentLayout;
          event.oldLayout = oldLayout;

          $win.trigger(event);

          oldLayout = currentLayout;
        }
      });
    })();
  });
})(jQuery, window);</pre>

<h3 id="-">解説</h3>

<p>やってることはシンプルで、resizeイベント発生時に現在のレイアウトを取得して、レイアウトが変わっていれば「layoutchange」イベントをトリガーしています。</p>

<p>このコードを準備しておくと、</p>

<pre class="brush: xml; title: ; notranslate">var $win = $(window);

$win.on(MYAPP.EVENT_LAYOUTCHANGE, function(event) {
  switch(event.newLayout) {
    case 'pc':
      console.log('layout to pc');
      break;
    case 'tb':
      console.log('layout to tb');
      break;
    case 'sp':
      console.log('layout to sp');
      break;
  }
});</pre>

<p>このような方法で、レイアウト切り替わり時に特定の処理を実行することが出来ます。</p>

<h2 id="-">以上</h2>
<p>レスポンシブサイトはHTML/CSSだけでなく、javascriptもレイアウト切り替わりという挙動があることから必然的に複雑になってしまいます。</p>
<p>下手に書いてしまうと普通のサイトより顕著にコードがどんどんカオスになってしまうので、出来るだけよくあるパターンに関してはまとめておいて綺麗に書けるようにしておきたいですね。</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/responsive_js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Photoshopのスクリプトの作り方</title>
		<link>https://taneppa.net/photoshop_script/</link>
		<comments>https://taneppa.net/photoshop_script/#comments</comments>
		<pubDate>Wed, 13 Jul 2016 09:11:42 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[PhotoShop]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[効率化]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3014</guid>
		<description><![CDATA[Webサイトを作る上で頻繁に出てくる大量の画像ファイルの処理。それの効率化の方法となるPhotoshopのスクリプトの作り方に関して今回はご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>Webサイトを作る上で、画像を大量に処理する必要は頻繁に出てくるのですが、ネット上を見る限りPhotoshopのスクリプトを自作して効率化するパターンは中々少数派のようです（日本語情報がほとんど出てこないですし…）</p>
<p>そこで今回はPhotoshopのスクリプトの作り方をご紹介したいと思います。</p>
<h2 id="-">本記事の対象者</h2>
<ul>
<li>Photoshopのスクリプトを書いて業務を効率化したいと考えている</li>
<li>Javascriptはそれなりに書ける</li>
<li>英語ドキュメントを見ても体調が悪くならない</li>
</ul>
<h2 id="-">基本</h2>
<p>Photoshopのスクリプトは複数の言語を選択することが出来るのですが、今回は一番慣れている人が多いであろうJavascriptで作成していきます。</p>
<h3 id="-">参考ドキュメント</h3>
<ul>
<li>
  公式ドキュメント（英語）<br />
  <a target="_blank" href="http://www.adobe.com/devnet/photoshop/scripting.html">Adobe Photoshop Scripting | Adobe Developer Connection</a><br />
  ※こちらの「Photoshop CC JavaScript Reference 」
</li>
<li>
  サンプルスクリプト<br />
  <a target="_blank" href="http://www.openspc2.org/book/PhotoshopCS6/">Adobe Photoshop CS6自動化作戦</a>
</li>
<li>
  日本語ドキュメント（一部）<br />
  <a target="_blank" href="http://www.openspc2.org/reibun/AdobeJS/CS6/index.html">Adobe CS6 バージョンJavaScript リファレンス</a>
</li>
</ul>

<p>
公式ドキュメントは英語なので中々読むのが辛そうに見えるかもしれませんが、全部読む必要はありません。作りたいスクリプトに必要そうなキーワードで検索して（例えばWeb用に保存を自動化したいなら「Web」で検索するとか）関係ありそうな箇所を読むだけでスクリプトを作れることが多いので、今回を期に苦手意識を克服しましょう！
</p>

<h3 id="-">スクリプトファイルの配置場所</h3>
<ul>
<li>Mac：/Applications/Adobe Photoshop XXXX/Presets/Scripts</li>
<li>Windows：C:¥Program Files¥Adobe¥Adobe Photoshop XXXX¥Presets¥Scripts¥</li>
</ul>
<p>スクリプトファイルの拡張子は「jsx」作成してください。<br />（今回は例として「myscript.jsx」というファイルを作成したいと思います。）</p>
<h3 id="-">スクリプトの実行方法</h3>
<p>「myscript.jsx」を前述のディレクトリに作成した後Photoshopを起動すると、下の画像のように「ファイル」＞「スクリプト」内に「myscript」という項目が出来ていると思います。これをクリックすると「myscript.jsx」に記述されたスクリプトが実行されます。</p>

<a href="https://taneppa.net/wp-content/uploads/2016/07/image01.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/image01.png" alt="image01" width="608" height="253" class="alignnone size-full wp-image-3021" /></a>

<h3 id="-">デバッグ等のために値を出力させたい</h3>
<p>alertを使用することが可能です。</p>

<pre class="brush: xml; title: ; notranslate">var tmp = 100;
alert(tmp); // 100がポップアップで表示される</pre>

<p>実際に、「myscript.jsx」に上記のコードを入力して実行すると、100がポップアップで表示されるはずです。</p>
<p>他の方法もあるのですが、alertを使用するのが一番手軽な方法かと思います。</p>
<h2 id="-">実例</h2>
<h3 id="-1-">例1：現在アクティブなファイルのパスを表示する</h3>
<p>例として、現在アクティブなファイルのパスを表示するスクリプトを書いてみましょう。</p>

<pre class="brush: xml; title: ; notranslate">var doc = app.activeDocument;
alert(doc.path);</pre>

<p>「app.activeDocument」は現在アクティブなファイルの情報が入っているDocumentオブジェクトを返却します。</p>
<p>Documentオブジェクトには色々プロパティがあるのですが、一部を紹介すると。</p>
<table>
<thead>
<tr>
<th style="text-align: left;">プロパティ名</th>
<th style="text-align: left;">概要</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">name</td>
<td style="text-align: left;">ファイル名<br />例）tmp.psd</td>
</tr>
<tr>
<td style="text-align: left;">path</td>
<td style="text-align: left;">ファイルのパス<br />例）~/Desktop</td>
</tr>
<tr>
<td style="text-align: left;">fullName</td>
<td style="text-align: left;">ファイルのフルパス<br />例）~/Desktop/tmp.psd</td>
</tr>
<tr>
<td style="text-align: left;">width</td>
<td style="text-align: left;">ファイルの横幅<br />例）960px</td>
</tr>
<tr>
<td style="text-align: left;">height</td>
<td style="text-align: left;">ファイルの高さ<br />例）400px</td>
</tr>
</tbody></table>
<p>等があります。</p>
<p>というわけで、アクティブなファイルのパスを表示するスクリプトは、</p>

<pre class="brush: xml; title: ; notranslate">var doc = app.activeDocument;
alert(doc.path);</pre>

<p>となります。<br />詳しくは公式ドキュメントを参照してください。</p>
<p>このスクリプトを実行すれば現在アクティブなファイルのパスが表示されるはずです。</p>
<h3 id="-2-jpg-">例2：現在アクティブなファイルをjpg出力する</h3>
<p>次は一歩進んでファイルをjpg出力してみましょう。</p>
<p>画像を出力するには「exportDocument」を使用します。</p>
<p>実際のコードは以下のとおりです。<br />（これからはコードの説明は必要な箇所にコメントで記述します。）</p>

<pre class="brush: xml; title: ; notranslate">var doc = app.activeDocument;

// Fileの引数に、出力したい画像のフルパスを渡す
var file    = new File('~/Desktop/tmp.jpg');

// optionsは書き出しオプション
var options = new ExportOptionsSaveForWeb();

// 画像形式
options.format    = SaveDocumentType.JPEG;
// 最適化の有無
options.optimized = true;
// 画質
options.quality   = 100;

doc.exportDocument(file, ExportType.SAVEFORWEB, options);</pre>

<p>画像を出力したいファイルを開いた上で、スクリプトを実行すると画像が出力されるはずです。</p>
<h3 id="-3-psd-jpg-">例3：ダイアログから選択したフォルダ直下にあるpsdファイルをjpgで一括出力する</h3>
<p>さらに応用編で、例2の作業をフォルダに対して出来るようにしてみましょう。</p>
<p>その前に、まず「選択したフォルダのpsdファイルを開き、ファイル名を表示して閉じる」スクリプトを準備として作ってみましょう。</p>

<pre class="brush: xml; title: ; notranslate">// Folder.selectDialogでダイアログを開き、フォルダを選択させる事ができる。
var folderObj = Folder.selectDialog(&quot;フォルダーを選択してください。&quot;);

// ユーザーが「キャンセル」を押した場合は処理を続けないための分岐
if (folderObj) {

  // getFilesでフォルダ直下にあるファイル一覧を取得出来ます。
  // 引数にはファイル名の条件を指定することが出来ます。
  // 今回は「*.psd」とし、拡張子が「psd」のものだけ取得するようにしています。
  var fileList = folderObj.getFiles('*.psd');

  // 取得したファイルそれぞれに対して処理するためにforでループ
  for (var i=0; i&lt;fileList.length; i++) {

    var file = fileList[i];

    // openで指定したファイルをPhotoshopで開くことが出来ます。
    open(file);

    // 開いたファイルはアクティブな状態になるので、「app.activeDocument」で
    // Documentオブジェクトが取得出来ます。
    var doc = app.activeDocument;

    alert(doc.name);

    // closeでファイルを閉じる事が出来ます
    // 「SaveOptions.DONOTSAVECHANGES」は「変更を保存せずに閉じる」オプションです。
    doc.close(SaveOptions.DONOTSAVECHANGES);
  }
}</pre>

<p>さらにこれを応用して、「ダイアログから選択したフォルダ直下にあるpsdファイルをjpgで一括出力する」スクリプトを書くことが出来ます。</p>
<p>やることは「alert(doc.name)」の部分を例2の内容で置き換えるだけです。</p>

<pre class="brush: xml; title: ; notranslate">var folderObj = Folder.selectDialog(&quot;フォルダーを選択してください。&quot;);

if (folderObj) {
  var fileList = folderObj.getFiles('*.psd');

  for (var i=0; i&lt;fileList.length; i++) {
    var file = fileList[i];
    open(file);
    var doc = app.activeDocument;


    /***********************************************************************
    ここから例2の内容
    **********************************************************************/
    // ここだけ、例2のままだと全て同じ名前で出力されてしまうので、
    // それぞれの名前でjpgファイルが出力されるように変更しています。
    var file    = new File('~/Desktop/' + doc.name.replace('.psd', '.jpg'));
    var options = new ExportOptionsSaveForWeb();

    options.format    = SaveDocumentType.JPEG;
    options.optimized = true;
    options.quality   = 100;

    doc.exportDocument(file, ExportType.SAVEFORWEB, options);
    /***********************************************************************
    ここまで例2の内容
    **********************************************************************/


    doc.close(SaveOptions.DONOTSAVECHANGES);
  }
}</pre>

<p>これを実行すると、選択したフォルダ直下のpsdファイルがデスクトップにjpg画像として出力されるはずです。</p>
<h2 id="-">以上</h2>
<p>大量の画像の処理はめんどくさくて時間がかかる作業の割に得るものはほとんど無いので、積極的に自動化していきたいですね。</p>
<p>以上、たにっぱでした〜</p>
<h2 id="-">参考記事</h2>
<p><a target="_blank" href="http://qiita.com/tanishi/items/e0e9167d5d76a94f6265">PhotoshopExtensionのつくりかたとか &#8211; Qiita</a></p>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/photoshop_script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP,JavaScriptでの月の加減算での落とし穴</title>
		<link>https://taneppa.net/php_js_month_addsub/</link>
		<comments>https://taneppa.net/php_js_month_addsub/#comments</comments>
		<pubDate>Sun, 27 Sep 2015 23:30:08 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2800</guid>
		<description><![CDATA[翌月や昨月の年月を取得なんて処理は結構出てくるのですが、PHPのDateTimeクラス、JavaScriptのDateクラス共に同じ落とし穴があります。結構有名な落とし穴なのですが、知っていないとテスト漏れで不具合を出したりしてしまいますので、今回はその落とし穴と対処法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>翌月や昨月の年月を取得なんて処理は結構出てくるのですが、PHPのDateTimeクラス、JavaScriptのDateクラス共に同じ落とし穴があります。</p>
<p>結構有名な落とし穴なのですが、知っていないとテスト漏れで不具合を出したりしてしまいますので、今回はその落とし穴と対処法をご紹介したいと思います。</p>
<h2 id="-">月の加減算の落とし穴</h2>
<p>「2015年1月31日の翌月の年月日を取得して出力」なんて処理を書く場合、以下のようになるかと思います。</p>


<pre class="brush: xml; title: ; notranslate">&lt;?php
  // PHP
  $dat = new DateTime('2015/01/31', new DateTimeZone('Asia/Tokyo'));
  echo $dat-&gt;add(new DateInterval('P1M'))-&gt;format('Y/m/d');</pre>

<pre class="brush: xml; title: ; notranslate">// JavaScript
var dat = new Date(2015, 0, 31);
dat.setMonth(dat.getMonth()+1);
console.log(dat.toLocaleString());</pre>

<p>この結果は、両方共「2015年3月3日」となります。イメージとしては「2015年2月28日」が帰ってきそうなのでかなり違和感がある結果ですよね？</p>
<h2 id="-">理由</h2>
<p>これは、</p>
<p>「1月31日に1月足す」→「2月31日？」→「でも2月は28日までやから3日オーバーしてんな…」→「よっしゃ気を利かして3月3日にしといたろ！」</p>
<p>という処理を中でしているためこのような結果となってしまっています。</p>
<p>確かに処理として間違っていないと言えば間違っていないのですが、大体こういう場合クラスを使用している側として欲しい答えは「2月28日」ですよね。</p>
<h2 id="-">対処法</h2>
<p>必要なのが「年月」のみで日付まで必要でないのであれば、以下の方法で対処が可能です。</p>
<h3 id="-">対処法の概要</h3>
<p>今回の問題は「1月31日」のように、月によって存在しない日付を元に加減算している所が原因となっています。</p>
<p>そのため、毎月必ず存在する日付（例えば「1日」は毎月ありますよね）に変えてから加減算するようにすれば問題は起こりません。</p>
<h3 id="php-">PHPでの例</h3>


<pre class="brush: xml; title: ; notranslate">&lt;?php
  $dat = new DateTime('2015/01/31', new DateTimeZone('Asia/Tokyo'));
  echo $dat-&gt;modify('first day of')-&gt;add(new DateInterval('P1M'))-&gt;format('Y/m');</pre>


<h3 id="javascript-">JavaScriptでの例</h3>


<pre class="brush: xml; title: ; notranslate">var dat = new Date(2015, 0, 31);
var datFirstDay = new Date(dat.getFullYear(), dat.getMonth(), 1);
datFirstDay.setMonth(datFirstDay.getMonth()+1);
console.log(datFirstDay.toLocaleString());</pre>


<p>これでPHP,JavaScript共に「2015年2月」を指すようになります。</p>
<h2 id="-">以上</h2>
<p>日付関連のクラスには落とし穴が結構多いので、たかが日付と侮らず注意して扱いましょう！</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/php_js_month_addsub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoogleMapをカスタムしてグレースケール&amp;オリジナル画像マーカーの地図を作る方法</title>
		<link>https://taneppa.net/gmap_custom/</link>
		<comments>https://taneppa.net/gmap_custom/#comments</comments>
		<pubDate>Tue, 08 Sep 2015 02:43:40 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Web制作]]></category>
		<category><![CDATA[API]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2727</guid>
		<description><![CDATA[色々なサイトを見て回っていると、GoogleMapのデザインがグレースケールだったり、マーカーが普通と違うデザインになっていたり、カスタマイズされたGoogleMapを利用しているサイトをよく見かけますよね。今回は、GoogleMapをカスタマイズする方法を、グレースケール&#38;オリジナルマーカーのデザインを例としてご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<style><!--
#Map01, #Map02, #Map03 {
      width: 100%;
      height: 200px;
    }
    #Map01 img, #Map02 img, #Map03 img {
      max-width: none;
    }
--></style>
<p><span style="color: #ff0000;">※※※※※2017年6月 現在 Google Map APIの利用のために API KEY取得が必要になっております。</span></p>
<p>色々なサイトを見て回っていると、GoogleMapのデザインがグレースケールだったり、マーカーが普通と違うデザインになっていたり、カスタマイズされたGoogleMapを利用しているサイトをよく見かけますよね。</p>
<p>今回は、GoogleMapをカスタマイズする方法を、グレースケール&amp;オリジナルマーカーのデザインを例としてご紹介したいと思います。</p>
<h2>今回の目標</h2>
<p><img class="alignnone size-full wp-image-2738" alt="スクリーンショット 2015-08-31 13.46.22" src="https://taneppa.net/wp-content/uploads/2015/08/スクリーンショット-2015-08-31-13.46.22.png" width="930" height="198" /></p>
<p>今回の目標は、↑のようなグレースケールでマーカーにオリジナル画像を使った地図を表示することです。</p>
<p>では、まず基本から見て行きましょう！</p>
<h2 id="-">基本</h2>
<p>カスタマイズのためにはGoogleが提供しているGoogleMapApi v3を利用します。API?v3?ってなる人も多いと思いますが、とりあえずそういう名前なんだってスルーしてもらって構わないです。</p>
<p>では、とりあえず例として弊社を表示する地図を表示してみましょう。</p>
<h3 id="-">ソースコード</h3>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Google Map Custom Tutorial&lt;/title&gt;

  &lt;style&gt;
    /*
    地図を表示するための領域のスタイル指定
    サイズがしていされていないと地図が正常に表示されないので必ず指定しましょう
    */
    #map {
      width: 600px;
      height: 300px;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;!-- 地図を表示するための領域 --&gt;
  &lt;div id=&quot;map&quot;&gt;&lt;/div&gt;

  &lt;script&gt;
    function initMap() {

      // 地図の初期中心座標を指定
      var latLng = new google.maps.LatLng(34.683497, 135.4888082);

      var map = new google.maps.Map(
        // getElementByIdには、地図を表示するための領域に
        // 指定したidを設定すること。（今回は「map」）
        document.getElementById(&quot;map&quot;),
        {
          zoom: 18,  // 地図の初期拡大率
          center: latLng, // 先ほど設定した中心座標を設定
          scrollwheel: false  // マウスホイールで拡縮しなくなる
        }
      );

      // マーカーの設定
      var marker = new google.maps.Marker({
        position: latLng,
        map: map
      });
    }
  &lt;/script&gt;
  &lt;script src=&quot;https://maps.googleapis.com/maps/api/js?callback=initMap&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<h3 id="-">結果</h3>
<div id="Map01"></div>
<h3 id="-">説明</h3>
<p>結果を見てもらえばわかりますが、なんの変哲もないGoogleMapですね。こんな表示の仕方ならわざわざGoogleMapAPIを利用する必要もないのですが、これからカスタマイズする為の基本形になりますのでわりと重要です。</p>
<p>コメントでも注釈を入れていますが、注意点としては、</p>
<ul>
	<li>21行目：地図を表示する為の領域をdivタグ等で作り、idを指定しておく</li>
	<li>32行目：スクリプト内のgetElementByIdでは、地図表示領域のidを指定する</li>
	<li>7~16行目：地図表示領域にはサイズを指定する</li>
	<li>47行目：callback=~にはscriptタグで指定した関数名（今回は24行目の関数）を設定する</li>
</ul>
<p>また、デフォルトだと地図上でマウスホイールを回した際に地図が拡縮するのですが、ページをスクロールしようとしたのに地図が拡縮するといった事が頻繁に発生し、ものすごいストレスフルなので「scrollwheel: false」の指定でマウスホイールに反応しないようにしています。マウスホイールでの拡縮を残しておきたい場合はこの行は削除しましょう。</p>
<h2 id="-">マーカーにオリジナル画像を指定する</h2>
<p>次に、マーカーをオリジナル画像に変える方法を説明したいと思います。</p>
<h3 id="-">ソースコード</h3>
<p>scriptタグ内以外は先ほどと同じなので、scriptタグ部分のみを記載します。</p>
<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  function initMap() {

    // 地図の初期中心座標を指定
    var latLng = new google.maps.LatLng(34.683497, 135.4888082);

    var map = new google.maps.Map(
      // getElementByIdには、地図を表示するための領域に
      // 指定したidを設定すること。（今回は「map」）
      document.getElementById(&quot;map&quot;),
      {
        zoom: 18,  // 地図の初期拡大率
        center: latLng, // 先ほど設定した中心座標を設定
        scrollwheel: false  // マウスホイールで拡縮しなくなる
      }
    );

    /***********************************************************************
    変更部分ここから
    **********************************************************************/
    // マーカーの設定
    var markerImg = {
      url: '/img/marker.png'  // マーカーの画像ファイルを指定
    };
    var marker = new google.maps.Marker({
      position: latLng,
      map: map,
      icon: markerImg
    });
    /***********************************************************************
    変更部分ここまで
    **********************************************************************/

  }
&lt;/script&gt;</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<h3 id="-">結果</h3>
<div id="Map02"></div>
<p>マーカーの画像が変わりました。このカスタマイズは非常に簡単ですね。</p>
<h3 id="tips-retina-">Tips: オリジナルマーカーのRetina対応</h3>
<p>「marker.png」を実際に表示させる2倍のサイズで用意し、「var markerImg」の部分を以下のように変更すればRetina対応できます。</p>
<pre class="brush: xml; title: ; notranslate">var markerImg = {
  url: '/img/marker.png',
  scaledSize : new google.maps.Size(40, 46)
};</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<p>「scaledSize」では、画像のサイズの1/2サイズを指定しています。</p>
<h3 id="tips-">Tips: マーカーをクリックした時に特定の処理を行いたい。</h3>
<p>少し応用になるのですが、マーカーをクリックした際に特定の処理をする必要が出る場合が結構あります。</p>
<p>その場合は以下の様なコードを追加することで対応できます。</p>
<pre class="brush: xml; title: ; notranslate">marker.addListener(
  'click',
  function(){
    // ここにさせたい処理を入れる
    alert('marker clicked.')
  }
);</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<h2 id="-">地図をグレースケールにする</h2>
<p>では最後は、地図自体のデザイン変更を説明したいと思います。</p>
<p>今回はグレースケールにする方法を例とします。</p>
<h3 id="-">ソースコード</h3>
<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  var map;
  function initMap() {

    // マップ基本設定
    var latLng = new google.maps.LatLng(34.683497, 135.4888082);
    map = new google.maps.Map(
      document.getElementById(&quot;map&quot;),
      {
        zoom: 18,  // 拡大率
        center: latLng,
        scrollwheel: false  // マウスホイールで拡縮しなくなる
      }
    );

    // マーカー設定
    var markerImg = {
      url: '/img/marker.png'
    };
    var marker = new google.maps.Marker({
      position: latLng,
      map: map,
      icon: markerImg
    });

    /***********************************************************************
    変更部分ここから
    **********************************************************************/
    // 地図をグレースケールに
    var mapStyle = [
      {
          &quot;stylers&quot;: [
            { &quot;saturation&quot;: -100 }
          ]
      }
    ];
    var mapType = new google.maps.StyledMapType(mapStyle);
    map.mapTypes.set('GrayScaleMap', mapType);
    map.setMapTypeId('GrayScaleMap');
    /***********************************************************************
    変更部分ここまで
    **********************************************************************/

  }
&lt;/script&gt;</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<h3 id="-">結果</h3>
<div id="Map03"></div>
<h3 id="-">説明</h3>
<p>肝は、</p>
<pre class="brush: xml; title: ; notranslate">var mapStyle = [
  {
      &quot;stylers&quot;: [
        { &quot;saturation&quot;: -100 }
      ]
  }
];</pre><br /><br />
<p><br /><br /></p>
<p><br /><br /></p>
<p>の部分です、この部分で地図のデザインを指定しています。</p>
<p>「saturation」は「彩度」という意味で、この値によって色の鮮やかさが変わります。「-100」が一番小さい値で、この最低値を指定することで地図がグレースケールになります。</p>
<p>この設定ですが、<a href="http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html" target="_blank">Google Maps API Styled Maps Wizard</a>を利用することで視覚的に設定値を得ることが出来ます。</p>
<p><a href="https://taneppa.net/wp-content/uploads/2015/08/スクリーンショット-2015-08-31-13.08.07.png"><img class="alignnone size-full wp-image-2745" alt="スクリーンショット 2015-08-31 13.08.07" src="https://taneppa.net/wp-content/uploads/2015/08/スクリーンショット-2015-08-31-13.08.07.png" width="930" height="664" /></a></p>
<p>今回のグレースケールのパターン以外にも、設定次第で色々なスタイルを作成出来ますので、試してみましょう。</p>
<h2 id="-">以上</h2>
<p>以上で簡単なGoogleMapのカスタマイズが出来るようになりました。GoogleMapのカスタマイズは、特にデザイン性の高いサイトで必要になることが多いので是非出来るようになっておきましょう。</p>
<p>以上、たにっぱでした〜</p>

<script type="text/javascript">// <![CDATA[
function initMap() {

      // 地図の初期中心座標を指定
      var latLng = new google.maps.LatLng(34.683497, 135.4888082);
      var options = {
        zoom: 18,  // 地図の初期拡大率
        center: latLng, // 先ほど設定した中心座標を設定
        scrollwheel: false  // マウスホイールで拡縮しなくなる
      };

      /***********************************************************************
      Map01
      **********************************************************************/
      var map01 = new google.maps.Map(
        document.getElementById("Map01"), options
      );
      var marker01 = new google.maps.Marker({
        position: latLng,
        map: map01
      });

      /***********************************************************************
      Map02
      **********************************************************************/
      var map02 = new google.maps.Map(
        document.getElementById("Map02"), options
      );
      // マーカーの設定
      var markerImg = {
        url: 'https://taneppa.net/wp-content/uploads/2015/08/marker.png'
      };
      var marker02 = new google.maps.Marker({
        position: latLng,
        map: map02,
        icon: markerImg
      });

      /***********************************************************************
      Map03
      **********************************************************************/
      var map03 = new google.maps.Map(
        document.getElementById("Map03"), options
      );
      var marker03 = new google.maps.Marker({
        position: latLng,
        map: map03,
        icon: markerImg
      });
      var samplestyle = [
        {
            "stylers": [
              { "saturation": -100 }
            ]
        }
      ];
      var sampleMapType = new google.maps.StyledMapType(samplestyle);
      map03.mapTypes.set('GrayScaleMap', sampleMapType);
      map03.setMapTypeId('GrayScaleMap');

    }
// ]]&gt;</script><script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?callback=initMap">// <![CDATA[

// ]]&gt;
</script>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/gmap_custom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ブックマークレットで簡易チェック補助ツールを作ろう！</title>
		<link>https://taneppa.net/bookmarklet/</link>
		<comments>https://taneppa.net/bookmarklet/#comments</comments>
		<pubDate>Thu, 03 Sep 2015 01:47:37 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[効率化]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2723</guid>
		<description><![CDATA[ウェブサイト制作をやっていると、チェックするべき項目の多さからチェック漏れしてしまうことがよくありますよね？今回はそんなミスを見つけやすくするために、ブックマークレットを使用してチェックの補助ツールを簡単に作成する方法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>ウェブサイト制作をやっていると、チェックするべき項目の多さからチェック漏れしてしまうことがよくありますよね？例えば「aタグの反応する範囲が小さすぎる」なんてミスを自分はよくしてしまいます。</p>
<p>今回はそんなミスを見つけやすくするために、ブックマークレットを使用してチェックの補助ツールを簡単に作成する方法をご紹介したいと思います。</p>
<h2 id="-">ブックマークレット</h2>
<p>ブラウザはブックマークやURLバーから任意のjavascriptを実行することが出来ます。この時に実行するプログラムのことを「ブックマークレット」と言います。</p>
<h3 id="-">簡単な例</h3>
<p>URLバーに</p>

<pre class="brush: xml; title: ; notranslate">javascript:alert('ブックマークレットのテスト');</pre>

<p>と入れてEnterしてみて下さい。アラートが表示されたかと思います。</p>
<p>これが簡単なブックマークレットの例です。</p>
<p>ブックマークレットは</p>

<pre class="brush: xml; title: ; notranslate">javascript:(実行したいjavascriptコード)</pre>

<p>の形式でURLバー、もしくはブックマークから実行することが出来ます。</p>
<h2 id="a-">aタグの反応範囲を視覚的に表示</h2>
<p>それでは、ブックマークレットを利用して冒頭に挙げた「aタグの反応範囲が小さすぎる」というミスを防ぐために、aタグの大きさを視覚的に表示してくれるブックマークレットを作ってみましょう。</p>
<p>javascriptソースは非常に簡単で、以下のとおりです。</p>

<pre class="brush: xml; title: ; notranslate">(function(){
  $('a').css('outline', '1px solid red');
})();</pre>

<p>aタグにoutlineを設定することでaタグの範囲を視覚的に表示させてしまいます。borderと違ってoutlineはレイアウトに影響を与えないので、今回のようなデバッグ目的に最適です。</p>
<p>ブックマークレットは「javascript:」を先頭に付けるだけなので以下の様になります。</p>

<pre class="brush: xml; title: ; notranslate">javascript:(function(){
  $('a').css('outline', '1px solid red');
})();</pre>

<p>これをURLバーに貼り付けてEnterしてみてください。aタグの要素が赤く囲まれるはずです。（GoogleChrome/Macだとペーストする際に「javascript:」の記述が消えてしまったので、その場合は直接入力してください。）</p>
<h3 id="-jquery-">サイトがjQueryを読み込んでいない場合</h3>
<p>先ほどのソースコードはjQueryを使用しているため、このままだとjQueryを読み込んでいないサイトでは動作しません。</p>
<p>そのため、jQueryを読み込むコードを追加しましょう。ソースコードは以下のとおりです。</p>

<pre class="brush: xml; title: ; notranslate">(function(){
  function main() {
    $('a').css('outline', '1px solid red');
  }
  if (typeof jQuery === 'undefined') {
    var scrTmp = document.createElement('script');
    scrTmp.type = 'text/javascript';
    scrTmp.src = '//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js';
    document.body.appendChild(scrTmp);
    scrTmp.onload = main;
  } else {
    main();
  }
})();</pre>

<p>関数mainに実際に実行したい処理を記述し、jQueryがサイトに読み込まれていない場合は、jQueryを読み込んでから実行するようになっています。</p>
<p>このようにしておけばjQueryを読み込んでいないサイトでも使える汎用性の高いブックマークレットが作成できます。</p>
<h2 id="-">以上</h2>
<p>今回はaタグの視覚的な表示のみを例として挙げましたが、発想次第で色々なチェックが可能です。</p>
<p>例えば、</p>
<ul>
<li>モバイルサイトなのに奇数サイズの画像を使用していないか</li>
<li>imgタグのwidth/heightの指定が本来の画像サイズと異なっていないか<br />また、モバイルサイトの場合本来の画像サイズの半分のサイズの指定となっているか</li>
<li>1クリックでW3Cのチェックをする<br />（この場合はサーバーサイドのプログラムも少し必要かと思います）</li>
</ul>
<p>などが挙げられます。</p>
<p>チェック漏れは永遠の課題ではあるのですが、人間の注意力には限界があるので出来る限りツールやシステムに頼って、注意しなくてもミスが見つかるようにしたいですね。</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/bookmarklet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iscroll-probe.jsでiOS7以下でもスクロールイベントを取得</title>
		<link>https://taneppa.net/iscroll-probe/</link>
		<comments>https://taneppa.net/iscroll-probe/#comments</comments>
		<pubDate>Sun, 28 Jun 2015 23:28:57 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2556</guid>
		<description><![CDATA[iOS8では改善されましたが、iOS7以下でスクロールイベントを取得したいという状況も結構発生するかと思います。そこで今回はiscroll-probe.jsを使用して、スクロールイベントを擬似的に取得する方法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>以前はiOSではスクロール中はスクロールイベントが発生せず、スクロール終了時にイベントが発火されるという仕様でしたが、それがiOS8になり改善され、スクロール中にもイベントが発火されるようになりました。</p>
<p>ただ、まだiOS7使用者が無視できない割合で居ることから、案件の対応OSにiOS7が入ることも多く、iOS7以下でスクロールイベントを取得したいという状況も結構発生するかと思います。</p>
<p>そこで、今回はiscroll-probe.jsを使用して、スクロールイベントを擬似的に取得する方法をご紹介したいと思います。</p>
<h2 id="iscroll5-">iScroll5ライブラリの取得</h2>
<p><a href="http://iscrolljs.com/" target="_blank">iScroll 5, smooth scrolling for the web</a></p>
<p>上の公式サイトの「DOWNLOAD」リンクからライブラリ一式をダウンロードしてください。</p>
<p>中に多くのファイルが入っていますが、今回使用するのは「build」ディレクトリ内の「iscroll-probe.js」のみですので、「iscroll-probe.js」を適宜好きな場所へ配置してください。</p>
<h2 id="-">ライブラリの読み込み</h2>
<p>headタグ内で、iscroll-probe.jsを読み込んでください。</p>
<pre class="brush: xml; title: ; notranslate">&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;./common/js/lib/iscroll-probe.js&quot;&gt;&lt;/script&gt;</pre>
<p>今回は一部jQueryを使用するためjQueryも読み込んでいます。使用しない場合は読み込む必要はありません。</p>
<h2 id="html">HTML</h2>
<p>iscrollでは、コンテンツ全体を２つのラッパーで囲む必要があります。</p>
<p>今回は以下の様な構造にします。</p>
<pre class="brush: xml; title: ; notranslate">&lt;body onload=&quot;loaded()&quot;&gt;
  &lt;div id=&quot;WholeWrapper&quot;&gt;
    &lt;div id=&quot;WholeInner&quot;&gt;
      &lt;!-- コンテンツを記述 --&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;</pre>
<p>idやクラスには特に規定は無いので自由に付けて大丈夫です。</p>
<p>bodyタグに記述しているonloadコールバック関数に関しては後述します。</p>
<h2 id="css">CSS</h2>
<p>一番外側のラッパーに対しては下記のようなスタイルを当てる必要があります。</p>
<pre class="brush: xml; title: ; notranslate">#WholeWrapper {
  position: absolute;
  z-index: 1;
  top: 0;
  bottom: 0;
  left: 0;
  width: 100%;
  overflow: hidden;
}</pre>
<h2 id="javascript">javascript</h2>
<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  var myScroll;
  function updatePosition () {
    $(window).trigger('iscroll', {x: this.x, y: this.y});
  }

  // onloadイベント発生時にこの関数を呼び出す
  function loaded () {
    myScroll = new IScroll('#WholeWrapper', {
      deceleration: 0.004, // スクロール時の慣性の強さ
      probeType: 3,
      mouseWheel: true
    });

    myScroll.on('scroll', updatePosition);
    myScroll.on('scrollEnd', updatePosition);
  }

  document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

  $(function(){
    $(window).on('iscroll', function(e, pos){
      console.log(pos); // スクロール中にもスクロール位置が取得可能
    });
  });
&lt;/script&gt;</pre>
<p>IScroll初期化時に指定している「deceleration」は慣性の強さで、この値が大きいほどスクロールがすぐ停止するようになります。初期値は「0.0006」なのですが、この値だとiOS Safariの慣性と比較して慣性が異常に強く、スクロールしすぎてしまうので適宜値を調整しましょう。</p>
<h2 id="-">スクロール系関数</h2>
<p>iScrollには様々な関数が用意されているのですが、その中でも一番使用頻度が多いと思われるスクロール系関数を紹介したいと思います。</p>
<h3 id="scrollto-x-y-time-easing-">scrollTo(x, y, time, easing)</h3>
<p>(x, y)地点へtimeミリ秒かけてスクロールします。</p>
<pre class="brush: xml; title: ; notranslate">myScroll.scrollTo(0, -1000, 500, IScroll.utils.ease.elastic);</pre>
<p>easingはスクロールの際の加減速の仕方のバリエーションで、quadratic,circular,back,bounce,elasticの5パターン存在しています。</p>
<h3 id="scrolltoelement-el-time-offsetx-offsety-easing-">scrollToElement(el, time, offsetX, offsetY, easing)</h3>
<p>要素elまでtimeミリ秒かけてスクロールします。その際、止まる位置はoffsetの指定によってずらすことが可能です。easingはscrollToと同じです。</p>
<pre class="brush: xml; title: ; notranslate">myScroll.scrollToElement(document.getElementById('TargetId'), 1000);</pre>
<p>iScrollは構造上アンカーリンクが効かなくなってしまうので、代わりにこのscrollToElementを使用して機能を実装する必要があります。</p>
<p>他にも、現在のスクロール位置から相対的に移動するscrollByが存在しています。</p>

<h2 id="-">以上</h2>
<p>これで一応iOS7以下でもスクロールイベントを取得出来るようにはなるのですが、前述のとおり、iScrollは内側のラッパーをtranslateにより移動させることにより擬似的にスクロールイベントを再現している仕組みのため、アンカーリンクが正常に機能しません。他にも正常に動作しなくなる、または通常より実装に工数が大幅にかかってしまう機能がある可能性が高いので、使用にはかなり気をつける必要があります。</p>
<p>また、iOS7では動作することを確認しましたが、iOS7未満やAndroidでは動作未確認ですのでご注意ください。</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/iscroll-probe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript(jQuery)でメディアクエリを判定する方法(IE9対応)</title>
		<link>https://taneppa.net/mq-judge/</link>
		<comments>https://taneppa.net/mq-judge/#comments</comments>
		<pubDate>Sun, 14 Jun 2015 23:27:16 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2551</guid>
		<description><![CDATA[レスポンシブサイトを作る際、レイアウト切り替わり時に特定の処理を実行する必要が頻繁に出てくるのですが、単純にjQueryでブラウザ幅を取得して判断する方法ではなかなか上手く行かない場合が多いです。今回は、シンプル・確実に現在の表示レイアウトを判断する方法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>レスポンシブウェブデザインなWEBサイトを作る際、レイアウト切り替わり時に特定の処理を実行する必要が頻繁に出てくるのですが、単純にjQueryでブラウザ幅を取得して判断する方法ではなかなか上手く行かない場合が多いです。</p>
<p>そこで今回は、シンプル・確実に現在の表示レイアウトを判断する方法をご紹介したいと思います。</p>
<h2 id="-">現在の表示レイアウトの判断方法</h2>
<p>どのように判断するかというと、スマホ時（もしくはPCレイアウト時）のみに出現する要素を目印として、それが表示されているのかされていないのかを元に判断します。<br />よく目印として使うのはスマホレイアウト時にのみ出るハンバーガーボタン（ナビ開閉のボタン）ですね。</p>
<p>具体例は以下のとおりです。</p>
<pre class="brush: xml; title: ; notranslate">&lt;style&gt;
  #MqMark {
    display: block;
  }
  @media screen and (max-width: 640px) {
    #MqMark {
      display: none;
    }
  }
&lt;/style&gt;
&lt;div id=&quot;MqMark&quot;&gt;&lt;/div&gt;</pre>
<p>上のようなPCレイアウト時のみ出現する要素を目印とします（そのような目印がない場合は作ってしまいましょう）。</p>
<p>javascript部分は以下のようになります。</p>
<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  $(function() {
    $(window).on('resize', function(){
      if ($('#MqMark').is(':visible')) {
        // PCレイアウト
        console.log('pc');
      } else {
        // スマホレイアウト
        console.log('sp');
      }
    });
  });
&lt;/script&gt;</pre>
<p>この方法だと現在のレイアウトの状態を正確に取得出来るのでオススメです。</p>
<h2 id="-">他の方法</h2>
<p>他の方法として「window.matchMedia」を使用する方法があります。</p>
<pre class="brush: xml; title: ; notranslate">if (window.matchMedia('screen and (max-width:640px)').matches) {
  // スマホレイアウト
  console.log('sp');
} else {
  // PCレイアウト
  console.log('pc');
}</pre>
<h2 id="-">以上</h2>
<p>これからレスポンシブウェブデザインでjavascriptを書くという方や、これまでwidthを使って判定していたという方は是非今回ご紹介した方法を使ってみてください。</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/mq-judge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQueryでチェックボックスやラジオボタンの状態を取得する</title>
		<link>https://taneppa.net/jquery-prop/</link>
		<comments>https://taneppa.net/jquery-prop/#comments</comments>
		<pubDate>Mon, 08 Jun 2015 01:19:45 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2521</guid>
		<description><![CDATA[jQueryでチェックボックスやラジオボタンの状態を取得しようとする時、attr関数では上手く取得することが出来ません。そこで今回はjQueryでのチェックボックスやラジオボタンの状態を取得する方法に関して説明したいと思います。]]></description>
				<content:encoded><![CDATA[<p>jQueryでチェックボックスやラジオボタンの状態を取得しようとする時、最初は</p>
<pre class="brush: xml; title: ; notranslate">$('#TargetID').attr('checked')</pre>

<p>で取得しようとしたのですが、この取得方法には問題がありうまく状態を取得することが出来ませんでした。</p>
<p>そこで、今回はjQueryでのチェックボックスやラジオボタンの状態を取得する方法に関して説明したいと思います。</p>
<h2 id="-">取得方法</h2>
<p>まず、結論として取得する方法を紹介します。</p>
<p>方法は下記の2通りです。</p>
<pre class="brush: xml; title: ; notranslate">$('#TargetID').prop('checked')</pre>
<pre class="brush: xml; title: ; notranslate">$('#TargetID').is(':checked')</pre>
<p>両方共、チェックされていればtrue、チェックされていなければfalseが返却されます。</p>
<p>個人的には後者の方が好みですが、どちらでも問題ありません。</p>
<p>また、checkedだけでなくselectedやdisabledといったプロパティに関しても、attrではなくpropやisを使った方法で取得しましょう。</p>
<h2 id="-">実例</h2>
<p>よくあるパターンとしては、フォームを送信する際、「同意する」チェックボックスにチェックが入っていない状況では送信ボタンが押せないようにするというものを例として挙げたいと思います。</p>
<h3 id="html">HTML</h3>
<pre class="brush: xml; title: ; notranslate">&lt;input id=&quot;AgreeBtn&quot; type=&quot;checkbox&quot;&gt;同意する&lt;br&gt;
&lt;input id=&quot;SubmitBtn&quot; type=&quot;submit&quot; disabled&gt;</pre>

<h3>JavaScript</h3>
<pre class="brush: xml; title: ; notranslate">$('#AgreeBtn').on('change', function(){
  if ($(this).is(':checked')) {
    $('#SubmitBtn').prop('disabled', false);
  } else {
    $('#SubmitBtn').prop('disabled', true);
  }
});</pre>
<h3>動作例</h3>
<script type="text/javascript">// <![CDATA[
$(function() {
    $('#AgreeBtn').on('change', function(){
      if ($(this).prop('checked') == true) {
        $('#SubmitBtn').prop('disabled', false);
      } else {
        $('#SubmitBtn').prop('disabled', true);
      }
    });
  });
// ]]&gt;</script>
<p><input id="AgreeBtn" type="checkbox" />同意する<br /> <input id="SubmitBtn" type="submit" disabled="disabled" /></p>
<h2 id="attr-">attrによる取得の問題点</h2>
<p>これから先は正直知らなくてもあまり問題が無い内容なのですが、何故attrで状態を取得出来ないのか気になり調べてみたのでその内容を書いておきたいと思います。</p>
<pre class="brush: xml; title: ; notranslate">$('#TargetID').attr('checked')</pre>
<p>冒頭でも出したこのコードですが、一見普通に使えそうに見えますが、かなり問題があります。</p>
<p>というのも、checkedの取得にattrを使用した場合、返却値は「checked」か「undefined」になり、さらに対象がチェックされている状態でも状況によってはundefinedが返却されます。つまるところ全く使い物になりません。</p>
<p>これは</p>
<ul>
	<li>attrがDOMの属性を元に値を取得する点</li>
	<li>checkboxにチェックを入れても、DOMの属性は変わらない点</li>
</ul>
<p>この2点が理由です。</p>
<h3 id="attr-dom-">attrがDOMの属性を元に取得する</h3>
<p>DOMの属性っていうのは例えば、</p>
<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;about.html&quot;&gt;&lt;/a&gt;</pre>
<p>このaタグでいうとhrefが属性で、その値がabout.htmlですね。</p>
<p>では、今回問題になっているcheckboxの場合</p>
<pre class="brush: xml; title: ; notranslate">&lt;input type=&quot;checkbox&quot; checked&gt;</pre>
<p>となるのですが、このHTMLは以下の内容と同じ意味を持ちます。</p>
<pre class="brush: xml; title: ; notranslate">&lt;input type=&quot;checkbox&quot; checked=&quot;checked&quot;&gt;</pre>
<p>つまり、HTMLにcheckedを指定することは「checked属性にcheckedを指定」したのと同じ意味です。なのでattrでcheckedが帰ってくるわけですね。</p>
<p>逆にcheckedの指定がない場合は、そもそもchecked属性自体がDOMに存在していないのでundefinedが返却されることとなります。</p>
<h3 id="checkbox-dom-">checkboxにチェックを入れてもDOMの属性は変わらない</h3>
<p><a href="https://taneppa.net/wp-content/uploads/2015/05/スクリーンショット-2015-05-14-13.55.301.png"><img class="alignnone size-full wp-image-2531" alt="スクリーンショット 2015-05-14 13.55.30" src="https://taneppa.net/wp-content/uploads/2015/05/スクリーンショット-2015-05-14-13.55.301.png" width="320" height="320" /></a></p>
<p>この画像はチェックボックスにチェックを入れた時のDOMの状態を開発ツールで表示したものなのですが、見てわかる通りチェックボックスにチェックが入っているのにcheckboxのDOMにはchecked属性が追加されていません。</p>
<p>attrはDOMの属性を引っ張ってくるので、今回のパターンのようにDOMの状態が変わらないものに関してはattrでは状態を取得しようが無いということです。</p>
<h2 id="-">以上</h2>
<p>propやisなんて関数は自分も最初は存在自体を知らなかったのですが、今回のように無いと困ることもあるのでぜひ覚えておきましょう。</p>
<p>以上、たにっぱでした〜</p>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/jquery-prop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQueryでのサイズ、座標の取得方法まとめ</title>
		<link>https://taneppa.net/jquery-size/</link>
		<comments>https://taneppa.net/jquery-size/#comments</comments>
		<pubDate>Sun, 31 May 2015 23:30:35 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2479</guid>
		<description><![CDATA[jQueryを使っていると、頻繁に要素のサイズや位置を取得する機会があります。サイズや座標を取得する関数は複数あって「どれがどこのサイズ、座標を取得するの？」ってごっちゃになりがちなので、今回はサイズ、位置関係のそれぞれのjQuery関数の違いなどをまとめて紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>jQueryを使っていると、頻繁に要素のサイズや位置を取得する機会があります。</p>
<p>サイズや座標を取得する関数は複数あって「どれがどこのサイズ、座標を取得するの？」ってごっちゃになりがちなので、今回はサイズ、位置関係のそれぞれのjQuery関数の違いなどをまとめて紹介したいと思います。</p>
<h2 id="-">目次</h2>
<ul>
<li><a class="scroll" href="#TargetAnchor1">サイズ取得関係の関数</a><ul>
<li><a class="scroll" href="#TargetAnchor1-1">サイズ取得の基本</a></li>
<li><a class="scroll" href="#TargetAnchor1-2">ページ全体のサイズやブラウザサイズを取得したい</a></li>
</ul>
</li>
<li><a class="scroll" href="#TargetAnchor2">要素の座標の取得方法</a><ul>
<li><a class="scroll" href="#TargetAnchor2-1">座標取得の基本</a></li>
<li><a class="scroll" href="#TargetAnchor2-2">番外編：offsetParentってoffsetと関係あるの？</a></li>
</ul>
</li>
<li><a class="scroll" href="#TargetAnchor3">スクロールした距離を取得する方法</a></li>
</ul>
<div id="TargetAnchor1"></div>

<h2 id="-">サイズ取得関係の関数</h2>
<div id="TargetAnchor1-1"></div>

<h3 id="-">サイズ取得の基本</h3>
<p>サイズの取得には、以下の4つの方法があります。</p>
<table>
<thead>
<tr>
<th style="text-align:left">方法</th>
<th style="text-align:left">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">width()<br />height()</td>
<td style="text-align:left">paddingを除いた内側のサイズを取得</td>
</tr>
<tr>
<td style="text-align:left">innerWidth()<br />innerHeight()</td>
<td style="text-align:left">paddingを含んだサイズを取得</td>
</tr>
<tr>
<td style="text-align:left">outerWidth()<br />outerHeight()</td>
<td style="text-align:left">paddingとborderを含んだサイズを取得</td>
</tr>
<tr>
<td style="text-align:left">outerWidth(true)<br />outerHeight(true)</td>
<td style="text-align:left">marginまで含んだサイズを取得</td>
</tr>
</tbody>
</table>
<p>各方法を画像でわかりやすくするとこんな感じです。</p>

<p><a href="https://taneppa.net/wp-content/uploads/2015/04/size1.png"><img src="https://taneppa.net/wp-content/uploads/2015/04/size1.png" alt="size1" width="769" height="528" class="alignnone size-full wp-image-2488" /></a></p>

<p>ここで注意しないといけないのは、width()はcssで設定したwidthとは違うという点です。</p>
<p>どういうことか、実例を示します。</p>

<pre class="brush: xml; title: ; notranslate">&lt;style&gt;
  #Size1Box {
    width: 100px;
    height: 100px;
    padding: 20px;
    margin: 10px;
    border: 5px solid black;
    background: red;
    box-sizing: border-box;
  }
&lt;/style&gt;</pre>

<p>このようにborder-boxを指定した要素を用意します。この要素の各サイズを出力すると下記のようになります。</p>

<script>
  $(function() {
    $box = $('#Size1Box');

    $('#Size1Output').html(outputSize($box));

    function outputSize($target) {
      var output = '';
      output += 'width: ' + $target.width() + '<br />';
      output += 'innerWidth: ' + $target.innerWidth() + '<br />';
      output += 'outerWidth(): ' + $target.outerWidth() + '<br />';
      output += 'outerWidth(true): ' + $target.outerWidth(true);

      return output;
    }
  });
</script>

<style>
  #Size1Box {
    width: 100px;
    height: 100px;
    padding: 20px;
    margin: 10px;
    border: 5px solid black;
    background: red;
    box-sizing: border-box;
  }
</style>

<div id="Size1Box"></div>
<p id="Size1Output"></p>

<p>このように、スタイルでは「width: 100px」と指定したのに、width()の出力値が50となっているはずです。<br />これは、「box-sizing: border-box;」により「中身の幅 + padding + border = cssのwidth」となり、jQueryのwidth関数は「中身の幅」を返すためcssのwidthからpaddingとborder分差し引いた50pxが返されるという事です。</p>

<p>jQueryのwidth関数は「中身の幅」を取得するための関数ということに注意しましょう。<br />cssで設定されたwidthの値を取得したい場合は、</p>

<pre class="brush: xml; title: ; notranslate">$('#IdName').css('width');</pre>

というようにcss関数で取得しましょう。

<div id="TargetAnchor1-2"></div>

<h3 id="-">ページ全体のサイズやブラウザサイズを取得したい</h3>
<p>document,windowを使用すれば可能です。</p>
<p>ページ全体のサイズは</p>

<pre class="brush: xml; title: ; notranslate">$(document).width();
$(document).height();</pre>

<p>ブラウザサイズは</p>

<pre class="brush: xml; title: ; notranslate">$(window).width();
$(window).height();</pre>

<p>で取得出来ます。（document,windowに対するinnerWidthやouterWidthは、widthと同じ値を返します。）</p>
<div id="TargetAnchor2"></div>

<h2 id="-">要素の座標の取得方法</h2>
<div id="TargetAnchor2-1"></div>

<h3 id="-">座標取得の基本</h3>
<table>
<thead>
<tr>
<th style="text-align:left">方法</th>
<th style="text-align:left">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">offset()</td>
<td style="text-align:left">ページ左上に対する座標を取得</td>
</tr>
<tr>
<td style="text-align:left">position()</td>
<td style="text-align:left">cssのpositionの基準となる親から見た座標を取得</td>
</tr>
</tbody>
</table>
<p>cssのpositionはまだよくわからない、という方は、<a href="/position/">CSS positionを使ってみよう！</a>や、<a href="/position_property/">見ながら覚えよう！positionプロパティ「absolute」と「relative」についてのお話</a>を参考に読んでみてください。</p>

<p><a href="https://taneppa.net/wp-content/uploads/2015/04/offset.png"><img src="https://taneppa.net/wp-content/uploads/2015/04/offset-448x500.png" alt="offset" width="448" height="500" class="alignnone size-medium wp-image-2487" /></a></p>

<p>offset()とposition()は、</p>

<pre class="brush: xml; title: ; notranslate">{
  top: xxx,
  left: xxx
}</pre>

<p>という形の連想配列を返すので、topかleftのどちらかだけ必要、という場合は</p>

<pre class="brush: xml; title: ; notranslate">var topOffset =  $('#IdName').offset().top;
var leftOffset = $('#IdName').offset().left;</pre>

<p>というような書き方で片方だけを取得出来ます。</p>
<div id="TargetAnchor2-2"></div>

<h3 id="-offsetparent-offset-">番外編：offsetParentってoffsetと関係あるの？</h3>
<p>答え：ないです。</p>
<p>offsetParentは、positionが設定されている先祖要素の中で一番近い物を取得する関数です。</p>
<p>名前からoffsetと関係がありそうに見えてしまいますが、どちらかというと関係あるのはpositionですね。</p>
<div id="TargetAnchor3"></div>

<h2 id="-">スクロールした距離を取得する方法</h2>
<p>どれだけページをスクロールしたかは「scrollTop」関数を使用します</p>

<pre class="brush: xml; title: ; notranslate">var vScrollDistance = $(window).scrollTop();</pre>

<p>また、横方向にどれだけスクロールしたかも「scrollLeft」関数で取得出来ます。</p>

<pre class="brush: xml; title: ; notranslate">var hScrollDistance = $(window).scrollLeft();</pre>

<p>それぞれは下記のようなイメージです。</p>

<p><a href="https://taneppa.net/wp-content/uploads/2015/04/scroll.png"><img src="https://taneppa.net/wp-content/uploads/2015/04/scroll-448x500.png" alt="scroll" width="448" height="500" class="alignnone size-medium wp-image-2486" /></a></p>

<h2 id="-">以上</h2>
<p>以上がjQueryでのサイズ、座標取得方法のまとめでした。</p>
<p>サイズの取得なんかはwidthとinnerWidthがごっちゃになりがちなので注意しておきましょう。</p>
<p>以上、たにっぱでした〜。</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/jquery-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery]イベントのバブリングって何？</title>
		<link>https://taneppa.net/jquery-bubbling/</link>
		<comments>https://taneppa.net/jquery-bubbling/#comments</comments>
		<pubDate>Mon, 25 May 2015 23:56:20 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2460</guid>
		<description><![CDATA[javascriptにはイベントのバブリングという概念があります。この概念を知らないと、理解不能な状況に陥る事があるので、今回はバブリングを紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>javascriptにはイベントのバブリングという概念があります。</p>

<p>この概念を知らないと、理解不能な状況に陥る事があるので、今回はバブリングを紹介したいと思います。</p>

<h2>バブリングとは？</h2>

<p>バブリングとは、「ある要素でイベントが発生した際に、親や祖先要素にも同じイベントが発生する事」です。</p>

<a href="https://taneppa.net/wp-content/uploads/2015/04/bubbling1.png"><img src="https://taneppa.net/wp-content/uploads/2015/04/bubbling1-493x500.png" alt="bubbling1" width="493" height="500" class="alignnone size-medium wp-image-2462" /></a>

<p>上の画像のように、子要素をクリックしてclickイベントが発生すると、その親要素、祖先要素でもclickイベントが発生します。</p>

<h3>具体例</h3>

<p>以下の例では、表示されている3つのボックスが親子関係で、それぞれにclickイベントを設定し、クリックするとアラートを出すようにしています。</p>

<style>
  .rectBox {
    width : 50%;
    height: 50%;
  }
  .rectBox.root {
    width : 200px;
    height: 200px;
  }
  .rectBox.black {
    background-color: #2c3e50;
  }
  .rectBox.red {
    background-color: #c0392b;
  }
  .rectBox.blue {
    background-color: #3498db;
  }
</style>

<script>
  $(function() {
    var $ancestor = $('#AncestorBox');
    var $parent   = $('#ParentBox');
    var $child    = $('#ChildBox');

    $ancestor.on('click', function(e) {
      alert('I am ancestor');
    });

    $parent.on('click', function(e) {
      alert('I am parent');
    });

    $child.on('click', function(e) {
      alert('I am child');
    });

  });
</script>

<div id="AncestorBox" class="rectBox root black">
  <div id="ParentBox" class="rectBox red">
    <div id="ChildBox" class="rectBox blue"></div>
  </div>
</div>

<p>ここで、ChildBox(青色のボックス)をクリックすると、ChildBoxのアラートだけでなく、ParentBoxやAncestorBoxのアラートも発生するはずです、これがイベントのバブリングの実例です。</p>

<pre class="brush: xml; title: ; notranslate">&lt;style&gt;
  .rectBox {
    width : 50%;
    height: 50%;
  }
  .rectBox.root {
    width : 200px;
    height: 200px;
  }
  .rectBox.black {
    background-color: #2c3e50;
  }
  .rectBox.red {
    background-color: #c0392b;
  }
  .rectBox.blue {
    background-color: #3498db;
  }
&lt;/style&gt;

&lt;script&gt;
  $(function() {
    var $ancestor = $('#AncestorBox');
    var $parent   = $('#ParentBox');
    var $child    = $('#ChildBox');

    $ancestor.on('click', function(e) {
      alert('I am ancestor');
    });

    $parent.on('click', function(e) {
      alert('I am parent');
    });

    $child.on('click', function(e) {
      alert('I am child');
    });

  });
&lt;/script&gt;

&lt;div id=&quot;AncestorBox&quot; class=&quot;rectBox root black&quot;&gt;
  &lt;div id=&quot;ParentBox&quot; class=&quot;rectBox red&quot;&gt;
    &lt;div id=&quot;ChildBox&quot; class=&quot;rectBox blue&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>

<h3>stopPropagationによるバブリングのストップ</h3>

<p>この親にもイベントが発生していくバブリングの仕組みが都合が良い場合もあるのですが、問題がある場合も度々発生します。</p>

<p>その場合は、stopPropagationによりバブリングをストップさせることが可能です。</p>

<a href="https://taneppa.net/wp-content/uploads/2015/04/bubbling2.png"><img src="https://taneppa.net/wp-content/uploads/2015/04/bubbling2-493x500.png" alt="bubbling2" width="493" height="500" class="alignnone size-medium wp-image-2463" /></a>

<p>先ほどのバブリングの例を、stopPropagationを使用してバブリングしないようにした例は以下の通りです。</p>

<script>
  $(function() {
    var $ancestor = $('#AncestorBox2');
    var $parent   = $('#ParentBox2');
    var $child    = $('#ChildBox2');

    $ancestor.on('click', function(e) {
      alert('I am ancestor');
e.stopPropagation();
    });

    $parent.on('click', function(e) {
      alert('I am parent');
e.stopPropagation();
    });

    $child.on('click', function(e) {
      alert('I am child');
e.stopPropagation();
    });

  });
</script>

<div id="AncestorBox2" class="rectBox root black">
  <div id="ParentBox2" class="rectBox red">
    <div id="ChildBox2" class="rectBox blue"></div>
  </div>
</div>

<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  $(function() {
    var $ancestor = $('#AncestorBox');
    var $parent   = $('#ParentBox');
    var $child    = $('#ChildBox');

    $ancestor.on('click', function(e) {
      alert('I am ancestor');
      e.stopPropagation(); // 追加
    });

    $parent.on('click', function(e) {
      alert('I am parent');
      e.stopPropagation(); // 追加
    });

    $child.on('click', function(e) {
      alert('I am child');
      e.stopPropagation(); // 追加
    });

  });
&lt;/script&gt;</pre>

<p>今回のパターンだと、ChildBoxをクリックした場合でもアラートは１回しか発生しなかったはずです。</p>

<p>また、stopPropagation以外に「return false」でもバブリングをストップすることが可能です。</p>

<p>「return false」にはバブリングのストップ以外に、要素本来のイベントの動作（aタグの場合clickイベントに反応してリンク先に飛ぶ、等）をしないようにする効果もあるので、状況に応じて使い分けましょう。</p>

<h2>mouseover/mouseoutとmouseenter/mouseleaveの違い</h2>

<p>要素上にマウスが乗った・離れた際に発生するmouseover/mouseout及びmouseenter/mouseleaveイベントの違いの一つはイベントのバブリングが発生するか否かです。</p>

<p>mouseover/mouseoutイベントではバブリングが発生しますが、mouseenter/mouseleaveイベントはバブリングが発生しません。</p>

<h3>具体例</h3>

<p>実際に問題が発生する具体例として、「赤い領域にマウスが乗ったら、領域が一回点滅するような演出」を実装する必要が出てきたとします。</p>

<p>何も考えずにmouseoverを使用した場合、下記のような実装をしてしまうと思います。</p>

<script>
  $(function() {
    $('#MouseWrapper .parentBox').on('mouseover', function(e) {
      $(this).animate({
        opacity: '0.5'
      }, 'fast').animate({
        opacity: '1'
      }, 'fast');
    });
  });
</script>

<style>
  #MouseWrapper .parentBox {
    width: 100px;
    height: 100px;
    padding: 50px;
    background-color: #c0392b;
  }
  #MouseWrapper .childBox {
    width: 100px;
    height: 100px;
    background-color: #2c3e50;
  }
</style>

<div id="MouseWrapper">
  <div class="parentBox">
    <div class="childBox"></div>
  </div>
</div>

<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
  $(function() {
    $('#MouseWrapper .parentBox').on('mouseover', function(e) {
      $(this).animate({
        opacity: '0.5'
      }, 'fast').animate({
        opacity: '1'
      }, 'fast');
    });
  });
&lt;/script&gt;

&lt;style&gt;
  #MouseWrapper .parentBox {
    width: 100px;
    height: 100px;
    padding: 50px;
    background-color: #c0392b;
  }
  #MouseWrapper .childBox {
    width: 100px;
    height: 100px;
    background-color: #2c3e50;
  }
&lt;/style&gt;

&lt;div id=&quot;MouseWrapper&quot;&gt;
  &lt;div class=&quot;parentBox&quot;&gt;
    &lt;div class=&quot;childBox&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>

<p>この場合、赤い領域にマウスを乗せたときにちゃんと点滅しますが、何故か黒い領域にマウスが乗った時も点滅してしまいます。</p>

<p>この原因は、mouseover/mouseoutがバブリングを発生させるため、黒い領域に対してmouseoverイベントが発生した際に、親要素である赤い領域にもmouseoverイベントが発生してしまうためです。</p>

<p>他にも、mouseover/mouseoutイベントは子要素から親要素にマウスが移動した際にもmouseoverイベントが発生してしまうため、その時にも点滅してしまいます。</p>

<p>mouseover/mouseoutのようなマウスホバーイベントに関してバブリングが発生してほしい状況もあるかもしれませんが、どちらかというとバブリングしてしまうことによって問題が発生してしまう事が多いためmouseenter/mouseleaveを基本的には使用した方が良いと思います。</p>

<h2>以上</h2>

<p>バブリングは結構ややこしい概念なのですが、理解しておかないと原因がわからない挙動が発生したりして解決に時間がかかってしまうことがありそうなので、出来るだけ早く理解しておいた方がいいかと思いました。</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/jquery-bubbling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
