<?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; tanippa!</title>
	<atom:link href="https://taneppa.net/author/futappa_tani/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>本当に簡単な例から学ぶレスポンシブコーディング</title>
		<link>https://taneppa.net/resp_pattern/</link>
		<comments>https://taneppa.net/resp_pattern/#comments</comments>
		<pubDate>Wed, 31 Aug 2016 05:25:32 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3090</guid>
		<description><![CDATA[レスポンシブコーディングに関しては苦手意識を持っている人も多いようですが、根本的な仕組みはものすごく単純で、後はそれを応用して行くだけですので実際に手を動かしながら勉強すればすぐ身につくかと思います。今回はレスポンシブコーディングの中でも単純な基本パターンをいくつかご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>「レスポンシブウェブデザイン」が流行りだしてからずいぶん経ちますね。一時は「一過性の流行りかな？」と思っていたのですが相変わらず需要は多いみたいです。</p>
<p>レスポンシブコーディングに関しては苦手意識を持っている人も多いようですが、根本的な仕組みはものすごく単純で、後はそれを応用して行くだけですので実際に手を動かしながら勉強すればすぐ身につくかと思います。</p>
<p>そこで今回はレスポンシブコーディングの中でも単純な基本パターンをいくつかご紹介したいと思います。</p>


<h2 id="-">基礎知識</h2>
<p>まずは以下のサンプルを見てください。</p>
<p><a target="_blank" href="https://taneppa.net/sample_html/resp_pattern/sample00.html">サンプル</a></p>
<p>このサンプルを開いた状態でブラウザの幅を縮めたり広げたりすると色が変わりませんでしたか？</p>
<p>この変化はレスポンシブサイトを作るために必須である「メディアクエリ」の機能を利用し行っています。</p>
<p>実際にどのようなCSSを書いたかというと以下のとおりです。</p>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅が768px以上ならここの記述が有効になる
**********************************************************************/
@media only screen and (min-width: 768px) {
  body {
    background: #000000;
  }
}
/***********************************************************************
ブラウザの幅が767px以下ならここの記述が有効になる
**********************************************************************/
@media only screen and (max-width: 767px) {
  body {
    background: #ff0000;
  }
}</pre>
<p>キモは</p>
<pre class="brush: xml; title: ; notranslate">@media only screen and (~) {
}</pre>
<p>の部分です。この部分が「メディアクエリ」と呼ばれているものです。</p>
<p>「メディアクエリの括弧内に書いた条件を満たしている時のみ、記述したCSSが有効になる」というような効果を持っています。</p>
<p>括弧内に書ける条件は色々あるのですが、主に使うのは「min-width」と「max-width」です。</p>
<p>「min-width: ~px」と書くと「ブラウザの幅が~px以上」の時にCSSが有効になり、「max-width: ~px」と書くと「ブラウザの幅が~px以下」の時にCSSが有効になります。</p>
<p>なのでブラウザの幅が767px以下の時に背景が赤くなって、768px以上の時に黒くなったわけですね。</p>
<p>レスポンシブはこのメディアクエリの「ブラウザの幅によって特定のCSSを有効/無効にする」という特徴が全てで、あらゆるレイアウトの変化をこの特徴を利用して実現します。（もちろん実現できない変化も多いですが…）</p>
<h2 id="-pc-sp-">実例</h2>
<p>それでは、先ほどの基礎知識を踏まえた上で実際の例を見ていきましょう。</p>
<p>これから先の例は、レスポンシブサイトでも簡単な「PCレイアウト」と「SPレイアウト」のみのタブレットレイアウトが無いパターンでご紹介したいと思います。<br />（実際の案件でもこのパターンが多いです。）</p>
<p>具体的には「ブラウザの幅が768px以上でPCレイアウト」「ブラウザの幅が767px以下でSPレイアウト」「PCレイアウトのコンテンツの幅は960pxなので、768~959pxで横スクロールバーが出る」パターンです。</p>
<h2 id="-pc-sp-">パターン①「PC: 写真左+テキスト右」⇔「SP: 写真上+テキスト下」</h2>
<p><a target="_blank" href="https://taneppa.net/sample_html/resp_pattern/sample01.html">サンプル</a></p>
<p>一番よく見るのがこのパターンです。PCサイトでは写真とテキストを横並びにして、SPサイトだと縦並びにしているパターンですね。</p>
<p>これは以下の様なHTML/CSSを書いています。</p>
<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;row clearfix&quot;&gt;
  &lt;p class=&quot;photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;txt&quot;&gt;テキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;
&lt;!-- /.row --&gt;</pre>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅が768px以上
**********************************************************************/
@media only screen and (min-width: 768px) {
  .row .photo {
    float: left;
    width: 460px;
  }
  .row .txt {
    float: right;
    width: 460px;
  }
}
/***********************************************************************
ブラウザの幅が767px以下
**********************************************************************/
@media only screen and (max-width: 767px) {
  .row .photo {
    margin-bottom: 10px;
    text-align: center;
  }
}</pre>
<p>PCレイアウトはよくあるfloatを使った横並びパターンですね（「floatがまだよくわからない」という方は<a target="_blank" href="https://taneppa.net/float/">こちら</a>の記事がオススメです）。</p>
<p>先ほどの説明の通り</p>
<pre class="brush: xml; title: ; notranslate">@media only screen and (min-width: 768px) {
  ~
}</pre>
<p>で囲まれているCSSは「ブラウザの幅が768px以上」のときのみ有効なので、「ブラウザの幅が767px以下」の時はfloatの指定もwidthの指定も無かったことになります。</p>
<p>なのでSPレイアウトでは写真とテキストが横並びにならず、縦にならんでいるわけです。</p>
<h2 id="-pc-sp-">パターン②「PC: 写真右+テキスト左」⇔「SP: 写真上+テキスト下」</h2>
<p>さて、次は先ほどと似ていますが、PCレイアウトの時の写真とテキストの並びが逆のパターンです。</p>
<p><a target="_blank" href="https://taneppa.net/sample_html/resp_pattern/sample02.html">サンプル</a></p>
<p>この場合のHTML/CSSは以下のようになります。</p>
<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;row clearfix&quot;&gt;
  &lt;p class=&quot;photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;txt&quot;&gt;テキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;
&lt;!-- /.row --&gt;</pre>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅が768px以上
**********************************************************************/
@media only screen and (min-width: 768px) {
  .row .photo {
    float: right;
    width: 460px;
  }
  .row .txt {
    float: left;
    width: 460px;
  }
}
/***********************************************************************
ブラウザの幅が767px以下
**********************************************************************/
@media only screen and (max-width: 767px) {
  .row .photo {
    margin-bottom: 10px;
    text-align: center;
  }
}</pre>
<p>このレイアウトはさっきのパターンをちょっとだけ弄れば実現出来るのですが、どこを弄ったかわかったでしょうか？</p>
<p>正解はPCレイアウトにおける.photoと.txtの「float」の部分です。</p>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅が768px以上
**********************************************************************/
@media only screen and (min-width: 768px) {
  .row .photo {
    float: right; /* ここと */
    width: 460px;
  }
  .row .txt {
    float: left; /* ここ！ */
    width: 460px;
  }
}
/***********************************************************************
ブラウザの幅が767px以下
**********************************************************************/
@media only screen and (max-width: 767px) {
  .row .photo {
    margin-bottom: 10px;
    text-align: center;
  }
}</pre>
<p>上のようにfloatのleft、rightの記述をさっきのパターンと逆にするだけで出来てしまいます。</p>
<h2 id="-">パターン③「パターン①のちょっと複雑なバージョン」</h2>
<p>実際のパターンでは、写真とテキストだけでなく、次のように「写真+写真の説明」と「見出し+テキスト」が並んでいるようなパターンも出てきます。</p>
<p><a target="_blank" href="https://taneppa.net/sample_html/resp_pattern/sample03.html">サンプル</a></p>
<p>HTML/CSSは以下のようになっています。</p>
<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;row clearfix&quot;&gt;
  &lt;div class=&quot;leftCol&quot;&gt;
    &lt;p class=&quot;photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
    &lt;p class=&quot;note&quot;&gt;画像の説明&lt;/p&gt;
  &lt;/div&gt;
  &lt;!-- /.leftCol --&gt;
  &lt;div class=&quot;rightCol&quot;&gt;
    &lt;p class=&quot;leading&quot;&gt;見出し文見出し文見出し文&lt;/p&gt;
    &lt;p class=&quot;txt&quot;&gt;テキストテキストテキスト&lt;/p&gt;
  &lt;/div&gt;
  &lt;!-- /.rightCol --&gt;
&lt;/div&gt;
&lt;!-- /.row --&gt;</pre>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅に関わらない共通のCSS
**********************************************************************/
.row .rightCol .leading {
  font-weight: bold;
  font-size: 20px;
}

/***********************************************************************
ブラウザの幅が768px以上
**********************************************************************/
@media only screen and (min-width: 768px) {
  .row .leftCol {
    float: left;
    width: 460px;
  }
  .row .rightCol {
    float: right;
    width: 460px;
  }
}
/***********************************************************************
ブラウザの幅が767px以下
**********************************************************************/
@media only screen and (max-width: 767px) {
  .row .leftCol {
    margin-bottom: 20px;
    text-align: center;
  }
}</pre>
<p>パターン①では.photoと.txtに直接floatを与えていましたが、今回は少々複雑なので以下のように「leftCol,rightCol」という枠を作り、それにfloatを与えています。</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img011.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img011.png" alt="img01" width="640" height="643" class="alignnone size-full wp-image-3091" /></a></p>
<p>ぱっと見て少々複雑に見えるパターンでも、実際は今回のようにパターン①の応用で出来るものが多くあります。</p>
<p>また、今回は下のように、幅によらない共通のスタイルはメディアクエリを使わず、普通にCSSを書くことでどの幅でも反映されるようにしています。</p>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅に関わらない共通のCSS
**********************************************************************/
.row .rightCol .leading {
  font-weight: bold;
  font-size: 20px;
}</pre>
<h2 id="-pc-sp-">パターン④「PC: テーブル ⇔ SP: 縦並び」</h2>
<p><a target="_blank" href="https://taneppa.net/sample_html/resp_pattern/sample04.html">サンプル</a></p>
<p>最後に、これもよくあるテーブルレイアウトのレスポンシブコーディングをご紹介したいと思います。</p>
<p>テーブルはPCレイアウトで使ったものをそのままSPレイアウトでも使ってしまうと、かなり窮屈になってしまうことが多々あります。</p>
<p>そこで今回のように、SPレイアウトでは縦並びにすることで解決する方法をよくとります。</p>
<p>HTML/CSSは以下のとおりです。</p>
<pre class="brush: xml; title: ; notranslate">&lt;table class=&quot;sampleTbl&quot;&gt;
  &lt;tr&gt;
    &lt;th&gt;見出し&lt;/th&gt;
    &lt;td&gt;ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;見出し&lt;/th&gt;
    &lt;td&gt;ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;見出し&lt;/th&gt;
    &lt;td&gt;ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;見出し&lt;/th&gt;
    &lt;td&gt;ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;!-- /.sampleTbl --&gt;</pre>
<pre class="brush: xml; title: ; notranslate">/***********************************************************************
ブラウザの幅によらない共通のCSS
**********************************************************************/
.sampleTbl th {
  background: #f0f0f0;
  font-weight: bold;
}

/***********************************************************************
ブラウザの幅が768px以上
**********************************************************************/
@media only screen and (min-width: 768px) {
  .sampleTbl th,
  .sampleTbl td {
    padding: 10px;
    border: 1px solid #cccccc;
  }
  .sampleTbl th {
    width: 70px;
  }
}
/***********************************************************************
ブラウザの幅が767px以下
**********************************************************************/
@media only screen and (max-width: 767px) {
  .sampleTbl {
    display: block;
  }
  .sampleTbl tr,
  .sampleTbl th,
  .sampleTbl td {
    display: block;
  }
  .sampleTbl tr {
    border-bottom: 1px solid #cccccc;
  }
  .sampleTbl tr:first-child {
    border-top: 1px solid #cccccc;
  }
  .sampleTbl th,
  .sampleTbl td {
    padding: 5px;
  }
}</pre>
<p>PCレイアウトでは特別なことをせず、普通にテーブルのコーディングをしているだけです。</p>
<p>注目してもらいたいのはSPレイアウトのスタイルです。</p>
<p>とくに何もしなければSPレイアウトでも普通のテーブル見た目になってしまうのですが、「table,tr,th,td」に「display: block」を指定することで縦並びにしています。</p>
<pre class="brush: xml; title: ; notranslate">/* display: blockを指定して縦並びにしている。 */
.sampleTbl {
  display: block;
}
.sampleTbl tr,
.sampleTbl th,
.sampleTbl td {
  display: block;
}</pre>
<p>デフォルトだとtable要素は「display: table;」、tr要素は「display: table-row;」、th,td要素は「display: table-cell;」が設定されており、それによっていつものテーブルの見た目になっているのですが、それを「display: block;」によって上書きすることで縦並びにしています。</p>
<p>このパターンは非常によく使うのでぜひ覚えておいてください！</p>
<h3 id="ie9-">IE9では注意！</h3>
<p>先ほどのtableをSPレイアウトで縦並びにするテクニックですが、IE9では対策が必要です。</p>
<p>IE9だとdisplay: blockだけでは足りず、下のようにスタイルを与える必要があります。</p>
<pre class="brush: xml; title: ; notranslate">.sampleTbl tr,
.sampleTbl th,
.sampleTbl td {
  display: block;
  float: left;
  width: 100%;
}</pre>
<p>IE9ではなぜか「float」を設定しないとblock要素として認識されず、さらにfloatだけだと幅が短くなってしまうので「width: 100%」を指定する必要があります。</p>
<h2 id="-">以上</h2>
<p>レスポンシブはマークアップエンジニアだけでなく、デザイン専門のデザイナーでも基本的な仕組みとパターンは知っておかないとコーディングで実現不可能なデザインが出来上がってしまいます。<br />苦手意識を持っている人が多いようですが、実際にやってみるとそれほど難しいものでもないので、一度是非手を動かして挑戦してみて下さい！</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/resp_pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Gulp】pngquantで圧縮した画像がMacで暗くなる場合の対処法</title>
		<link>https://taneppa.net/gulp_pq_warning/</link>
		<comments>https://taneppa.net/gulp_pq_warning/#comments</comments>
		<pubDate>Thu, 25 Aug 2016 03:40:07 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[Web制作]]></category>
		<category><![CDATA[効率化]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3106</guid>
		<description><![CDATA[pngquantで圧縮した画像がMacのFirefox/Chromeで暗くなるという問題の原因と解決法に関してご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>自分はタスクランナーとしてGulpを利用しており、png画像の圧縮にはpngquantを使っているのですが、先日「MacのFirefoxとChromeだけ圧縮したpng画像の色が暗くなる」という状況に遭遇してしまいました。</p>
<p>色々調査した結果、原因と解決法がわかりましたので、今回はそれに関してご紹介したいと思います。</p>
<h2 id="-">結論</h2>
<p>Gulpでpngquantを使用する場合は以下のようにgulpfileを書いているかと思います。</p>


<pre class="brush: xml; title: ; notranslate">var gulp = require('gulp');

var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant');

gulp.task('img', function() {
  gulp.src('./src/**/*.png')
      .pipe(imagemin(
        [pngquant({
          quality: '60-80'
        })]
      ))
      .pipe(gulp.dest('./dist'));
});</pre>


<p>これに１行追加する必要があります。</p>


<pre class="brush: xml; title: ; notranslate">var gulp = require('gulp');

var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant');

gulp.task('img', function() {
  gulp.src('./src/**/*.png')
      .pipe(imagemin(
        [pngquant({
          quality: '60-80'
        })]
      ))
      .pipe(imagemin()) //これを追加！
      .pipe(gulp.dest('./dist'));
});</pre>


<h2 id="-">詳細</h2>
<p>理由ですが、特定のpng画像をpngquantで圧縮すると、画像にガンマ補正の情報が付加される場合があり、その場合MacのFirefox,GoogleChromeにおいて画像の色と周りの色に差が出る可能性があるからです。</p>
<p>実例として、以下のデモをMacのFirefoxかChromeで確認してみてください。</p>
<p><a href="https://taneppa.net/sample_html/gulp_pq_warning/" target="_blank">デモ</a></p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img012.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img012.png" alt="img01" width="266" height="356" class="alignnone size-full wp-image-3110" /></a></p>
<p>※Windowsでも確認出来るよう、スクリーンショットも貼っておきます。</p>
<p>この画像は#ccccccで塗りつぶされており、デモの背景も#ccccccを指定しています。</p>
<p>にもかかわらず、圧縮後の画像はすこし暗くなってしまっており背景と差が出てしまってますね。</p>
<p>これは、pngquantが圧縮後にガンマ補正情報を付加してしまう時があるのが原因となっています。</p>
<p>実際に圧縮前、圧縮後の画像の詳細をプレビューで確認してみると以下の様な情報が出てきます。</p>
<p><strong>圧縮前</strong></p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img021.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img021.png" alt="img02" width="354" height="415" class="alignnone size-full wp-image-3111" /></a></p>
<p><strong>圧縮後</strong></p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img031.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img031.png" alt="img03" width="354" height="415" class="alignnone size-full wp-image-3112" /></a></p>
<p>圧縮後の画像には「ガンマ」という項目が増えてしまっていますね。これが原因で表示がおかしくなってしまっています。</p>
<p>この「ガンマ」に関して詳しく話すと結構ややこしい話になるのですが、解決法だけなら単純です。この「ガンマ」情報を除去すれば良いだけです。</p>
<p>除去する方法は色々あるのですが、gulp-imageminがpngを圧縮する時にデフォルトで使用されるoptipngが除去する仕様となっているので、これを利用したいと思います。</p>
<p>その際のgulpfileのソースコードは、冒頭にも記述しましたが以下のようになります。</p>


<pre class="brush: xml; title: ; notranslate">var gulp = require('gulp');

var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant');

gulp.task('img', function() {
  gulp.src('./src/**/*.png')
      .pipe(imagemin(
        [pngquant({
          quality: '60-80'
        })]
      ))
      .pipe(imagemin()) //ここでガンマ情報を除去！
      .pipe(gulp.dest('./dist'));
});</pre>


<h2 id="-">以上</h2>
<p>pngquantは圧縮率が良いため利用しているのですが、今回の件以外にも落とし穴があったりして結構面倒です。<br />（qualityの下限を下回る圧縮が必要な画像に関しては圧縮がスキップされ、distディレクトリにコピーもされないため自前でコピー処理を記述する必要があったり…）</p>
<p>ですが、Gulpで自動化を行うことによって、圧縮漏れ等がなくなり成果物の質が担保されるというメリットがありますので、これにめげず積極的に自動化を進めたい次第です！</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/gulp_pq_warning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>環境によって文字背景色の高さが変わる問題の解決法</title>
		<link>https://taneppa.net/txt_bg/</link>
		<comments>https://taneppa.net/txt_bg/#comments</comments>
		<pubDate>Fri, 19 Aug 2016 06:28:06 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3078</guid>
		<description><![CDATA[デザインで時々文字に背景色を付けるデザインがありますが、これは素直にコーディングしてしまうと環境によって背景色の高さが全然変わってしまいます。今回はそんな環境によって変わる文字背景色の高さを統一する方法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>デザインで時々文字に背景色を付けるデザインがありますが、これは素直にコーディングしてしまうと環境によって背景色の高さが全然変わってしまいます。</p>
<p>今回はそんな環境によって変わる文字背景色の高さを統一する方法をご紹介したいと思います。</p>
<h2 id="-">結論</h2>
<p>background-sizeを使用します。</p>
<p>具体的には</p>


<pre class="brush: xml; title: ; notranslate">&lt;p class=&quot;txt&quot;&gt;それは十月無論この尊重帰りにおいてののためを進まだな。&lt;span class=&quot;u-bgTxt&quot;&gt;もちろん結果が相談者ははなはだこの発展んありまでに偽らてみだがは盲従受けなですので&lt;/span&gt;、まだにはするたたなた。&lt;/p&gt;</pre>


<p>このようなマークアップに対して（.u-bgTxtを指定している箇所が背景色を付ける箇所）</p>


<pre class="brush: xml; title: ; notranslate">.u-bgTxt {
  background: url('../images/bg_u_bgtxt.png') left center repeat-x;
  background-size: auto 1.2em;
  padding: 0.5em 0;
}</pre>


<p>のような指定をします。</p>
<h2 id="-">詳細</h2>
<p>例えば、先ほどのマークアップに対して素直に</p>


<pre class="brush: xml; title: ; notranslate">.u-bgTxt {
  background: #f1c40f;
}</pre>


<p>のようなスタイルを当てたとします。</p>
<p>するとMac（フォントはヒラギノ角ゴ）では</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img01.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img01.png" alt="img01" width="225" height="176" class="alignnone size-full wp-image-3079" /></a></p>
<p>このように表示されますが、Windows（メイリオ）では</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img02.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img02.png" alt="img02" width="225" height="171" class="alignnone size-full wp-image-3080" /></a></p>
<p>このように表示されてしまいます。背景色の高さが全然違いますね。</p>
<p>「.u-bgTxt」に上下paddingを与えることで背景色を高くする方向には調整することが出来るのですが、背景色の高さはOSのみでなくブラウザ毎にも異なっていたので根本的に違う方法じゃないとダメでした。</p>
<p>そこで、冒頭に書いたように</p>


<pre class="brush: xml; title: ; notranslate">.u-bgTxt {
  background: url('../images/bg_u_bgtxt.png') left center repeat-x;
  background-size: auto 1.2em;
  padding: 0.5em 0;
}</pre>


<p>このように指定することで解決します。</p>
<p>「bg_u_bgtxt.png」は10px四方程度の付けたい色で埋めた画像です。これをbackground-sizeで高さを指定することでどの環境でも高さが同じになるようにしています。フォントサイズが変わってもちゃんと表示されるようにemで高さを指定しています。</p>
<p>paddingの指定は環境によってはbackground-sizeの高さ指定より低く表示されてしまうのを調整するための指定です。</p>
<p>こうするとMacでは</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img03.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img03.png" alt="img03" width="224" height="165" class="alignnone size-full wp-image-3081" /></a></p>
<p>Windowsでは</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img04.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img04.png" alt="img04" width="264" height="169" class="alignnone size-full wp-image-3082" /></a></p>
<p>となり、背景色が同じ高さで表示されるようになりました。</p>
<p>これで文字背景色も問題ありませんね！</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/txt_bg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【CSS】共通パーツには「BEM」の命名規則を使おう</title>
		<link>https://taneppa.net/css_bem/</link>
		<comments>https://taneppa.net/css_bem/#comments</comments>
		<pubDate>Wed, 03 Aug 2016 23:43:54 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3066</guid>
		<description><![CDATA[WEBサイトの運用・保守時や大規模サイトの構築時には致命的になりかねないそんなモジュールのスタイルのバッティング問題。その解決方法の１つである「BEM」に関して今回はご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>複数のページに共通して登場するデザイン（以降モジュールと呼びます）のCSSを共通CSSファイルに書いたら、ページ毎のCSSとバッティング（名前が被ること）して困った経験は無いでしょうか？</p>
<p>WEBサイトの運用・保守時や大規模サイトの構築時には致命的になりかねないそんなモジュールのスタイルのバッティング問題。その解決方法の１つである「BEM」に関して今回はご紹介したいと思います。</p>
<h2 id="-">具体的な例を上げて説明</h2>
<h3 id="-">モジュール作成</h3>
<p>例えばこのようなパーツのデザインカンプがあったとします。</p>

<p><a href="https://taneppa.net/wp-content/uploads/2016/07/panel.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/panel.png" alt="panel" width="340" height="380" class="alignnone size-full wp-image-3067" /></a></p>

<p>このデザインは複数のページに登場するため、モジュールとしてHTMLとCSSは以下のように記述したとします。</p>

<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;panel&quot;&gt;
  &lt;p class=&quot;photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;</pre>

<pre class="brush: xml; title: ; notranslate">.panel {
  border: 1px solid #000;
  padding: 10px;
}
.panel .photo {
  margin-bottom: 10px;
}
.panel .txt {
  font-size: 14px;
  line-height: 1.5;
}</pre>


<h3 id="-">運用時に問題発生</h3>

<p>サイトを運用していると、次のようなマークアップの箇所にpanelモジュールを入れることになりました。</p>

<pre class="brush: xml; title: ; notranslate">&lt;section class=&quot;mainSect&quot;&gt;
  &lt;h2 class=&quot;sectTit&quot;&gt;セクションタイトル&lt;/h2&gt;
  &lt;p class=&quot;txt&quot;&gt;セクションのテキスト&lt;/p&gt;
  &lt;!-- ここにpanelモジュールを追加したい！ --&gt;
&lt;/section&gt;</pre>


<p>先ほどのpanelモジュールをそのまま入れると以下のようになります。</p>

<pre class="brush: xml; title: ; notranslate">&lt;section class=&quot;mainSect&quot;&gt;
  &lt;h2 class=&quot;sectTit&quot;&gt;セクションタイトル&lt;/h2&gt;
  &lt;p class=&quot;txt&quot;&gt;セクションのテキスト&lt;/p&gt;&lt;!-- クラス名が被ってる！ --&gt;
  &lt;div class=&quot;panel&quot;&gt;
    &lt;p class=&quot;photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
    &lt;p class=&quot;txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;&lt;!-- クラス名が被ってる！ --&gt;
  &lt;/div&gt;
&lt;/section&gt;</pre>



<p>ソースを見ていただければ分かる通り「.txt」クラスが被ってしまいました。</p>

<p>このようにモジュールのような「どこに入るかわからない」パーツに被りやすいクラス名を付けてしまうとバッティングが頻繁に発生してしまいます。</p>

<p>今回のようにバッティングが発生した場合の対処法は、</p>

<ul>
<li>モジュールの「.txt」を違うもっと被りにくい名前に変える。</li>
<li>モジュールを入れる先のページにあった「.txt」を違う名前に変える。</li>
</ul>

<p>の２パターンになるかと思います。前者が出来れば以降panelモジュールに関してはバッティングが発生しにくくなるのですが、もう既に多くの箇所でpanelモジュールが使われていた場合はその全てにおいて「.txt」のクラス名を変更しなくてはなりません…。</p>

<p>また、後者の場合は修正はすぐ済むのですが、根本的な解決にはなってないのでまた別の場所でpanelモジュールを使うときに同様のバッティングが発生して対処に追われるかもしれません。</p>

<p>このようにモジュールに適当な名前を付けた場合、後々面倒な問題になることがありますのでモジュールの命名にはかなり気を使う必要があります。</p>

<h3 id="-">被りにくいモジュールの命名規則</h3>
<p>そこでpanelモジュールのマークアップを以下のように変えるとどうでしょう？</p>

<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;panel&quot;&gt;
  &lt;p class=&quot;panel_photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;panel_txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;</pre>


<p>このように「(モジュールのクラス名)_(パーツのクラス名)」という命名規則にした場合、先ほどのパターンは次のようになります。</p>

<pre class="brush: xml; title: ; notranslate">&lt;section class=&quot;mainSect&quot;&gt;
  &lt;h2 class=&quot;sectTit&quot;&gt;セクションタイトル&lt;/h2&gt;
  &lt;p class=&quot;txt&quot;&gt;セクションのテキスト&lt;/p&gt;
  &lt;div class=&quot;panel&quot;&gt;
    &lt;p class=&quot;panel_photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
    &lt;p class=&quot;panel_txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;&lt;!-- 被らない！ --&gt;
  &lt;/div&gt;
&lt;/section&gt;</pre>


<p>これだと名前が被りませんね！</p>

<p>このように、モジュールの中の要素に対して「(モジュールのクラス名)_(パーツのクラス名)」といった命名をすると次のようなメリットがあります。</p>
<ul>
<li>クラス名のバッティングが発生しにくい。</li>
<li>単純な命名規則のため、命名に時間がかからない。</li>
<li>「panel_photo」というクラス名を見た瞬間「これはpanelモジュールのパーツなんだな」と属しているモジュールがすぐわかる。</li>
</ul>
<h3 id="-">モジュールのバリエーションが欲しくなった場合は？</h3>
<p>さらにサイトを運用していると「特定のpanelモジュールを目立たせたいのでボーダーの色が違うバージョンが欲しい」という要望が発生し、以下の様なpanelモジュールを作る必要が出たとします。</p>

<p><a href="https://taneppa.net/wp-content/uploads/2016/07/panel_red.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/panel_red.png" alt="panel_red" width="340" height="380" class="alignnone size-full wp-image-3068" /></a></p>

<p>そこで、以下のようにマークアップしたとします。</p>

<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;panel red&quot;&gt;
  &lt;p class=&quot;panel_photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;panel_txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;</pre>



<p>この場合、</p>

<pre class="brush: xml; title: ; notranslate">.red {
  color: red;
}</pre>

<p>のような形でテキスト色の変更のために「red」クラスが使われているとまたバッティングが発生してしまいます。（そもそもこんな被りやすいクラスをこんなCSSの書き方で宣言するのがかなり問題あるのですが…それはそれとして）。</p>

<p>そこで、モジュールのバリエーションを作る際には「(モジュールのクラス名)-(バリエーション)」という命名規則にすることにします。</p>

<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;panel panel-red&quot;&gt;
  &lt;p class=&quot;panel_photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;panel_txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;</pre>



<p>この命名規則のメリットはほとんど先ほどと同様ですが、</p>

<ul>
<li>クラス名のバッティングが発生しにくい。</li>
<li>単純な命名規則のため、命名に時間がかからない。</li>
<li>「panel-red」というクラス名を見た瞬間「これはpanelモジュールの赤いバリエーションなんだな」どんなクラスなのかすぐわかる。</li>
</ul>
<h2 id="-bem-">ところでBEMは？</h2>
<p>タイトルに「BEM」と書いたものの、ここまでBEMに関して全く言及しませんでしたが、実は今までの内容がBEM（正確にはBEMの命名規則をアレンジしたもの）です。</p>
<p>「BEM」は「Block」「Element」「Modifier」の頭文字をとったもので、それぞれ</p>
<ul>
<li>Block: モジュール全体のこと（今回の「.panel」のこと）</li>
<li>Element: モジュール内のパーツのこと（今回の「.panel_photo」「.panel_txt」のこと）</li>
<li>Modifier: モジュールのバリエーションのこと（今回の「.panel-red」のこと）</li>
</ul>
<p>を表しています。</p>
<p>BEMに関して詳細に説明するとかなりややこしくなってしまうのですが、命名規則に関しては単純明快で</p>
<ul>
<li>Elementは「Block名 + 区切り文字 + Element名」</li>
<li>Modifierは「Block名 + 区切り文字 + Modifier名」</li>
</ul>
<p>という命名規則にしようというものです。（ElementとModifierの区切り文字は区分するために別のものを採用する必要があります。今回は「-」と「_」で区別してましたね。）</p>
<p>ちなみに、一時期話題になった「mindBEMding」は区切り文字に「&#8211;」「__」を採用していました。</p>

<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;panel panel--red&quot;&gt;
  &lt;p class=&quot;panel__photo&quot;&gt;&lt;img src=&quot;~&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
  &lt;p class=&quot;panel__txt&quot;&gt;テキストテキストテキストテキストテキスト&lt;/p&gt;
&lt;/div&gt;</pre>


<p>正直区切り文字を連続させる書き方はほぼ見ないので、かなり気持ち悪い書き方ではあるのですが、「Block,Element,Modifierの関係を気持ち悪いほど目立つ区切り文字で区切ることによってより明確にする」という意味では理にかなってはいます。</p>

<p>それと、クラス名にスネークケースを採用している場合は連続させないと単語の区切りなのかBEMの区切りなのかわからないという事情もあったかと思います。（自分はクラス名にキャメルケースを採用しているのでBEMの区切り文字は１つで済ませています。）</p>
<p>BEMに関してより深く知りたいという場合は、以下の記事を参考にしていただければいいかと思います。</p>
<ul>
<li><a href="https://en.bem.info/method/definitions/">Definitions / Methodology / BEM. Block, Element, Modifier / BEM（英語）</a></li>
<li><a href="https://github.com/juno/bem-methodology-ja/blob/master/definitions.md">Definitions / Methodology / BEM. Block, Element, Modifier / BEM（日本語訳）</a></li>
<li><a href="https://app.codegrid.net/entry/bem-basic-1">【BEMによるフロントエンドの設計】基本概念とルール | CodeGrid</a></li>
</ul>





<h2 id="-sass-bem-">(おまけ)Sassを使用している場合のBEMの書き方</h2>
<p>BEMは構造上、Block名を何度も書く必要があって面倒なのですが、Sass(SCSS)を使用している場合はCSSは以下のように書くことで簡略化できます。</p>


<pre class="brush: xml; title: ; notranslate">.panel {
  &amp;_photo {
    ~
  }
  &amp;_txt {
    ~
  }
  &amp;-red {
    ~
  }
}</pre>


<p>これはコンパイルされると</p>


<pre class="brush: xml; title: ; notranslate">.panel {
  ~
}
.panel_photo {
  ~
}
.panel_txt {
  ~
}
.panel-red {
  ~
}</pre>



<p>のようになります。</p>

<p>Sassで「&amp;」は「親と同じ」という機能になっており、今回の場合は「.panel」が参照されてコンパイルされたような結果になります。</p>
<p>「&amp;」を使っておくとBlock名に変更が生じた場合でも１箇所変更するだけで済みますし、記述も楽なので使うことをオススメします。</p>




<h2 id="-">以上</h2>
<p>「普段小規模なサイトの制作しかしていないからCSSの命名規則とかそんなに気にしなくてもなんとかなっているし…」という方も多いかと思います。</p>
<p>ただ、今は小規模なサイトばかりでも、いつどんなタイミングで命名規則を気にしないと制作が困難になってしまうような大規模案件や保守運用を見越した案件が舞い込んでくるかわかりません。（案件を選べる立場の人ならいいでしょうが、そんな人は中々少数派かと思います。）</p>
<p>いつそんな案件が来ても対応出来るように、命名規則を出来るだけ早く意識するようにしましょう！</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/css_bem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>コーディングに慣れてきたら意識して欲しい「保守運用」を意識したマークアップ</title>
		<link>https://taneppa.net/css_design01/</link>
		<comments>https://taneppa.net/css_design01/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 03:43:03 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=3051</guid>
		<description><![CDATA[保守運用を見越したコーディングが出来ないと、保守運用フェーズで問題が発生することはもちろん、大規模サイトにおいては開発段階で様々な問題が発生する可能性があります。今回は、保守運用を見越したコーディングの基本の基本に関して、WEBサイトを制作するという想定で簡単にご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<p>マークアップにおいて、カンプ通りのコーディングはあくまでスタートラインに過ぎず、本番は保守運用を見越したコーディングにあります。</p>
<p>保守運用を見越したコーディングが出来ないと、保守運用フェーズで問題が発生することはもちろん、大規模サイトにおいては開発段階で様々な問題が発生する可能性があります。</p>
<p>今回は、保守運用を見越したコーディングの基本の基本に関して、WEBサイトを制作するという想定で簡単にご紹介したいと思います。</p>
<h2 id="-">ディレクトリ構造</h2>

<p><a href="https://taneppa.net/wp-content/uploads/2016/07/img_directories01.png"><img src="https://taneppa.net/wp-content/uploads/2016/07/img_directories01.png" alt="img_directories01" width="450" height="410" class="alignnone size-full wp-image-3059" /></a></p>

<p>制作するサイトのディレクトリ構造は上のようになっているとします。</p>
<p>共通の物に関してはcommonディレクトリ内のcommon.cssに記述し、ページ毎の物に関しては各階層のcssディレクトリ内に記述するルールになっています。</p>
<h2 id="-css-">色々なページに出てくるパーツは共通CSSに書こう！</h2>
<p>では、まずトップページのカンプが届いたので、トップページをコーディングすることにしました。</p>
<p>そこで、トップページのカンプ内に下のようなボタンが出てきました。</p>
<style>
.inlineWrapper {
  margin-bottom: 20px;
}
.modBtn01 {
  font-size: 16px;
  font-weight: bold;
  color: #fff;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #2980b9;
}
.modBtn01.modBtn01-red {
  background: #c0392b;
}
</style>

<div class="inlineWrapper">
  <div class="modBtn01">詳しく見る</div>
</div>

<p>この場合、次のようにコーディングするかと思います。</p>
<h3 id="-html-index-html-">「html/index.html」</h3>


<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;detail.html&quot; class=&quot;btn01&quot;&gt;詳しくはこちら&lt;/a&gt;</pre>

<h3 id="-html-css-index-css-">「html/css/index.css」</h3>

<pre class="brush: xml; title: ; notranslate">.btn01 {
  font-size: 16px;
  font-weight: bold;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #2980b9;
}</pre>


<p>問題ありませんね。</p>
<p>さて、トップページのコーディングが終わると次はアバウトページのカンプが届き、アバウトページのカンプにも次のようなボタンが出てきました。</p>
<div class="inlineWrapper">
  <div class="modBtn01">お問い合わせ</div>
</div>

<p>そこでトップページで同じボタンを見たので、トップページのCSSをコピペして使うことにしました。</p>
<h3 id="-html-about-index-html-">「html/about/index.html」</h3>

<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;detail.html&quot; class=&quot;btn01&quot;&gt;お問い合わせはこちら&lt;/a&gt;</pre>


<h3 id="-html-about-css-index-css-">「html/about/css/index.css」</h3>

<pre class="brush: xml; title: ; notranslate">.btn01 {
  font-size: 16px;
  font-weight: bold;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #2980b9;
}</pre>


<p>ちょっと雲行きが怪しくなってきましたがまだ問題ではありません。</p>
<p>次にお問い合わせページのカンプが届き、お問い合わせページにも次のようなボタンがありました。</p>
<div class="inlineWrapper">
  <div class="modBtn01">よくある質問</div>
</div>

<p>ここでアバウトページのようにコピペをやろうとすると流石に問題になってきます。</p>
<h3 id="-">何が問題か</h3>
<p>例えば、コーディングしている最中「ボタンの角丸を消すことになりました！」なんてことになったとします。</p>
<p>そうなると</p>
<ul>
<li>トップページのCSS</li>
<li>アバウトページのCSS</li>
<li>お問い合わせページのCSS</li>
</ul>
<p>と、同じ形のボタンを修正するのに複数のファイルを弄る必要が出てしまいます。</p>
<p>現状はファイルが３つなのでまだそこまで時間がかかりませんが、大規模サイトとかだと数十ファイル修正しないといけないなんてことも有り得てしまい、時間がかかりますしケアレスミスが発生してしまう可能性も高まります。</p>
<p>共通化出来る箇所は、やり過ぎない範囲で共通化する。というのが原則になってきます。</p>
<h3 id="-">どうすればいいか</h3>
<p>複数ページに渡って出てくる物に関しては、共通CSS（今回の場合は「html/common/css/common.css」）に記述しましょう。共通CSSに記述しておけば、修正に強いだけでなく、別のページで再登場した際にいちちコピペする必要もなくなり開発スピードもあがります。</p>
<p>今回のように、「実際にカンプが届かないとこのボタンが複数ページに渡って出てくるのかわからない」なんてことは良くあります。その場合は最初は各ページのCSSファイルに書いておいて、実際カンプが届いて複数ページに渡って出てくることがわかった時点で共通CSSに書き直す、ということをやるべきです。出来上がったページのCSSを触ることを怖がらず、先を見越して問題になりそうな箇所は積極的に直していきましょう。</p>
<h2 id="-css-">共通CSSに書くスタイルは出来るだけ接頭語をつけよう</h2>
<p>先ほどcommon.cssに共通パーツ「.btn01」を記述しましたが、まだ少し問題があります。</p>
<p>何かというと、「.btn01」はよく使うネーミングなので、他のメンバーがcommon.cssで使われていることを知らずにコーディングに「.btn01」の名前を使ってしまい、ブラウザで見ておかしいことに気づいて修正に時間をとってしまう、という問題が発生する可能性が高いのです。</p>
<p>共通CSSは全ページで読み込まれる物なので、名前に関しては非常に気を使わないといけません。</p>
<p>そこでおすすめなのが、「接頭語」をつけることです。</p>
<p>私がよくやるのが、共通CSSに共通パーツを書く場合、接頭語として「mod」をつけることです。（「mod」は「module（モジュール）」の略です。）</p>
<p>例えば今回の場合は、</p>


<pre class="brush: xml; title: ; notranslate">.modBtn01 {
  ~
}</pre>


<p>となります。</p>
<p>「共通パーツにはmodを接頭語として付ける」というルールを作り、それをメンバーに伝えておけば無駄な名前被りが発生せず、無駄な作業時間の発生も防ぐことができます。</p>
<h2 id="-">色違いのパーツが出てきたら「マルチクラス」にしよう。</h2>
<p>さて、順調にコーディングしていた所、次は下のようなボタンが出てきました。</p>
<div class="inlineWrapper">
  <div class="modBtn01 modBtn01-red">注意事項</div>
</div>

<p>パーツの形自体は「.modBtn01」と同じなのですが、色だけが異なっています。</p>
<p>この時、大体次のようなスタイルを書くと思います。</p>


<pre class="brush: xml; title: ; notranslate">.modBtn01 {
  font-size: 16px;
  font-weight: bold;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #2980b9;
}
/* .modBtn01のbackgroundだけを変更 */
.modBtn02 {
  font-size: 16px;
  font-weight: bold;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #c0392b;
}</pre>


<p>これでも間違いではないのですが、次のように書いた方がスマートです。</p>


<pre class="brush: xml; title: ; notranslate">.modBtn01 {
  font-size: 16px;
    font-weight: bold;
  display: inline-block;
  padding: 10px 15px;
  border-radius: 5px;
  background: #2980b9;
}
.modBtn01.modBtn01-red {
  background: #c0392b;
}</pre>


<p>こう書いた場合、赤いボタンのHTMLは次のようになります。</p>


<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;#&quot; class=&quot;modBtn01 modBtn01-red&quot;&gt;注意事項&lt;/a&gt;</pre>


<p>このように、複数のクラスを使ってデザインを表現することを「マルチクラス」と言います。（逆に単一のクラスで表現することは「シングルクラス」と言います。）</p>
<p>青いボタンと赤いボタンの違いは背景色のみで、他の部分は共通しています。最初の例でも書きましたが、共通している部分をコピペでやってしまうと、変更が発生した時にコピペした箇所を全部修正しないといけなくなり問題が発生しやすくなってしまいます。</p>
<h2 id="-">以上</h2>
<p>マークアップはカンプ通りにコーディングすればOKというわけではありません。開発段階でいくらカンプ通りにコーディングされていても、それが保守運用に向かない書き方であれば保守運用が難しくなり運用のコストが高くなる、又は場当たり的な改修を繰り返さざるを得なくなり、結果サイトのデザインが損なわれてしまうことも往々にしてあります。</p>
<p>また保守運用を見越したコーディングが出来ないと、大規模サイトの開発においては保守運用フェーズに行くまでもなく、開発段階でCSSが破綻してしまうことも考えられます。</p>
<p>カンプ通りのコーディングだけでなく、保守運用を見越したコーディングも出来るように常日頃から意識するようにしましょう！（より深くこの辺りの知識を仕入れたい人はを「OOCSS」や「SMACSS」、「BEM」、「FLOCSS」などで検索すると幸せになれるかもしれません。）</p>
<p>以上、たにっぱでした〜</p>]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/css_design01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>jQueryで要素を絞りこみたい時に使う関数一覧</title>
		<link>https://taneppa.net/jq_filter/</link>
		<comments>https://taneppa.net/jq_filter/#comments</comments>
		<pubDate>Wed, 06 Jul 2016 00:35:38 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2976</guid>
		<description><![CDATA[既に$(~)で抽出したjQueryの要素の集合を「さらに特定の条件で絞り込みたい！」といった状況が結構あります。今回はそんな時に使用できるjQueryの関数をまとめてみました。]]></description>
				<content:encoded><![CDATA[<p>例えば、以下のようなソースコードがあるとします。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul id=&quot;List&quot;&gt;
	&lt;li&gt;1&lt;/li&gt;
	&lt;li class=&quot;red&quot;&gt;2&lt;/li&gt;
	&lt;li&gt;3&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;red&quot;&gt;4&lt;/span&gt;&lt;/li&gt;
	&lt;li class=&quot;red&quot;&gt;5&lt;/li&gt;
	&lt;li&gt;6&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- /#List --&gt;
</pre>
<pre class="brush: xml; title: ; notranslate">
$(function() {
  var $list  = $('#List');
  var $items = $list.find('li');
});
</pre>


<p>このように、「$items」にul#List内のli要素が入っているような状況で、「redクラスがついている要素だけ取り出したい」「〜番目の要素を取り出したい」といったような、「もっと要素を条件によって絞り込みたい」って時が結構あります。</p>

<p>今回はそういう場合に使える関数をご紹介したいと思います。</p>

<h2 id="-">順番による絞込</h2>

<h3 id="first-last">first/last</h3>

<p>最初、又は最後の要素を取り出したい場合に使う関数です。</p>

<pre class="brush: xml; title: ; notranslate">
// 最初の要素を取り出す
var $first_item = $items.first();

// 最後の要素を取り出す。
var $last_item = $items.last();
</pre>



<a href="https://taneppa.net/wp-content/uploads/2016/04/first_last.png"><img class="alignnone size-full wp-image-2982" alt="first_last" src="https://taneppa.net/wp-content/uploads/2016/04/first_last.png" width="780" height="550" /></a></pre>
<h3 id="eq-n-">eq(n)</h3>
<p>n番目の要素を取り出したい場合に使う関数です。</p>
<pre class="brush: xml; title: ; notranslate">
// 3番目の要素を取り出す
var $third_item = $items.eq(2);
</pre>

<p>3番目なのに2を指定しているのは間違いではありません。eqの引数は0オリジン（0が最初の要素と対応）なので3番目の要素を取り出したい場合は2を指定する必要があります。</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/04/eq.png"><img class="alignnone size-full wp-image-2983" alt="eq" src="https://taneppa.net/wp-content/uploads/2016/04/eq.png" width="780" height="550" /></a></p>
<h3 id="slice-start-end-">slice(start, end)</h3>
<p>start番目からend番目までの要素を取り出す場合に使う関数です。</p>

<pre class="brush: xml; title: ; notranslate">
// 3~5番目の要素を取り出す
var $new_items = $items.slice(2, 4);
</pre>

<p>sliceもeqと同様0オリジンなので注意しましょう。</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/04/slice.png"><img class="alignnone size-full wp-image-2985" alt="slice" src="https://taneppa.net/wp-content/uploads/2016/04/slice.png" width="780" height="550" /></a></p>
<h2 id="css-">CSSセレクタによる絞込</h2>
<h3 id="filter-selector-not-selector-">filter(selector)/not(selector)</h3>
<p>「〜のクラスを持っている（持っていない）要素を取り出す」といったCSSセレクタによる絞込をしたい場合はfilter/not関数を使います。</p>
<pre class="brush: xml; title: ; notranslate">
var $red_items = $items.filter('.red');

var $notred_items = $items.not('.red');
</pre>

<p><a href="https://taneppa.net/wp-content/uploads/2016/04/filter_not.png"><img class="alignnone size-full wp-image-2986" alt="filter_not" src="https://taneppa.net/wp-content/uploads/2016/04/filter_not.png" width="780" height="550" /></a></p>

<p>この関数に関して注意しておきたいのが、「その要素自身がセレクタで指定した条件に適合するかどうか」で抽出されるかどうか判断される点です。（子孫要素が条件を満たそうが関係ないということです）</p>

<p>今回の例で言うと、liタグ自身が「.red」クラスを持っているかどうかで判断されます。なので、4番目のliタグは子要素にspan.redを持っていますが、liタグ自身にはredクラスが付いていないのでfilterではなく、notでの抽出対象となります。</p>


<h2 id="-">子孫要素の有無による絞込</h2>



<h3 id="has-selector-">has(selector)</h3>

<p>filter/notのパターンとは逆に、「子孫要素がセレクタに適合するかどうか」で抽出の判断がされるパターンです。</p>

<pre class="brush: xml; title: ; notranslate">
var $hasred_items = $items.has('.red');
</pre>

<p><a href="https://taneppa.net/wp-content/uploads/2016/04/has.png"><img class="alignnone size-full wp-image-2987" alt="has" src="https://taneppa.net/wp-content/uploads/2016/04/has.png" width="780" height="550" /></a></p>

<p>filter/notの時とは異なり、liタグがredクラスを持っていようが関係なく、子孫要素がredクラスを持っているかどうかで判断されますので4番目のspan.redを子要素として持っているliタグのみが抽出対象となります。</p>

<h2>以上</h2>

<p>「更にこの条件で絞り込みたい」という状況が忘れた頃にやってきて、その度に調べ直すことがよくあるので今回まとめなおしてみました。</p>

<p>以上、たにっぱでした〜</p>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/jq_filter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【WordPress】投稿一覧画面からクイック編集機能を削除する方法</title>
		<link>https://taneppa.net/wp_quick_delete/</link>
		<comments>https://taneppa.net/wp_quick_delete/#comments</comments>
		<pubDate>Thu, 30 Jun 2016 03:22:21 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2956</guid>
		<description><![CDATA[WordPressの管理画面内、投稿一覧画面で「クイック編集」機能というものを使って投稿を簡易的に編集することが出来るのですが、WordPressをカスタマイズしてるとこの機能が邪魔になることが結構あります。今回はこの「クイック編集」機能を削除する方法をご紹介したいと思います。]]></description>
				<content:encoded><![CDATA[<h2 id="-">結論</h2>
<p>以下のコードをfunctions.phpに追加すればOKです。</p>
<pre class="brush: xml; title: ; notranslate">
function remove_quickedit_from_postlist($actions, $post) {
  unset($actions['inline hide-if-no-js']);

  return $actions;
}
add_filter('post_row_actions', 'remove_quickedit_from_postlist', 10, 2);
</pre>
<h2 id="-">説明</h2>
<p>変数$actionsの中身をvar_dumpすると以下のようになっています。</p>
<pre class="brush: xml; title: ; notranslate">
array(4) {
  [&quot;edit&quot;]=&gt;
    string(137) &quot;&lt;a title=&quot;この項目を編集&quot; href=&quot;http://wp.localhost/wp-admin/post.php?post=31&amp;action=edit&quot;&gt;編集&lt;/a&gt;&quot;
  [&quot;inline hide-if-no-js&quot;]=&gt;
    string(101) &quot;&lt;a class=&quot;editinline&quot; title=&quot;この項目をインラインで編集&quot; href=&quot;#&quot;&gt;クイック編集&lt;/a&gt;&quot;
  [&quot;trash&quot;]=&gt;
    string(205) &quot;&lt;a class=&quot;submitdelete&quot; title=&quot;この項目をゴミ箱へ移動する &quot; href=&quot;http://wp.localhost/wp-admin/post.php?post=31&amp;action=trash&amp;_wpnonce=52d4da28cb&quot;&gt;ゴミ箱&lt;/a&gt;&quot;
  [&quot;view&quot;]=&gt;
    string(223) &quot;&lt;a title=&quot;hogehogeを表示&quot; href=&quot;http://wp.localhost/2016/04/01/hogehoge/&quot; rel=&quot;permalink&quot;&gt;表示&lt;/a&gt;&quot;
}
</pre><br /><br />
<p>見て頂ければ分かる通り、表示する項目が$actionsに保管されています。</p>
<p>今回はクイック編集機能が邪魔なので、</p>
<pre class="brush: xml; title: ; notranslate">
unset($actions['inline hide-if-no-js']);
</pre><br /><br />
<p>によってクイック編集の項目が配列から削除され、表示されなくなります。</p>
<p>また、今回は利用していませんが、$postに投稿のデータが入っているので、投稿に応じた分岐等を行いたい場合は$postを利用して行うことが可能です。</p>
<h2 id="-">さらに</h2>
<p>削除することはもちろん、必要に応じて項目を追加することも可能です。</p>
<p>例えば、（必要かどうかは置いておいて）Googleへのリンクを追加したい場合は</p>
<pre class="brush: xml; title: ; notranslate">
function add_google_to_postlist($actions, $post) {
  $actions['google'] = '&lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;Google&lt;/a&gt;';

  return $actions;
}
add_filter('post_row_actions', 'add_google_to_postlist', 10, 2);
</pre>
<p>このようにすれば</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/04/スクリーンショット-2016-04-04-16.11.19.png"><img class="alignnone size-full wp-image-2958" alt="スクリーンショット 2016-04-04 16.11.19" src="https://taneppa.net/wp-content/uploads/2016/04/スクリーンショット-2016-04-04-16.11.19.png" width="465" height="306" /></a></p>
<p>こんな感じでGoogleへのリンクが（必要かどうかは置いておいて）設置されます。</p>
<p>今のところ良い使用用途が思い浮かばないのでこんな例になってしまいましたが、覚えておくとどこかで役に立つかもしれません。</p>
<h2 id="-">以上</h2>
<p>管理画面が使いにくいとWordPressを導入する意味が薄れてしまいますので、管理画面のカスタマイズ方法は出来るだけ仕入れて使いやすい管理画面を作れるようにしたいですね。</p>
<p>以上、たにっぱでした〜</p>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/wp_quick_delete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keyboard Maestro（マクロツール）でテキスト抽出を効率化</title>
		<link>https://taneppa.net/keyboard_maestro/</link>
		<comments>https://taneppa.net/keyboard_maestro/#comments</comments>
		<pubDate>Mon, 28 Mar 2016 05:37:28 +0000</pubDate>
		<dc:creator>tanippa!</dc:creator>
				<category><![CDATA[Web制作]]></category>
		<category><![CDATA[効率化]]></category>

		<guid isPermaLink="false">https://taneppa.net/?p=2860</guid>
		<description><![CDATA[テキスト抽出を効率化出来る「Keyboard Maestro」というマクロツールに関して紹介します。]]></description>
				<content:encoded><![CDATA[<p>Photoshopのテキスト抽出に関しては、以前いろいろプラグイン等を探してみたものの、結局手作業でテキストを一つ一つコピペしていくのが早いという結論に至ったため、長らく完全手動での抽出を行っていました。</p>
<p>ところが、最近Keyboard Maestroというマクロツールを見つけ、完全自動化とまでは行かないものの抽出の効率化が出来るようになったためご紹介したいと思います。</p>
<h2>Keyboard Maestro？</h2>
<p><a href="http://www.keyboardmaestro.com/main/" target="_blank">Keyboard Maestro</a>はマクロツールです。</p>
<p>マクロツールとは何かというと、特定の一連の作業をキーボードショートカットに割り当てて、設定したキーボードショートカットを押すだけで一連の作業を勝手にしてくれるようにするツールです。</p>
<p>言葉だけじゃわかりにくいと思いますので、実際にデモを見てみましょう。</p>
<h2>デモ</h2>
<p><a href="https://taneppa.net/wp-content/uploads/2016/03/Untitled.gif"><img class="alignnone size-full wp-image-2861" alt="KeyboardMaestro" src="https://taneppa.net/wp-content/uploads/2016/03/Untitled.gif" width="1854" height="999" /></a></p>
<p>実際にKeyboard Maestroを使用して抽出している風景です。</p>
<p>何をしているかというと、「テキストを選択」→「F1キーを押す（すると指定したテキストファイルにテキストが追加される）」→「次のテキストを選択」→（以下繰り返し）という作業を繰り返しています。</p>
<p>わかりやすいようにゆっくり作業をしていますが、実際はもっとテンポよくコピペが進んでいます。</p>
<p>今までは、</p>
<p>「テキストを選択」→「Ctrl+Aで全選択」→「Ctrl+Cでコピー」→「Escボタンを押す」→「エディタをクリック」→「Ctrl+Vでペースト」→「Photoshopをクリック」→「次のテキストを選択」→　…</p>
<p>という作業を繰り返したのですが、Keyboard Maestroを使って</p>
<p>「Ctrl+Aで全選択」→「Ctrl+Cでコピー」→「Escボタンを押す」→「エディタをクリック」→「Ctrl+Vでペースト」→「Photoshopをクリック」</p>
<p>この作業を「F1キーを押す」だけで実行してくれるようにしてる形です。</p>
<p>今までテキスト１つ抜き出すのに７ステップかかっていたのが、２ステップで済むようになったわけです。めちゃくちゃ便利じゃないですか？</p>
<h2>インストール</h2>
<p><a href="http://www.keyboardmaestro.com/main/" target="_blank">公式サイト</a>からダウンロード・インストールしてください。</p>
<h2>マクロの配布</h2>
<p>実際に自分の手で設定できれば一番いいのですが、設定方法がややこしいので、インポートして使えるマクロファイルを配布します。</p>
<p><a href="https://taneppa.net/wp-content/uploads/2016/03/Extract-target-txt.zip" target="_blank">ここからダウンロード</a></p>
<p>ダウンロードしたファイルを解凍し、出てくる「Extract target txt.kmmacros」というファイルをダブルクリックすればテキスト抽出のためのマクロが追加されます。</p>
<p>抽出したい文字を文字ツールで選択後F1キーを押すと、選択したテキストがデスクトップの「extract.txt」ファイルに追加されます。（特にextract.txtをエディタで開く必要はありません。デスクトップにextract.txtが無い場合も勝手に作ってくれます。）</p>
<p>興味があれば、是非Keyboard Maestroの使い方を調べて実際に自分で設定してみることをオススメします。テキスト抽出以外にも考え方次第で色々な場面で応用が効きそうなツールです。</p>
<h2>以上</h2>
<p>自分自身がMacユーザーなので、Windowsで同様の事が出来るソフトが有るかは調べてないのですが、マクロツール自体は結構メジャーなツールで色々な方が作成されていますので、Windowsでも探せば見つかるはずなので是非調べてみてください。</p>
<p>マークアップはかなり手作業で無理矢理やってる部分も多く、まだ試行錯誤すれば効率化出来る部分が残っていると思うのでどんどん効率化していきたい次第です。</p>
<p>以上、たにっぱでした〜</p>
]]></content:encoded>
			<wfw:commentRss>https://taneppa.net/keyboard_maestro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
