<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Skyward Design Blog</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.skyward-design.net/blog/atom.xml" />
    <id>tag:www.skyward-design.net,2008-10-23:/blog//1</id>
    <updated>2012-02-02T12:48:27Z</updated>
    <subtitle>Webクリエイターとして働くHideki Abeの日記です。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.12</generator>

<entry>
    <title>CKEditor for Movable TypeでMTタグの入力を可能にする（エンティティ化の抑止）</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000129.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.129</id>

    <published>2012-02-02T12:47:30Z</published>
    <updated>2012-02-02T12:48:27Z</updated>

    <summary>Movable Typeにおいて、CKEditorを適用したリッチテキストエディタ内にMTタグ（テンプレートタグ）を書くと、デフォルトではエンティティ化されてしまいMTタグとして機能しません。そこでフォーマットを「なし」にせず、「リッチテキスト」のままでMTタグとして扱う方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="カスタマイズ" label="カスタマイズ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>Movable Typeにおいて、<a href="http://tec.toi-planning.net/mt/ckeditor/ckeditor-for-movable-type-1073/">CKEditor for Movable Type</a>を適用したリッチテキストエディタ内にMTタグ（テンプレートタグ）を記述することはできるだけ避けたいことではありますが、ページの構成によってはやむを得ずMTタグを記述しなければならない状況が発生することがあります。</p>
<pre><code>&lt;!-- MTタグの例 --&gt;
&lt;$mt:SetVar name=&quot;category&quot; value=&quot;中学1年&quot;$&gt;
&lt;$mt:Include module=&quot;開設科目リスト&quot;$&gt;</code></pre>
<p>しかし、ソース表示に変更してMTタグを貼り付け、WYSIWYG表示に変更すると、下記のようにMTタグがエンティティ化され、MTタグとして機能しない状態に陥ります。</p>
<p><img src="/blog/images/entry/20120202_01.png" width="580" height="215" alt="MTタグがエンティティ化されたソースの例" /></p>
<p>フォーマットを「なし」にせず、「リッチテキスト」のままでMTタグとして扱う方法はないのでしょうか？</p>
]]>
        <![CDATA[<h3>CKEditorのconfig.jsファイルのカスタマイズで解決</h3>
<p>この事例も以前紹介した記事「<a href="/blog/archives/000106.html">CKEditor for Movable Typeの出力ソースをカスタマイズする方法</a>」と同様に、CKEditorのconfig.jsファイルをカスタマイズすることで解決可能です。</p>
<p>名前空間CKEDITOR.config内に<a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.protectedSource">protectedSource</a>という設定項目があるので、正規表現を利用してMTタグを表す文字列を記述します。<code>&lt;mt:Entries&gt;</code>、<code>&lt;/mt:Entries&gt;</code>、<code>&lt;$mt:EntryTitle$&gt;</code>の3タイプの形式（ブロックタグとファンクションタグ）を<code>&lt;[\$\/]?mt[\s\S]*?&gt;</code>という文字列で表現しています。</p>
<p>これにより、下記のようにソース表示で入力したMTタグが正しく保持されるようになります（正確にはWYSIWYGモードでの編集を不可能にしている）。なお、<strong>WISYWIG表示ではMTタグは全く表示されない</strong>ので注意が必要です。<br />
<img src="/blog/images/entry/20120202_02.png" width="415" height="215" alt="MTタグがそのまま保持されたソースの例" /></p>
<p>カスタマイズ対象ファイルとコード例は下記の通りです。</p>
<h4>カスタマイズ対象ファイル</h4>
<p>/(MTインストールディレクトリ)/mt-static/plugins/CKEditor/ckeditor/config.js</p>
<ul class="note">
<li><span>※</span> MTにログインし、システムのプラグイン設定＞その他の設定に記述することで同様の編集ができるようですが、案件毎に設定するのは手間なので、ファイルを編集する方法を採用しています。</li>
</ul>
<h4>記述するコード</h4>
<pre><code>CKEDITOR.editorConfig = function(config) {
    // MTタグのエンティティ化を抑止
    config.protectedSource.push(/&lt;[\$\/]?mt[\s\S]*?&gt;\n?/g);
};</code></pre>
<ul class="note">
<li><span>※</span> 改行が除去されるのを防止するため、正規表現に改行コードを含めています。</li>
</ul>
<h3>カスタマイズ後のconfig.jsのダウンロード</h3>
<p>Gistに格納しましたのでよろしければご利用ください。</p>
<ul class="linkStyle01">
<li><a href="https://gist.github.com/1121987">Gist −CKEditor for Movable Type向けの設定ファイル</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>文字列を置換するカスタムSass関数を作ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000128.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.128</id>

    <published>2012-01-25T11:54:14Z</published>
    <updated>2012-01-25T12:33:51Z</updated>

    <summary>昨日からの「Ruby初心者が作るカスタムSass関数」シリーズ第2回。今日は文字列を置換するカスタムSass関数を作ってみました。単純な文字列置換と正規表現を利用した文字列置換が可能です。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>昨日の「<a href="/blog/archives/000127.html">Ruby初心者だけどゼロパディングするカスタムSassファンクションを作ってみた</a>」に引き続き、文字列を置換するカスタムSass関数(custom Sass functions)を作ってみました。以前<a href="http://www.yomotsu.net/">ヨモツネット</a>の<a href="http://twitter.com/yomotsu">@yomotsu</a>さんが「<a href="http://www.yomotsu.net/wp/?p=598">SVG GradientをSASS(LESS)で生成してCSS Gradientとして扱うmixin</a>」の中で「<q>SASSで文字列のreplaceができればいいのですが...。</q>」と書かれていたので、需要があるかなと思った次第です。</p>
<ul class="note">
<li><span>※</span> "custom Sass functions"を昨日は「カスタムSassファンクション」と訳したのですが、今日からは「カスタムSass関数」と訳すことにします。「カスタムSass関数」の方が分かりやすく、しっくりくる気がするので...。</li>
</ul>
]]>
        <![CDATA[<h3>関数のコード</h3>
<pre><code>require &quot;sass&quot;

module SkywardDesignFunctions
    def str_replace(search_cond, replace_str, str)
        assert_type search_cond, :String
        assert_type replace_str, :String
        assert_type str, :String

        if (/\/.+\// =~ search_cond.value) then
            search_cond.value.gsub!(/\//, &quot;&quot;)
            retVal = str.value.gsub(/#{search_cond.value}/, replace_str.value)
        else
            retVal = str.value.sub(search_cond.value, replace_str.value)
        end

        Sass::Script::String.new(retVal)
    end
end

module Sass::Script::Functions
    include SkywardDesignFunctions
end</code></pre>
<ul class="note">
<li><span>※</span> <a href="#download">GitHubからダウンロード</a>できます。</li>
</ul>
<h3>仕様</h3>
<p>下記のように引数を指定して呼び出します。</p>
<pre><code>str-replace(&quot;検索文字列&quot;, &quot;置換文字列&quot;, &quot;検索・置換対象文字列&quot;)</code></pre>
<h4>最初にマッチした文字のみ置換</h4>
<pre><code>// 呼び出し
str-replace(&quot;o&quot;, &quot;+&quot;, &quot;Hello World&quot;)

// 結果
Hell<em>+</em> World</code></pre>
<h4>正規表現で置換</h4>
<p>検索文字列を「<code>/</code>」で挟むと、正規表現で指定したものとして扱います。</p>
<pre><code>// 呼び出し
str-replace(&quot;/o/&quot;, &quot;+&quot;, &quot;Hello World&quot;)

// 結果
Hell<em>+</em> W<em>+</em>rld</code></pre>
<h3>使用方法</h3>
<p>昨日のゼロパディング関数と同じですが、再掲します。</p>
<ol class="listStyle01">
<li>上記コードを任意のディレクトリに任意の名前で保存するか、<a href="#download">GitHubからダウンロード</a>します（例：<kbd>skyward_design.rb</kbd>）。</li>
<li>置換したい場面で<code>str-replace(&quot;検索文字列&quot;, &quot;置換文字列&quot;, &quot;検索・置換対象文字列&quot;)</code>と記述します。例えば次のようなコードです。
<pre><code>$tmp: &quot;&quot;;
.sample:after{
	$tmp: str-replace(&quot;o&quot;, &quot;+&quot;, &quot;Hello World&quot;);
	content: "#{$tmp}";
}
</code></pre></li>
<li>次のように-rオプションでカスタムSass関数のファイルを指定してコンパイルします。
<pre><code>sass sample.scss sample.css <em>-r skyward_design.rb</em></code></pre></li>
</ol>
<h4>Compassを使っている場合</h4>
<p><a href="http://compass-style.org/">Compass</a>を使っている場合はconfig.rbに次のコードを追加します。コンパイルのコマンドは<code>compass watch(compass compile)</code>でOKです。</p>
<pre><code>require "skyward_design.rb"</code></pre>
<div id="download">
<h3>ダウンロード</h3>
<p>昨日のzeropadding関数と今日のstr-replace関数をまとめたモジュールをGitHubに置きましたのでご利用下さい。</p>
<ul class="linkStyle01">
<li><a href="https://github.com/hideki-a/SassFunctions" onclick="_gaq.push(['_trackEvent', 'Blog', 'Download', 'Sass-Functions']);">Skyward-Design-Sass-Functions - GitHub</a></li>
</ul>
<ul class="note">
<li><span>※</span> 今後仕様が変更になる可能性があることを予めご了承下さい。</li>
</ul>
</div><!-- /#download -->
]]>
    </content>
</entry>

<entry>
    <title>Ruby初心者だけどゼロパディングするカスタムSassファンクションを作ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000127.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.127</id>

    <published>2012-01-24T12:05:41Z</published>
    <updated>2012-01-31T12:13:39Z</updated>

    <summary>Twitterで「Sassを書いている時にゼロパディング（ゼロ埋め）したいんだけど...」という趣旨のツイートを見たのがきっかけで、ゼロパディングするカスタムSassファンクションを考えてみました。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>Twitterで「Sassを書いている時にゼロパディング（ゼロ埋め）したいんだけど...」という趣旨のツイートを見て（頻繁にありそうな話ですね）、次のようなコードを書きました。</p>
<ul class="note">
<li><span>※</span> width: 2em;はアテです。</li>
</ul>
<pre><code>// SCSS
$tmp: &quot;&quot;;
@for $i from 1 through 3 {
	@if $i &lt; 10 {
		$tmp: &quot;0#{$i}&quot;;
	} @else {
		$tmp: $i;
	}
	.item-#{$tmp} { width: 2em; }
}

// CSS
.item-01{ width:2em; }
.item-02{ width:2em; }
.item-03{ width:2em; }</code></pre>
<p>ただ、これだと汎用性・再利用性が悪いので、カスタムSassファンクションを考えてみました。</p>
]]>
        <![CDATA[<h3>作成したカスタムSassファンクション</h3>
<p><a href="http://www.seancolombo.com/">SeanColombo.com</a>の<a href="http://www.seancolombo.com/2010/07/28/how-to-make-and-use-a-custom-sass-function/">How to make (and use) a custom SASS function</a>を参考に試行錯誤しながらコードを書いたところ、次のように仕上がりました。</p>
<pre><code>require &quot;sass&quot;

module SkywardDesignFunctions
    def zeropadding(beam, i)
        assert_type beam, :Number
        assert_type i, :Number
        
        retVal = sprintf(&quot;%0&quot; + beam.to_s + &quot;d&quot;, i)
        Sass::Script::String.new(retVal)
    end
end

module Sass::Script::Functions
    include SkywardDesignFunctions
end</code></pre>
<ul class="note">
<li><span>※</span> モジュール名は良い名前が浮かばなかったので、暫定的に付けました。</li>
<li><span>※</span> <a href="#download">GitHubからダウンロード</a>できます。</li>
</ul>
<h3>使用方法</h3>
<ol class="listStyle01">
<li>上記コードを任意のディレクトリに任意の名前で保存するか、<a href="#download">GitHubからダウンロード</a>します（例：<kbd>skyward_design.rb</kbd>）。</li>
<li>ゼロパディングしたい場面で<code>zeropadding(変換後の桁数, 変換対象の値/変数)</code>と記述します。例えば次のようなコードです。
<pre><code>$tmp: "";
@for $i from 1 through 3 {
	$tmp: zeropadding(2, $i);
	.item-#{$tmp} { width: 2em; }
}</code></pre></li>
<li>次のように-rオプションでカスタムSassファンクションのファイルを指定してコンパイルします。
<pre><code>sass sample.scss sample.css <em>-r skyward_design.rb</em></code></pre></li>
</ol>
<p>コマンドが長い...、という場合は「バッチファイル・シェルスクリプト」の出番です。「<a href="/blog/archives/000118.html#batchfile">サイトのルートディレクトリをコマンドラインで簡単に開き、compassを実行する方法</a>」の項が参考になると思います（<code>compass watch</code>をSassのコマンドに置き換えるだけです）。</p>
<h4>Compassを使っている場合</h4>
<p><a href="http://compass-style.org/">Compass</a>を使っている場合はconfig.rbに次のコードを追加します。後はいつものように<code>compass watch(compass compile)</code>でOKです。</p>
<pre><code>require "skyward_design.rb"</code></pre>
<div id="download">
<h3>ダウンロード</h3>
<p>zeropadding関数と（翌日の記事の）str-replace関数をまとめたモジュールをGitHubに置きましたのでご利用下さい。</p>
<ul class="linkStyle01">
<li><a href="https://github.com/hideki-a/SassFunctions" onclick="_gaq.push(['_trackEvent', 'Blog', 'Download', 'Sass-Functions']);">Skyward-Design-Sass-Functions - GitHub</a></li>
</ul>
<ul class="note">
<li><span>※</span> 今後仕様が変更になる可能性があることを予めご了承下さい。</li>
</ul>
</div><!-- /#download -->
]]>
    </content>
</entry>

<entry>
    <title>SassとPhotoshopのスクリプトで、クロスブラウザなCSS3グラデーションを簡単に実現する</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000126.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.126</id>

    <published>2012-01-21T09:50:24Z</published>
    <updated>2012-01-22T00:00:29Z</updated>

    <summary>CSSのみでグラデーションが生成できるlinear-gradient関数は便利ですが、実際に利用しようとするとビジュアルデザイン上で設定されたグラデーション設定（カラー・位置）を、色の数だけコピ＆ペーストしなければならないなど、CSSを記述する際の負担が増えます。そこで、SassとPhotoshopのスクリプトを利用して、クロスブラウザなCSS3グラデーションを簡単に実現する方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="photoshop" label="Photoshop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>CSSのみでグラデーションが生成できるlinear-gradient関数は便利ですが、実際に利用しようとすると以下のような課題が発生します。</p>
<ul class="listStyle01">
<li>ベンダープリフィックス（<code>-moz-</code>や<code>-webkit-</code>）を付けた記述をいくつか書かなければならない</li>
<li>ビジュアルデザイン上（PSD上）で設定されたグラデーション設定（カラー・位置）を、色の数だけコピ＆ペーストしなければならない</li>
</ul>
<p>これらの課題はグラデーションの数が増えれば増えるほど負担になってきます。そこで、SassとPhotoshopのスクリプトを利用して、クロスブラウザなCSS3グラデーションを簡単に実現する方法をご紹介します。</p>
<h3>対応ブラウザ</h3>
<ul class="listStyle01">
<li>Internet Explorer(6〜10)</li>
<li>Firefox</li>
<li>Safari</li>
<li>Google Chrome</li>
<li>Opera</li>
</ul>
<ul class="note">
<li><span>※</span> IE8以下は<a href="http://css3pie.com/">CSS3 PIE</a>でサポート。</li>
</ul>
]]>
        <![CDATA[<h3>Sassのmixinの準備</h3>
<p>まずSassのmixinを準備します。私が作成しようかと思ったのですが、「<a href="http://atnd.org/events/21919">Less &amp; Sass Advent calendar 2011</a>」で<a href="http://www.yomotsu.net/">ヨモツネット</a>の<a href="http://twitter.com/yomotsu">@yomotsu</a>さんが寄稿された「<a href="http://www.yomotsu.net/wp/?p=598">SVG GradientをSASS(LESS)で生成してCSS Gradientとして扱うmixin</a>」の中でメジャーなブラウザに対応したmixinを公開されています（記事後半にmixin本体が紹介されています）。こちらをSCSSファイルにコピーしてください。</p>
<h4>mixinの一部修正</h4>
<p>グラデーションの方向を示すキーワードの後ろに入るカンマが重複して出力されます。そのため、<code>$angle_old:</code>の後ろのカッコ内にあるカンマを消してください（下記コードの赤字で強調したカンマ3カ所です）。</p>
<pre><code>	@if $angle == "to left"{
	$angle_old:'right<em>,</em>';
	$angle_webkit:'right top, left top';
	$angle_svg:'%20x2%3d%22100%25%22';
	}
	@if $angle == "to top"{
	$angle_old:'bottom<em>,</em>';
	$angle_webkit:'left bottom, left top';
	$angle_svg:'%20x2%3d%220%22%20y1%3d%22100%25%22';
	}
	@if $angle == "to right"{
	$angle_old:'left<em>,</em>';
	$angle_webkit:'left top, right top';
	$angle_svg:'';
	}</code></pre>
<h4>compass・Scoutを利用している方へ</h4>
<p><a href="http://compass-style.org/">compass</a>・<a href="http://mhs.github.com/scout-app/">Scout</a>を利用している場合は、上記mixinをそのまま利用しようとすると、次のような<strong>「Not a valid color stop」エラーが発生</strong>すると思います。</p>
<pre><code>error _scss/sample.scss (Line 76: Not a valid color stop: Sass::Script::String: #8ac082 0%,#ffffff 50%,#bec5fc 100%)</code></pre>
<p>これは、compassに含まれるgradient_support.rb内のliniar-gradientメソッドを呼び出してしまうことが原因と思われます。そのため、mixinを次のように変更することでエラー回避が可能です。</p>
<pre><code>@mixin linear-gradient($angle, $color1, $offset1, $color2, $offset2: 100, $color3: null, $offset3: 100, $color4: null, $offset4: 100, $color5: null, $offset5: 100){
	<em>$type: 'linear';</em>

	【途中省略（変更なし）】

	-pie-background: <em>#{$type}</em>-gradient(#{$angle_old},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
	background-image: url(data:image/svg+xml,%3c%3fxml%20version%3d%221%2e0%22%3f%3e%3csvg%20xmlns%3d%22http%3a%2f%2fwww%2ew3%2eorg%2f2000%2fsvg%22%20width%3d%22100%25%22%20height%3d%22100%25%22%3e%3cdefs%3e%3clinearGradient%20id%3d%22G%22#{$angle_svg}%3e#{$color-stop1_svg}#{$color-stop2_svg}#{$color-stop3_svg}#{$color-stop4_svg}#{$color-stop5_svg}%3c%2flinearGradient%3e%3c%2fdefs%3e%3crect%20width%3d%22100%25%22%20height%3d%22100%25%22%20fill%3d%22url%28%23G%29%22%2f%3e%3c%2fsvg%3e);
	background-image: -webkit-gradient(linear,#{$angle_webkit},#{$color-stop1_webkit}#{$color-stop2_webkit}#{$color-stop3_webkit}#{$color-stop4_webkit}#{$color-stop5_webkit});
	background-image: -webkit-<em>#{$type}</em>-gradient(#{$angle_old},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
	background-image: -moz-<em>#{$type}</em>-gradient(#{$angle_old},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
	background-image: -ms-<em>#{$type}</em>-gradient(#{$angle_old},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
	background-image: -o-<em>#{$type}</em>-gradient(#{$angle_old},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
	background-image: <em>#{$type}</em>-gradient(#{$angle},#{$color-stop1_css}#{$color-stop2_css}#{$color-stop3_css}#{$color-stop4_css}#{$color-stop5_css});
}</code></pre>
<ul class="note">
<li><span>※</span> ベンダープリフィックス付の所は修正の必要がないのですが、記述を揃えるためにあえて変数に置き換えています。</li>
</ul>
<h3>Photoshopのスクリプトの準備</h3>
<p>当ブログで紹介している「<a href="http://www.skyward-design.net/blog/archives/000102.html">[β版] Photoshopのグラデーションオーバーレイ設定を取得するスクリプト</a>」をバージョンアップし、グラデーション設定情報表示画面内にSassの@include命令を出力するようにしました。この@include命令は、@yomotsuさんが作成されたmixinに対応するようにカスタマイズしてあります。下記よりダウンロードし、インストール場所に保存してください。</p>
<h4>ダウンロード</h4>
<ul class="linkStyle01">
<li><a href="/blog/downloads/20120121/getGradientInfo_0.3.2.zip" onclick="_gaq.push(['_trackEvent', 'Blog', 'Download', 'getGradientInfo_0.3.2.zip']);">getGradientInfo_0.3.2.zip</a></li>
</ul>
<h4>インストール場所</h4>
<dl class="listStyle01">
<dt>Windows</dt>
<dd>C:\Program Files\Adobe\Adobe Photoshop （バージョン）\プリセット\スクリプト\</dd>
<dt>Macintosh</dt>
<dd>/Applications/Adobe Photoshop  （バージョン）/Presets/Scripts/</dd>
</dl>
<h3>使用方法</h3>
<ol class="listStyle01">
<li>PSDファイルを開き、グラデーションオーバーレイが設定されたレイヤーを選択した上で[ファイル]-[スクリプト]-[グラデーション設定の取得]を選択します。<br />
<img src="/blog/images/entry/20120121_01.png" alt="Photoshop CS3でのメニュー表示例" width="550" height="248" /></li>
<li>ポップアップ画面が現れグラデーション設定情報が表示されるので、[Sass]の下に表示された<code>@include linear-gradient...</code>をコピーします。<br />
<img src="/blog/images/entry/20120121_02.png" alt="グラデーション設定情報の表示例" width="486" height="258" /></li>
<li>SCSSの目的の場所にペーストします。
<pre><code>.sample{
  <em>@include linear-gradient(&quot;to top&quot;, &quot;8ac082&quot;, 0, &quot;ffffff&quot;, 50, &quot;c0c6fc&quot;, 100);</em>
  behavior: url(/shared/css/PIE.htc);
}</code></pre>
</li>
<li>SCSSをコンパイルしてCSSを生成し、ブラウザでレンダリングを確認します。<br />
<img src="/blog/images/entry/20120121_03.png" alt="Internet Explorer 8でのレンダリング例" width="415" height="366" /></li>
</ol>
<p>以上で完了です。簡単ですよね？　あっという間にCSS3グラデーションのスタイル付けが行えました。CSS3でグラデーションを記述する際にぜひお試し下さい。</p>
<h3>補足</h3>
<ul class="note">
<li><span>※</span> グラデーション設定情報の取得はあらゆる角度にも対応していますが、mixin側の制約（ブラウザの実装の差異でもあります）により、グラデーションの方向が<code>to top/right/bottom/left</code>の場合（角度ではなくキーワードになっている場合）のみ対応となります。また、グラデーションの色は5色までとなります。</li>
<li><span>※</span> LESSについては詳しく知らないのですが、応用可能かと思います。</li>
<li><span>※</span> PIE.htcを読み込む部分もmixinにしておくと、メンテナンスやPIE.phpに変更しなければならない状況の時便利です（本稿では詳細な説明をいたしません）。</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>CSSグラデーションの構文・解釈変更とブラウザの実装状況について</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000125.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.125</id>

    <published>2012-01-20T12:02:21Z</published>
    <updated>2012-01-20T12:15:09Z</updated>

    <summary>「[β版] Photoshopのグラデーションオーバーレイ設定を取得するスクリプト」を更新する際、CSSグラデーション（linear-gradient()）の構文変更が最新のブラウザではどう扱われているのか気になり、実装状況の確認を行いましたのでまとめてみました。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>「<a href="/blog/archives/000102.html">[β版] Photoshopのグラデーションオーバーレイ設定を取得するスクリプト</a>」を更新する際、CSSグラデーション（<code>linear-gradient()</code>）の構文変更が最新のブラウザではどう扱われているのか気になり、実装状況の確認を行いました。</p>
<h3>構文・解釈の変更内容</h3>
<h4>キーワードの構文変更</h4>
<p>グラデーションの起点を示していたものが、2011年9月8日付の草案より"<code>to bottom</code>"のようにグラデーションの方向を示すようになりました（"to"というワードと共に指定する）。つまり、上から下へのグラデーションは従来<code>top</code>と記述していましたが、<code>to bottom</code>と記述するようになりました。</p>
<pre><code>// 2012年1月12日付最終草案に基づく記述方法
background-image: linear-gradient(to bottom, black, white);</code></pre>
<h4>角度表記の解釈の変更</h4>
<p>水平右方向を0°とし反時計回りに回転するものとなっていたものが、2011年7月12日付の草案より方位角（0°は下から上で時計回りに回転）となりました。つまり、<code>0deg</code>は左から右へのグラデーションを表していたものが、下から上へのグラデーションを表すものになっています。</p>
]]>
        <![CDATA[<h3>ブラウザの実装状況</h3>
<p>PC向けブラウザにて確認を行いました。</p>
<h4>確認したブラウザ</h4>
<ul class="listStyle01">
<li>Internet Explorer 10.0.8103.0</li>
<li>Firefox 10.0</li>
<li>Safari 5.12(WebKit r105480)</li>
<li>Opera 11.61</li>
<li>Google Chrome(18.0.1012.1 canary)</li>
</ul>
<h4>確認結果</h4>
<p>現在のところ、ベンダープリフィックスなしの記述はどのブラウザも解釈しませんでした。そこで、ベンダープリフィックスを付加した記述でレンダリングを確認しました。</p>
<p>まず、Firefox 10.0(Beta)・Opera 11.61ですが、キーワードの解釈に関してはtoあり/なしどちらの構文も解釈するようになっていました。つまり次の2つの記述方法は、同じグラデーションのレンダリングとなります。</p>
<pre><code>// 従来の記述方法
background-image: linear-gradient(bottom, black, white);

// 2012年1月12日付最終草案に基づく記述方法
background-image: linear-gradient(to top, black, white);</code></pre>
<p>角度の解釈に関しては、古い解釈のままでレンダリングされました。つまり<code>0deg</code>は左から右へのグラデーションとなります。</p>
<p>次にその他のブラウザ（Internet Explorer 10、Safari 5.12、Google Chrome 18.0.1012.1）ですが、キーワードに関して、toありの構文はサポートされていませんでした。また、角度の解釈に関しては、古い解釈のままでレンダリングされました。</p>
<h4>今後について</h4>
<p>Firefoxに関しては、ベンダープリフィックスを外した記述が実装される際にtoなしの構文はサポートされなくなる計画のようです。角度の解釈についても、ベンダープリフィックス付きの記述の場合は後方互換性を考慮して従来の解釈方法を採用し続け、ベンダープリフィックスが外れる際に最新の仕様通りの解釈に変更されるものと予想しています。</p>
<h3>まとめ</h3>
<p>現時点でクロスブラウザなグラデーションの記述は、ベンダープリフィックスを伴った記述の場合は最新の草案に沿った構文ではなく従来の構文で記述を行い、ベンダープリフィックスを伴わない記述の場合は最新の草案に沿った構文で記述をしておくのがベターと考えます。</p>
<pre><code>.sample{
  background-image: -webkit-gradient(linear, left bottom, left top, from(black), to(white));
  background-image: -webkit-linear-gradient(bottom, black, white);
  background-image: -moz-linear-gradient(bottom, black, white);
  background-image: -o-linear-gradient(bottom, black, white);
  background-image: -ms-linear-gradient(bottom, black, white);
  background-image: linear-gradient(to top, black, white);
}</code></pre>
<h3>参考サイト</h3>
<ul class="listStyle01">
<li><a href="http://standards.mitsue.co.jp/">Web標準Blog</a></li>
<li><a href="https://developer.mozilla.org/en/CSS/linear-gradient">linear-gradient - MDN</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>DreamweaverでSassを使う時にZen Codingを利用可能にするカスタマイズ</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000124.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.124</id>

    <published>2012-01-14T03:55:11Z</published>
    <updated>2012-01-16T05:21:37Z</updated>

    <summary>DreamweaverでSassを使う（SCSSを書く）時、Zen Codingを利用しようとしてもデフォルトでは上手く動作しません。そこで、Zen Codingのコアファイルをカスタマイズし、SCSSを書く際もZen Codingが利用できるようにする方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dreamweaver" label="Dreamweaver" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>DreamweaverでSassを使う（SCSSを書く）時、<a href="http://code.google.com/p/zen-coding/">Zen Coding for Dreamweaver</a>を利用しようとしてもデフォルトでは上手く動作しません。調べてみると、.scssファイルを編集している際のドキュメント解析モードが「<code>text</code>」と判定されるためです。</p>
<p>そこで、Zen Codingのコアファイルをカスタマイズし、SCSSを書く際もZen Codingが利用できるようにする方法をご紹介します。</p>
]]>
        <![CDATA[<h3>カスタマイズ方法</h3>
<h4>カスタマイズ対象ファイル</h4>
<dl class="listStyle01">
<dt>Windows</dt>
<dd>C:\Users\（ユーザ名）\AppData\Roaming\Adobe\Dreamweaver CS（バージョン番号）\ja_JP\Configuration\Commands\ZenCoding\zen_editor.js</dd>
<dt>Mac</dt>
<dd>/Users/（ユーザ名）/Library/Application Support/Adobe/Dreamweaver CS（バージョン番号）/ja_JP/Configuration/Commands/ZenCoding/zen_editor.js</dd>
</dl>
<h4>カスタマイズ内容</h4>
<p>zen_editor.jsの299行目（v.0.7.5の場合）を下記のように変更します。</p>
<pre><code><em>			if (dom.URL.lastIndexOf('.scss') > -1) {
				parse_mode = 'css';
			}</em>
			
			return parse_mode;</code></pre>
<p>コードの内容ですが、dom.URLで取得したファイルパスに「.scss」が含まれる場合はZen Codingのパースモードを「css」とするものです。<strong>判別にファイルパスを利用するので、先に拡張子.scssでファイルを保存してください。</strong></p>
<ul class="note">
<li><span>※</span> 普段MacのCodaでSCSSを書いているので（Codaの補完を利用しています）、簡単な動作検証しかできておりません。ご了承ください。</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>Google カレンダーを任意の色に変更してWebページに埋め込むテクニック</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000123.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.123</id>

    <published>2012-01-13T12:19:09Z</published>
    <updated>2012-01-13T12:33:00Z</updated>

    <summary>U-notez Blogの記事「Easy Color Customization for Embedded Google Calendars」で配布されているプログラムを利用し、Google カレンダーのカレンダー表示部分の配色を変更してWebページに埋め込む方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="カスタマイズ" label="カスタマイズ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>Webページ上に「Google カレンダー」を埋め込むと、スケジュールの公開・共有が手軽に行えるので便利かと思います。</p>
<p>埋め込みの際、「Google カレンダー埋め込み支援ツール」にて背景色の指定が可能ですが、背景色の指定を変更してもタイトルやカレンダーの表示を切り替えるインタフェース周辺のみしか適用されず、肝心のカレンダー部分はブルー系の配色のままです。</p>
<p>そこで、<a href="http://www.unitz.com/">U-notez Blog</a>の記事「<a href="http://www.unitz.com/u-notez/2009/04/color-customization-for-embedded-google-calendars/">Easy Color Customization for Embedded Google Calendars</a>」で配布されているプログラムを利用し、カレンダー部分の配色を変更してWebページに埋め込む方法をご紹介します。</p>
]]>
        <![CDATA[<h3>表示サンプル</h3>
<dl class="listStyle01">
<dt>通常の埋め込み時</dt>
<dd><img src="/blog/images/entry/20120113_01.png" width="550" height="474" alt="Google カレンダー埋め込み支援ツールで出力した埋め込みコードを利用して埋め込んだカレンダーの表示例" /></dd>
<dt>プログラムを利用した埋め込み時</dt>
<dd><img src="/blog/images/entry/20120113_02.png" width="549" height="475" alt="gcalendar-wrapper.phpを利用して埋め込んだカレンダーの表示例" /></dd>
</dl>
<h3>埋め込み手順</h3>
<ol class="listStyle01">
<li>Google カレンダー埋め込み支援ツール（詳細はGoogleのヘルプ「<a href="http://support.google.com/calendar/bin/answer.py?hl=ja&amp;answer=41207">ウェブサイトへの埋め込み</a>」を参照）にて埋め込みコードを取得します。その際、背景色はデフォルト（白）のままにしておきます。</li>
<li><a href="http://www.unitz.com/u-notez/2009/04/color-customization-for-embedded-google-calendars/">gcalendar-wrapperをダウンロード</a>します。</li>
<li>ダウンロードしたファイルを解凍しgcalendar-wrapper.phpを開くと23行目から30行目で色の設定があるので、任意の色に書き換えます。
<pre><code>/**
 * Set your color scheme below
 */
$calColorBgDark      = '#c3d9ff';	// 濃い方の背景色
$calColorTextOnDark  = '#000000';	// 濃い背景色上のテキスト色（曜日・タイムゾーン）
$calColorBgLight     = '#e8eef7';	// 薄い背景色（日付の背景）
$calColorTextOnLight = '#000000';	// 薄い背景色上のテキスト色（日付）
$calColorBgToday     = '#ffffcc';	// 本日を表す背景色</code></pre></li>
<li>埋め込みコード内にある<code>iframe</code>のsrc属性値を次のように書き換えます。
<pre><code>&lt;!-- 変更前 --&gt;
src=&quot;https://www.google.com/calendar/b/0/embed?(Google カレンダー埋め込み支援ツールで出力した文字列)&quot;

&lt;!-- 変更後 --&gt;
src=&quot;gcalendar-wrapper.php?(Google カレンダー埋め込み支援ツールで出力した文字列)&quot;</code></pre></li>
<li>カレンダーを埋め込んだHTMLファイルとgcalendar-wrapper.phpをアップロードします。</li>
</ol>
<h3>表示期間変更ボタンの変更</h3>
<p>先に紹介した手順で色の変更を行ってもカレンダーの表示期間を前後に操作するボタンはデフォルトの色のままです。これはGoogleのサーバーにアップロードされている画像を読み込む指定になっているためです。</p>
<p>これを変更するには、ボタン画像を用意し、gcalendar-wrapper.phpの116行目付近を下記スタイルを記述し、デフォルトのスタイリングを上書きします。画像のパスは絶対URIで指定して下さい。</p>
<pre><code>.navBack{
background:url(http://（ドメイン）/images/btn_left.png) no-repeat left top !important;
}

.navForward{
background:url(http://（ドメイン）/images/btn_right.png) no-repeat left top !important;
}

/* week view */</code></pre>
<ul class="note">
<li><span>※</span> GoogleのようにCSSスプライトを利用するとベターです。</li>
</ul>
<h4>表示サンプル</h4>
<p><img src="/blog/images/entry/20120113_03.png" width="308" height="153" alt="表示期間変更ボタン変更後の表示例" /></p>]]>
    </content>
</entry>

<entry>
    <title>CSSのフォントサイズ指定作業をSassで簡略化する</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000122.html" />
    <id>tag:www.skyward-design.net,2012:/blog//1.122</id>

    <published>2012-01-07T04:13:51Z</published>
    <updated>2012-01-07T07:27:15Z</updated>

    <summary>CSSでフォントサイズを相対値（em・rem・%）で指定する時に発生する計算は意外と手間なものです。本記事では、その作業をSassで簡略化する方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>CSSでフォントサイズを相対値（em・rem・%）で指定する時に発生する計算は意外と手間なものですよね。私は<a href="http://fordinteractive.com/tools/emchart/">EmChart</a>を見て値を拾っていますが、細かいチャートから目的の値を探すのは若干大変です。</p>
<p>Sassで簡単にすることはできないかなと思っていたところ、<a href="http://compass-style.org/">Compass</a>の拡張フレームワークである「<a href="http://stitchcss.com/">Stitch - A CSS Pattern Framework for Compass</a>」の中に<a href="http://stitchcss.com/#relative_size"><code>relative-size</code>関数</a>を見つけました。まさに思い通りの計算値＋単位を出力してくれる関数です。</p>
<p class="mb-min">下記のように、<code>relative-size(目的のサイズ,<del>元のサイズ</del>継承したサイズ)</code>を指定すると</p>
<pre><code>body {
  font-size: relative-size(12,16);
}</code></pre>
<p class="mb-min">em値となって返ってきます。これは便利！　ちなみに小数点以下は3桁まで出力されるようです。</p>
<pre><code>body {
  font-size: 0.75em
}</code></pre>
<ul class="note">
<li><span>※</span> 「元のサイズ」という表現がわかりにくいとのご指摘を頂きましたので、「継承したサイズ」修正させて頂きました。</li>
</ul>
]]>
        <![CDATA[<h3>関数の解説と導入に関して</h3>
<p>Stitchの_rem.scssに記述された関数を見てみると、非常に簡単なものでした。</p>
<pre><code>@function relative-size($size,$context,$unit:em) {
	@return #{$size/$context}$unit;
}</code></pre>
<p>Stitchで他に使いたい関数がない場合や、CSS HappyLifeさんの「<a href="http://css-happylife.com/archives/2012/0107_0000.php">【Sassを覚えよう！Vol.3】一番カンタンな環境構築（Scout編）</a>」で紹介されているScoutを使われている方は、この関数だけをSCSSファイルにコピーして使わせて頂くのが簡単かなと思います。<code>relative-size</code>という名前も少し長いので、短い名前にするカスタマイズをするのも良いかもしれません。あと<code>line-height</code>用にカスタマイズをしたりと。</p>
<ul class="note">
<li><span>※</span> ライセンスが明記されていませんが...。</li>
</ul>
<p>Stitchを導入されたい方は、<a href="http://stitchcss.com/#usage">公式ページのUsage</a>をご覧下さい。_rem.scssのみインポートすることも可能です。</p>
<h3>%指定への対応</h3>
<p>私は普段<code>em</code>で指定するので問題ないのですが、<code>%</code>を使う場合もある場合は次のようにカスタマイズすると良いようです。</p>
<dl class="listStyle01">
<dt>関数</dt>
<dd>
<pre><code>@function fs($size, $context, $unit:em){
	@if $unit == '%' {
		@return #{$size/$context*100}#{$unit};
	} @else {
		@return #{$size/$context}#{$unit};
	}
}</code></pre>
</dd>
<dt>関数の呼び出し</dt>
<dd>
<pre><code>body{
  font-size: fs(13,16,'%');
}</code></pre>
</dd>
</dl>
<h3>補足</h3>
<p>下記のように関数を使わず記述しても上手くいきそうですが、実際には上手くいきません。</p>
<pre><code>body {
  font-size: (12/16)em;
}</code></pre>
<p>単位の前にスペースが入ってしまいパースエラーとなってしまうからです。</p>
<pre><code>body {
  font-size: 0.75 em;
}</code></pre>
]]>
    </content>
</entry>

<entry>
    <title>Sassで出力するCSSファイルを自社のCSS記述ルールに合わせるヒント</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000121.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.121</id>

    <published>2011-12-17T04:00:00Z</published>
    <updated>2012-02-05T03:27:03Z</updated>

    <summary>Sassを利用する際、Sassで出力するCSSを自社のCSS記述ルールに合わせた出力にする簡単な方法はないでしょうか？　本記事では、Sassの「expanded」スタイルのカスタマイズを行い、自社のCSS記述ルールでCSSを出力する方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p><a href="http://atnd.org/events/21919">Less &amp; Sass Advent calendar 2011</a>の17日目は、<a href="http://twitter.com/_hideki_a">@_hideki_a</a>がSassの出力ソースをカスタマイズする方法について書かせていただきます。</p>
<p>3日目の「<a href="http://tech.naver.jp/blog/?p=885">Sass を今すぐ実務で使おうよ！</a>」ほか様々な記事で紹介されている通り、<a href="http://sass-lang.com/">Sass</a>はCSSの設計を強力にサポートしてくれる素晴らしい言語です。しかしながら、学習コストや環境設定など多少のハードルがあり制作チーム全員がすぐに導入するのは難しいという場合や、納品後の運用はクライアントさんが行うためにSassの導入はしてもらえないという場合もあるのではないでしょうか。</p>
<p>そのようなことから、構築時はSassでCSSを設計し、運用ではSassで生成したCSSファイルを直接編集するという場面も想定されます。その際、「従来から決められている社内のCSS記述ルールに沿ったCSSを生成しなければならない」という問題に遭遇する可能性が考えられます。</p>]]>
        <![CDATA[<h3>CSS記述ルールの例</h3>
<p>私が以前所属していた会社では、セレクタの後や値の直前にスペースを入れたり、インデントを入れたりせず、次のように記述するのが一般的なルールでした。</p>
<pre><code>#main{
color:#fff;
background-color:#000;
}

#main p{
width:10em;
}

.foo{
font-size:10px;
font-weight:bold;
text-decoration:underline;
}</code></pre>
<p>他の会社のルールを見ると、{と値の前にスペース1つを入れ、プロパティの前はタブ1つでインデントをすると規定されていました。</p>
<pre><code>#main {
	color: #fff;
	background-color: #000;
}

#main p {
	width: 10em;
}

.foo {
	font-size: 10px;
	font-weight: bold;
	text-decoration: underline;
}</code></pre>
<p>その他、インデントはスペース4つにするなど会社ごとに様々なルールが見られました。Sassで出力するCSSを自社のCSS記述ルールに合わせた出力にする簡単な方法はないでしょうか？</p>
<h3>Sassの「expanded」スタイルのカスタマイズで解決</h3>
<p>先に紹介した記述ルールはどれも<a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style">Sassの出力形式</a>の1つ、「expanded」スタイルに似ています。（セレクタの後ろにスペース1つ、プロパティの前に2スペース。ネストした記述が終わるごとに1つの空行。）</p>
<pre><code>#main {
  color: #fff;
  background-color: #000;
}
#main p {
  width: 10em;
}

.foo {
  font-size: 10px;
  font-weight: bold;
  text-decoration: underline;
}</code></pre>
<p>そこで、この「expanded」スタイルの出力をカスタマイズし、自社の記述ルールに合わせたCSSを出力できるようにする方法をご紹介します。</p>
<h3>カスタマイズ準備</h3>
<p>カスタマイズするのは、Sassを構成するClassの中の「<a href="http://rubydoc.info/gems/sass/3.1.12/Sass/Tree/Visitors/ToCss">Class: Sass::Tree::Visitors::ToCss</a>」になります。実際のファイルは次の場所に格納されています。念のためバックアップを取ってからカスタマイズに入りましょう。</p>
<p>なお、Sassのバージョンによりファイルの内容が若干異なるようです。本記事では、Sass Ver.3.1.11 / 3.1.12をベースに記述してあります。その他のバージョンをご利用の方は、記載内容をよくご確認の上マージして下さい（<a href="#newversion">最新バージョンでのカスタマイズ可否</a>もご覧下さい）。</p>
<dl class="listStyle01">
<dt>Windows</dt>
<dd>C:\Ruby\lib\ruby\gems\(RubyGemsバージョン)\gems\sass-3.1.12\lib\sass\tree\visitors\to_css.rb</dd>
<dt>Mac</dt>
<dd>/Library/Ruby/Gems/(RubyGemsバージョン)/gems/sass-3.1.12/lib/sass/tree/visitors/to_css.rb</dd>
</dl>
<ul class="note">
<li><span>※</span> Macの場合は、ファイルの所有権を自分（ログインしているユーザー）に変更しておいてください。</li>
</ul>
<h4>（2012年1月21日追記）Scoutを利用している方</h4>
<p><a href="http://mhs.github.com/scout-app/">Scout</a>の中にはコマンドラインでインストールするSassが同梱されており、Scoutを使わない場合と同じ手法でカスタマイズ可能です。カスタマイズ対象ファイルは下記となります（Ver.0.5.0の場合）。</p>
<dl class="listStyle01">
<dt>Windows</dt>
<dd>C:\Program Files\Scout\vendor\gems\gems\sass-3.1.7\lib\sass\tree\visitors\to_css.rb</dd>
<dt>Mac</dt>
<dd>/Applications/Scout.app/Contents/Resources/vendor/gems/gems/sass-3.1.7/lib/sass/tree/visitors/to_css.rb</dd>
</dl>
<h3>カスタマイズ例</h3>
<p>カスタマイズするにあたり、expanded以外のスタイルに影響を及ぼさない手法を使うようにしました。to_css.rbファイルはRubyで記述されていますが、コピー＆ペーストでカスタマイズできるようにまとめましたので、気軽にトライしてみてください。</p>
<ul class="note">
<li><span>※</span> ちなみに私もRubyは初めてです。</li>
<li><span>※</span> 行数はデフォルトの状態の行数を示しています。Scoutの場合は行数が若干異なりますが、同じ記述が見つかると思います。</li>
</ul>
<h4>}の後に必ず改行を入れる</h4>
<p>178行目の後に下記を追加します。</p>
<pre><code>      if node.style == :compact
        properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(' ')}
        to_return &lt;&lt; &quot;#{total_rule} { #{properties} }#{&quot;\n&quot; if node.group_end}&quot;
      elsif node.style == :compressed
        properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(';')}
        to_return &lt;&lt; &quot;#{total_rule}{#{properties}}&quot;
<em>      elsif node.style == :expanded
        properties = with_tabs(@tabs + 1) {node.children.map {|a| visit(a)}.join(&quot;\n&quot;)}
        to_return &lt;&lt; &quot;#{total_rule} {\n#{properties}\n}\n&quot;</em>
      else
        properties = with_tabs(@tabs + 1) {node.children.map {|a| visit(a)}.join(&quot;\n&quot;)}
        end_props = (node.style == :expanded ? &quot;\n&quot; + old_spaces : ' ')
        to_return &lt;&lt; &quot;#{total_rule} {\n#{properties}#{end_props}}#{&quot;\n&quot; if node.group_end}&quot;
      end</code></pre>
<h4>{の前の空白を削除する</h4>
<p>178行目の後に下記を追加します。</p>
<pre><code>      if node.style == :compact
        properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(' ')}
        to_return &lt;&lt; &quot;#{total_rule} { #{properties} }#{&quot;\n&quot; if node.group_end}&quot;
      elsif node.style == :compressed
        properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(';')}
        to_return &lt;&lt; &quot;#{total_rule}{#{properties}}&quot;
<em>      elsif node.style == :expanded
        properties = with_tabs(@tabs + 1) {node.children.map {|a| visit(a)}.join(&quot;\n&quot;)}
        to_return &lt;&lt; &quot;#{total_rule}{\n#{properties}\n}#{&quot;\n&quot; if node.group_end}&quot;</em>
      else
        properties = with_tabs(@tabs + 1) {node.children.map {|a| visit(a)}.join(&quot;\n&quot;)}
        end_props = (node.style == :expanded ? &quot;\n&quot; + old_spaces : ' ')
        to_return &lt;&lt; &quot;#{total_rule} {\n#{properties}#{end_props}}#{&quot;\n&quot; if node.group_end}&quot;
      end</code></pre>
<h4>セレクタが1行にまとめて列挙されるのをセレクタごとに改行する</h4>
<p>123行目を下記に置き換えます。</p>
<pre><code>  def visit_rule(node)
    with_tabs(@tabs + node.tabs) do
<em>      rule_separator = node.style == :compressed ? ',' :  node.style == :expanded ? &quot;,\n&quot; : ', '</em></code></pre>
<h4>プロパティの前の空白を削除する</h4>
<p>115行目の後に下記を追加します。</p>
<pre><code>    if node.style == :compressed
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value}&quot;
<em>    elsif node.style == :expanded
      &quot;#{node.resolved_name}: #{node.resolved_value};&quot;</em>
    else
      &quot;#{tab_str}#{node.resolved_name}: #{node.resolved_value};&quot;
    end</code></pre>
<p>また、60行目を下記に置き換えます。</p>
<pre><code>  def visit_comment(node)
    return if node.invisible?
<em>    if node.style == :expanded
      spaces = &quot;&quot;
    else
      spaces = ('  ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
    end</em></code></pre>
<ul class="note">
<li><span>※</span> Scoutの場合は<code>node.resolved_value</code>が<strong><code>node.value</code></strong>となります。</li>
</ul>
<h4>プロパティの前の空白をタブに変更する</h4>
<p>115行目の後に下記を追加します。</p>
<pre><code>    if node.style == :compressed
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value}&quot;
<em>    elsif node.style == :expanded
      &quot;\t#{node.resolved_name}: #{node.resolved_value};&quot;</em>
    else
      &quot;#{tab_str}#{node.resolved_name}: #{node.resolved_value};&quot;
    end</code></pre>
<p>また、60行目を下記に置き換えます。</p>
<pre><code>  def visit_comment(node)
    return if node.invisible?
<em>    if node.style == :expanded
      spaces = (&quot;\t&quot; * [@tabs - node.resolved_value[/^ */].size, 0].max)
    else
      spaces = ('  ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
    end</em></code></pre>
<ul class="note">
<li><span>※</span> Scoutの場合は<code>node.resolved_value</code>が<strong><code>node.value</code></strong>となります。</li>
</ul>
<h4>プロパティの前の空白を4スペースにする</h4>
<p>115行目の後に下記を追加します。</p>
<pre><code>    if node.style == :compressed
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value}&quot;
<em>    elsif node.style == :expanded
      &quot;    #{node.resolved_name}: #{node.resolved_value};&quot;</em>
    else
      &quot;#{tab_str}#{node.resolved_name}: #{node.resolved_value};&quot;
    end</code></pre>
<p>また、60行目を下記に置き換えます。</p>
<pre><code>  def visit_comment(node)
    return if node.invisible?
<em>    if node.style == :expanded
      spaces = ('    ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
    else
      spaces = ('  ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
    end</em></code></pre>
<ul class="note">
<li><span>※</span> Scoutの場合は<code>node.resolved_value</code>が<strong><code>node.value</code></strong>となります。</li>
</ul>
<h4>値の前の空白を削除する</h4>
<p>115行目の後に下記を追加します。</p>
<pre><code>    if node.style == :compressed
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value}&quot;
<em>    elsif node.style == :expanded
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value};&quot;</em>
    else
      &quot;#{tab_str}#{node.resolved_name}: #{node.resolved_value};&quot;
    end</code></pre>
<h3>カスタマイズする行が重複している場合の対応</h3>
<p>例えば、プロパティの前、及び値の前の空白を削除したい場合は、2つのカスタマイズ例をマージ（融合）したものを記述します。具体的には、115行目の後に<code>#{tab_str}</code>とコロンの後のスペースを削除した下記コードを追加するようになります。</p>
<pre><code>    if node.style == :compressed
      &quot;#{tab_str}#{node.resolved_name}:#{node.resolved_value}&quot;
<em>    elsif node.style == :expanded
      &quot;#{node.resolved_name}:#{node.resolved_value};&quot;</em>
    else
      &quot;#{tab_str}#{node.resolved_name}: #{node.resolved_value};&quot;
    end</code></pre>
<h3>補足</h3>
<h4>to_css.rb内のinitializeメソッドについて</h4>
<p>initializeメソッドでインデント量が設定できそうですが、実際に使ってみると問題がありました。プロパティだけではなく、ファイル全体が2スペース×@tabsの値分だけインデントされてしまいます。</p>
<h4>【既知の問題】@media内でインデントを行った場合について</h4>
<p>例えば、<code>@media print {}</code>内でインデントをして記述したものをCSSに変換しても、タブ/スペースインデントが意図通り入らない問題があります。</p>
<h4>デフォルトの仕様</h4>
<p><code>プロパティ:値;</code>と同一行にコメントを記述しても、値の後で必ず改行されて出力されます。</p>
<h3>まとめ</h3>
<p>Classファイルを書き換えてしまうという少々荒い手法ですが、紹介させていただいたカスタマイズ例のいずれかを使用すればどのようなCSSの記述ルールにも対応でき、自分一人だけでもSassを導入してCSSの設計を始めることができると思います。本記事がSass導入の一助になれば幸いです。いずれはみんなでSassを利用して、効率化が図れると良いですね！</p>
<h3>付録：カスタマイズしたto_css.rbファイルのダウンロード（Sass 3.1.11 / 3.1.12用）</h3>
<p>サンプルとして、セレクタの後や値の直前にスペースを入れたり、インデントを入れたりせず、ルールごとに必ず改行を入れるタイプ（私が以前所属していた会社の記述ルール）のカスタマイズをしたto_css.rbファイルを公開します。カスタマイズ前のファイルと比較するなどして参考にして頂けたらと思います。</p>
<ul class="linkStyle01">
<li><a href="/blog/downloads/20111217/class_tocss_customize.zip" onclick="_gaq.push(['_trackEvent', 'Blog','Download','class_tocss']);">サンプルファイルのダウンロード（zip形式/3.1KB）</a></li>
</ul>
<ul class="note">
<li><span>※</span> <strong>Sass 3.1.13〜・Scoutを利用されている方は、上書きをせずマージしてください。</strong></li>
</ul>
<div id="newversion">
<h3>最新バージョンでのカスタマイズ可否</h3>
<h4>Sass Ver.3.1.13</h4>
<p>行数が若干異なるものの、上記コードをそのままコピー＆ペーストすることでカスタマイズ可能なことを確認いたしました。（2012年2月5日）</p>
</div>]]>
    </content>
</entry>

<entry>
    <title>CodaのZen Coding - TEA for Codaでdiv要素の終了タグにコメントを自動追加するカスタマイズ</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000120.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.120</id>

    <published>2011-12-10T05:24:05Z</published>
    <updated>2011-12-13T11:57:07Z</updated>

    <summary>最近では専らCodaを利用して(X)HTML/(S)CSS/JavaScriptをコーディングするようになりました。CodaのZen Coding -- TEA for Codaでもdiv要素の終了タグにコメントを自動追加できるようにカスタマイズしてみたのでご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>今年9月にMacBook Proを買ったのがきっかけで、最近では専ら<a href="http://panic.com/jp/coda/">Coda</a>を利用して(X)HTML/(S)CSS/JavaScriptをコーディングするようになりました。</p>
<p>それまで(X)HTMLのコーディングに利用していたDreamweaverには、<a href="/blog/archives/000090.html">div要素の終了タグにコメントを自動追加するカスタマイズをした「Zen Coding for Dreamweaver v0.6」</a>を入れていたのですが、Codaに乗り換えたことでコメントの自動追加ができなくなり、非常に不便に感じていました。</p>
<p>CodaのZen Coding -- <a href="http://onecrayon.com/tea/coda/">TEA for Coda</a>はPythonで書かれているため、Pythonの経験がない私はDreamweaverのようにはカスタマイズできないでいたのですが、改めてチャレンジしてみるとわりと簡単にコメントの自動追加ができるようになったので、カスタマイズ方法をご紹介します。</p>
]]>
        <![CDATA[<h3>カスタマイズするファイル</h3>
<ul class="note">
<li><span>※</span> TEA for Codaは、<a href="http://code.google.com/p/zen-coding/">Google Project Hosting</a>から最新版をダウンロードしてください。</li>
</ul>
<p>/Users/（ユーザー名）/Library/Application Support/Coda/Plug-ins/TEA for Coda.codaplugin/Support/Library/zencoding/filters/html.py</p>
<h3>カスタマイズ方法</h3>
<p>正規表現を利用するため、9行目の後でreをインポートします。</p>
<pre><code>import zencoding.utils
<em>import re</em></code></pre>
<p>124行目から開始タグ・終了タグを定義する処理が書かれていますので、下記のように書き換えます。<code>else:</code>の後（＝終了タグを持つ要素）でdiv要素かどうかを判別し、div要素の場合は自動でコメントを入れるという内容です。</p>
<pre><code>	# define opening and closing tags
	tag_name = process_string_case(item.name, profile['tag_case'])
	if is_unary:
		start = '&lt;' + tag_name + attrs + self_closing + '&gt;'
		item.end = ''
	else:
<em>		if tag_name == 'div':
			match = re.search(r'(id|class)=&quot;(.*?)&quot;', attrs)
			if match is None:
				start = '&lt;' + tag_name + attrs + '&gt;'
				end = '&lt;/' + tag_name + '&gt;'
			else:
				start = '&lt;' + tag_name + attrs + '&gt;'
				if match.group(1).startswith('id'):
					end = '&lt;/' + tag_name + '&gt;&lt;!-- /#' + match.group(2) + ' --&gt;'
				else:
					end = '&lt;/' + tag_name + '&gt;&lt;!-- /.' + match.group(2).replace(&quot; &quot;, &quot;.&quot;) + ' --&gt;'
		else:</em>
			start = '&lt;' + tag_name + attrs + '&gt;'
			end = '&lt;/' + tag_name + '&gt;'</code></pre>
<p>なお、私はタグを閉じた後でコメントを自動挿入するようにしていますが、タグを閉じる前でコメントを自動挿入するようにされたい方は、137行目〜140行目（上記コードを入れた後の行数です）を下記のようにして下さい。</p>
<pre><code>				if match.group(1).startswith('id'):
					end = '&lt;!-- /#' + match.group(2) + ' --&gt;&lt;/' + tag_name + '&gt;'
				else:
					end = '&lt;!-- /.' + match.group(2).replace(&quot; &quot;, &quot;.&quot;) + ' --&gt;&lt;/' + tag_name + '&gt;'</code></pre>
<p>以上でファイルのカスタマイズは完了です。Codaを再起動してid/class名を付与したdiv要素を展開した際にコメントが自動挿入されるか確認して下さい。</p>
]]>
    </content>
</entry>

<entry>
    <title>Compassを使ってSassのCSS出力を手軽にしよう</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000118.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.118</id>

    <published>2011-12-08T12:36:22Z</published>
    <updated>2012-01-24T22:04:27Z</updated>

    <summary>Sassを使っていて1つ面倒なことと言えば、CSSを生成するのに必要なコマンドが長いことではないでしょうか。そこで「Compass」を利用して、SassのCSS出力を手軽にする方法をご紹介します。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="効率化" label="効率化" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p><a href="http://sass-lang.com/">Sass</a>を使っていて1つ面倒なことと言えば、CSSを生成するのに必要なコマンドではないでしょうか。</p>
<pre><code>sass -t expanded _scss:shared/css --watch</code></pre>
<p>長い...。プロジェクトでCSSの設計を始めるたびにこれだけ入力するのは大変です。</p>
<p>そこで登場するのが「<a href="http://compass-style.org/">Compass</a>」です。CSS3のmixinなどが含まれた強力なフレームワークなのですが、次のコマンドを打つだけでCSSの出力ができる機能も持っています。</p>
<pre><code>compass watch</code></pre>
<p>簡単ですよね。いつでもどのプロジェクトでも「<code>compass watch</code>」ですから。</p>
<ul class="noteList">
<li><span>※</span>1度だけCSSを出力する「<code>compass compile</code>」もあります。</li>
</ul>
]]>
        <![CDATA[<h3>インストール方法</h3>
<p>Sassはもう既に入っていると思うので、次のコマンドを入力してCompassをインストールしましょう。</p>
<dl class="listStyle01">
<dt>Windows</dt>
<dd><pre><code>gem install compass</code></pre></dd>
<dt>Mac</dt>
<dd><pre><code>sudo gem install compass</code></pre></dd>
</dl>
<h3>初期設定</h3>
<p>本当はプロジェクト毎に次のようにコマンドを打って初期化するのですが...、長いし、勝手に.scssや.cssが出力されて、はっきり言って面倒です。</p>
<pre><code>compass create --sass-dir &quot;（SCSSの保存場所）&quot; --css-dir &quot;（CSSの出力場所）&quot;</code></pre>
<p>そこで、下記コードをコピーして、サイトのルートディレクトリに「<kbd>config.rb</kbd>」という名前で保存して下さい。</p>
<pre><code>http_path = &quot;/&quot;
css_dir = &quot;shared/css&quot;
sass_dir = &quot;_scss&quot;
images_dir = &quot;shared/images&quot;
javascripts_dir = &quot;shared/js&quot;
output_style = :expanded
line_comments = false</code></pre>
<p>一応内容を下記に解説します。保存場所など適宜書き換えて下さい。</p>
<pre><code>http_path = &quot;/&quot;
css_dir = &quot;CSSの出力場所&quot;
sass_dir = &quot;SCSSの保存場所&quot;
images_dir = &quot;画像の保存場所&quot;
javascripts_dir = &quot;JavaScriptの保存場所&quot;
output_style = Sassの出力形式（:expanded or :nested or :compact or :compressed）
line_comments = CSSにSCSSの行番号を出力するか（true or false）</code></pre>
<h4>2011年12月25日追記</h4>
<p class="mb-min"><code>images_dir</code>は、<code>&quot;/&quot;</code>を指定しておくのが便利かもしれません。<code>image-width()</code>で画像サイズを自動取得させる際などに、どこのディレクトリに画像を格納しても引数でサイトルートからのパスを指定すれば意図通りサイズが自動挿入されるようになります。</p>
<ul class="note">
<li><span>※</span> <code>&quot;shared/images&quot;</code>にすると、<code>shared/images</code>以下に画像を格納する必要があります。</li>
</ul>
<h3>作業開始</h3>
<p>もう準備は整いました。コマンドプロンプトやターミナルでサイトのルートディレクトリを開いて、すかさず「<code>compass watch</code>」しましょう。</p>
<p>別のプロジェクトでCompassを使いたい場合は、「config.rb」をそのまま使い回せばOKです。各種ファイルの格納ディレクトリやルートディレクトリが異なる場合のみ、必要な部分を書き換えましょう。</p>
<div id="batchfile">
<h3>サイトのルートディレクトリをコマンドラインで簡単に開き、compassを実行する方法</h3>
<ul class="note">
<li><span>※</span> 2012年1月12日 Macのシェルスクリプトに関する説明を追記しました。</li>
</ul>
<p>Windows・Mac共に、「バッチファイル」や「シェルスクリプト」を利用すると簡単です。Macの場合、Coda等のアプリケーションを使う手もあります。</p>
<dl class="listStyle01">
<dt>Windowsの場合</dt>
<dd>
<p>「<code>compass watch</code>」とだけ書いたファイルを、「<kbd>compass_start.bat</kbd>」という名前でconfig.rbと同じディレクトリに置くと良いと思います。ダブルクリックすると目的のディレクトリに移動した状態でコマンドプロンプトが開始され、.scssの変更が監視されます。</p>
</dd>
<dt>Mac</dt>
<dd>
<p><a href="http://cocoatech.com/">PathFinder</a>を使っている方は「パスナビゲーター（ディレクトリが表示されるところ）」で右クリックをして「ターミナルを開く」、<a href="http://panic.com/jp/coda/">Coda</a>ならサイト定義をした上で「ターミナル」をクリックして「ローカルシェルに接続」を選択して接続をクリック、など何かツールを使っていれば簡単に開けると思います。</p>
<p>ツールがない場合は、下記の内容を「<kbd>compass_start.command</kbd>」という名前でconfig.rbと同じディレクトリに置きます（右クリックをして「情報を見る」を選択し、オーナーに実行権限を与えて下さい）。ダブルクリックをするとターミナルが開き、.scssの変更が監視されます。</p>
<pre><code>#!/bin/bash
htdocs=$(dirname $0)
cd $htdocs
compass watch</code></pre>
<p><img src="/blog/images/entry/20111208_01.png" width="532" height="143" alt="compass_start.commandを実行した時の画面" /></p>
<ul class="note mb-non">
<li><span>※</span> カレントディレクトリへの移動方法は、<a href="http://d.hatena.ne.jp/bander/20080119/p1">Macのバッチファイル</a>を参考にさせて頂きました。</li>
</ul>
</dd>
</dl>
</div>
<h3>おわりに</h3>
<p>「<a href="http://atnd.org/events/21919">Less &amp; Sass Advent calendar 2011</a>」に関連した投稿を読ませて頂いて、SassがLessの簡便さに負けそうなので、Sassも一度準備は必要だけど簡単だよということを書いてみました。これを読んでSassが少しでも簡単に使えるようになれば幸いです。</p>
<p>ちなみに私も「Less &amp; Sass Advent calendar 2011」に参加しており、2011年12月17日（土）に「<a href="/blog/archives/000121.html">Sassで出力するCSSファイルを自社のCSS記述ルールに合わせるヒント</a>」と題してお送りする予定です。まだ周りのみんなSassを使っていないけど自分はSassを使いたい！という方に役立つのではと思います。こちらも楽しみにしていただけたらと思います。</p>
]]>
    </content>
</entry>

<entry>
    <title>スクロール完了（停止）の検出と、フローティングメニューの実装</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000117.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.117</id>

    <published>2011-11-25T11:00:00Z</published>
    <updated>2011-11-28T01:32:54Z</updated>

    <summary>画面のスクロールに伴って画面左（もしくは右）に配置したメニューが追従してくる「フローティングメニュー（エレベーターメニュー）」の実装を検討しました。スムーズな動作を実現するため、スクロールが完了（停止）した際に発生するカスタムイベント「scrollFinish」を作成しました。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>案件対応中に、画面のスクロールに伴って画面左（もしくは右）に配置したメニューが追従してくる「フローティングメニュー（エレベーターメニュー）」の実装を検討しました。Google検索でjQueryプラグインを探すと、3年ほど前から更新されていないプラグインや、jQuery公式サイトのPluginsから消えてしまっているプラグインばかりでしたので、サンプルスクリプトを公開します。</p>
<p>本サンプルをたたき台としてご利用頂ければと思いますが、「いいね」が多いようでしたらプラグイン化も検討してみたいと思います。</p>]]>
        <![CDATA[<h3>スクロール完了（停止）の検出...カスタムイベント「scrollFinish」について</h3>
<p>スクリプトの大枠は「windowオブジェクトのscrollイベントを検出したら、メニューの移動を実行する」という簡単なものですが、画面をスクロールしている間は常にscrollイベントが発生しています。そのため、メニューの移動処理が何度も呼び出され、メニューの動きがカクカクしてしまう原因となります。</p>
<p>そこで、タイマーを利用し、スクロールが完了（停止）した際に「scrollFinish」というカスタムイベントが発生するようにし、scrollFinishイベントをキャッチしたらメニューの移動を実行するようにしました。</p>
<p>なお、最初はカスタムイベント名を「scrollEnd」にしようかと思っていたのですが、ページのしたまでスクロールしたことを検出するイベントとして既に使われつつあったので、「scrollFinish」とした次第です。</p>
<pre><code>
$(function () {
    // 変数宣言
    var $window = $(window),
        $document = $(document),
        timerId;

    // スクロール停止イベントのバインド
    $window.bind(&quot;scrollFinish&quot;, function (event, scrollTop) {
        // メニュー移動処理呼び出し（後に掲載するサンプルを参照して下さい）
        floatingMenu(scrollTop);
    });

    // スクロールイベントのバインド
    $window.bind(&quot;scroll&quot;, function () {
        var scrollTop = $document.scrollTop();
        if (timerId) {
            clearTimeout(timerId);
        }

        // 1秒間スクロールしない場合はscrollFinishイベントを呼び出し
        timerId = setTimeout(function () {
            timerId = null;
            $window.trigger(&quot;scrollFinish&quot;, [scrollTop]);
        }, 1000);
    });

    $window.unload(function () {
        $window.unbind("scroll scrollFinish");
    });
});
</code></pre>

<h3>サンプル</h3>
<p>「Result」をクリックすると、フローティングメニュー（エレベーターメニュー）の動作をご確認いただけます。</p>
<object data="http://jsfiddle.net/hideki_a/6Gkcz/embedded/" type="text/html" width="580" height="600" style="border:1px solid #ccc;">
<ul class="note">
<li><span>※</span> 現在ご利用のブラウザではサンプルが表示できません。<a href="http://jsfiddle.net/hideki_a/6Gkcz/">jsFiddleのサイト</a>にてご覧ください。</li>
</ul>
</object>
]]>
    </content>
</entry>

<entry>
    <title>「山陽新幹線ふれあいデー」でN700系運転台を見学</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000116.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.116</id>

    <published>2011-11-07T12:30:45Z</published>
    <updated>2011-11-07T12:47:53Z</updated>

    <summary>昨日6日、博多総合車両所岡山支所で開催された「山陽新幹線ふれあいデー」に行ってきました。お目当ては最近かなりお気に入りのN700系。あこがれの運転台はもう何とも言いようのない感動でした。こんな素敵な空間は他にはないなとか、これが運転できたら...などと、いろいろな思いを浮かべていました。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="日常の出来事" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="鉄道" label="鉄道" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p><a href="http://www.flickr.com/photos/hideki_a/6317835856/in/photostream"><img src="/blog/images/entry/20111107_01.jpg" width="240" height="160" alt="N700系7000番台の運転台" class="photo" /></a></p>
<p>昨日6日、博多総合車両所岡山支所で開催された「<a href="http://www.westjr.co.jp/press/article/2011/10/page_844.html">山陽新幹線ふれあいデー</a>」に行ってきました。お目当ては最近かなりお気に入りのN700系（それはもう「<a href="http://www.amazon.co.jp/gp/product/B005R394VQ/ref=as_li_ss_tl?ie=UTF8&amp;tag=skywarddesign-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=B005R394VQ">新幹線 EX（エクスプローラ）2011年12月号</a>」を買って読むほどｗ）。あこがれの運転台も公開されるとあって、なんとしてでも見届けてやるとばかり意気込み朝7時20分に自宅を出発しました。その甲斐あって大行列の最初の方に並ぶことができ、開会から30分弱で乗務員室へと足を踏み入れることができました。</p>
]]>
        <![CDATA[<p>係の方に招かれて入った際はまだ先客の方が見学中でしたので、一旦車両側面の乗務員室入口付近で待機することに。でも僕にとってはこれも好都合。重厚な乗務員室扉や意外にもリレー式ではなく機械式の車掌スイッチなどを見るなどし、胸を躍らせていました。</p>
<p>そしていよいよ運転台へ。与えられた時間は1分。まずは暗めだろうと予測してISO1600にセットしたEOS 40Dで確実に写真を撮影しました。そして、いよいよイベント開催を知った時から夢見たN700系の運転席に着席！　ちょっと柔らかなシート、そして目に飛び込んでくる計器類や外の風景。それはもう何とも言いようのない感動でした。こんな素敵な空間は他にはないなとか、これが運転できたら...などと、いろいろな思いを浮かべていました。</p>
<p>そうこうしているうちに1分経過（あっという間...）。まだ居たいと思いつつも、係の方にお礼を言って運転台を後にしたのでした。その後はなんとしてもかっこいいN700系の外観を撮影しようと何枚も何枚もシャッターを切っていました。結局一番いいのはパンフレットによく載っている角度だなということでこの写真に。この美しいラインが本当に素敵ですね。<br />
<a href="http://www.flickr.com/photos/hideki_a/6317836334/in/photostream"><img src="/blog/images/entry/20111107_02.jpg" width="240" height="160" alt="N700系7000番台の先頭車" class="photo" /></a></p>
<p>その後、レールスターなど他の車両を見たり、山陽・九州新幹線クリアファイル・パンフレットセットを購入するなどして存分に楽しみ、14時過ぎに車両所を後にしました。<a href="http://www.flickr.com/photos/hideki_a/sets/72157628064398702/">flickr</a>にもいくつか写真を載せましたので、よろしければそちらもご覧いただければと。</p>
]]>
    </content>
</entry>

<entry>
    <title>ANA ボーイング787 乗員慣熟飛行見学</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000115.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.115</id>

    <published>2011-10-15T13:34:24Z</published>
    <updated>2011-10-16T09:33:12Z</updated>

    <summary>一昨日ANAのボーイング787特設サイトを見たら、乗員慣熟飛行スケジュールが公開されており、787が岡山・広島空港に飛来するとの情報を発見。SROVの時は平日なので見に行けなかったけど、今回は土・日にも飛来するとのことで広島空港に出かけました。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="写真" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="飛行機" label="飛行機" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p><a href="/blog/images/entry/20111022_01_large.jpg" rel="lightbox" title="8番スポットに停止中のボーイング787初号機"><img src="/blog/images/entry/20111022_01.jpg" alt="8番スポットに停止中のボーイング787初号機" width="320" height="213" class="photo" /></a></p>
<p>一昨日ANAのボーイング787特設サイトを見たら、<a href="http://www.ana.co.jp/promotion/b787/info/archive.html#13">乗員慣熟飛行スケジュールが公開</a>されており、787が岡山・広島空港に飛来するとの情報を発見。SROVの時は平日なので見に行けなかったけど、今回は土・日にも飛来するとのことで、今日EOS 40Dと共に広島空港に出かけました。本当は天気予報が晴れになっている明日がいいかなと思ったけど、明日はイベントで混雑しそうだし、広島空港は南向きだから逆光にならない曇りの方がいいかも？と思いまして。</p>
<p>予定時刻より1時間ちょっと早く広島空港（HIJ/RJOA）に着いたので、<a href="http://www.hij.airport.jp/rest_shop/3-02.html">レストランロイヤル</a>でゆっくりと腹ごしらえ。滑走路方向が眺められる窓際席は一日居ても飽きなそうですね（笑）。</p>]]>
        <![CDATA[<p>その後、到着予定時刻が迫ってきたので見学・送迎デッキでスタンバイ。曇りのせいなのか、787の飛来があまり知られていないのかは分からないけど、あまり人出は多くなく、良い見学ポジションが取れました。そしてANA・JALの東京定期便到着などを見ながら楽しみに待つこと約30分、定刻の13時15分より少し遅れてNH9123便としてボーイング787が関西空港より到着しました。しなやかに上に反った主翼と、波形のエンジンカウリングが特徴的。コックピットの窓も4枚になり、なめらかですっきりとした顔立ち。777もかっこいいですが、787は新世代を感じさせるかっこよさがありますね。</p>
<p>機体は国際線側の8番スポットにスポットイン。デッキには柵があり遠く離れたスポットでして。でもターミナル東側の空き地から見えそうな予感がして行ってみると...、立ち入っても問題なさそうな駐車場があって787の目の前まで近づけました。ただそこには目の細かい金網が。標準ズームレンズなので金網クリアが出来ないなぁと若干打ちひしがれていると、近くで同じように撮影していた男性の方「これ登りなよ」と脚立を貸して下さいました。脚立に登るとちょうど金網の上部の空間に達して787がバッチリ狙えました。ご親切にありがとうございました！</p>
<p>若干搭乗橋や作業車が移っているものの、迫力ある写真が撮れて満足です。最後はもう一度見学・送迎デッキに戻り、関西空港への離陸を見送りました。エンジンスタートから音に耳を傾けていましたが静粛性も高まっている印象を受けましたね。</p>
<p>11月からはいよいよ広島線に就航。早く乗って空の旅を楽しんでみたいなぁと思っています。個人的にはJALの787が就航し、クラスJでゆっくりくつろぎながら青空を眺めたいなぁと。</p>
<p>上記以外の写真3枚はFlickrの「<a href="http://www.flickr.com/photos/hideki_a/sets/72157627897335940/">Boeing 787 Dreamliner</a>」掲載しております。よろしければこちらもご覧下さい。</p>]]>
    </content>
</entry>

<entry>
    <title>Facebookページの縦スクロールバーを消すsetAutoResize()はsetAutoGrow()に</title>
    <link rel="alternate" type="text/html" href="http://www.skyward-design.net/blog/archives/000114.html" />
    <id>tag:www.skyward-design.net,2011:/blog//1.114</id>

    <published>2011-10-08T02:40:19Z</published>
    <updated>2011-10-09T01:11:14Z</updated>

    <summary>Facebook開発者ブログの記事「Platform Updates: Operation Developer Love」にて、iframeの高さ調整に関するJavaScriptの仕様変更がアナウンスされています。現在iframeの自動高さ調整（スクロールバー消去）機能として「FB.Canvas.setAutoResize」が提供されていますが、機能名が「FB.Canvas.setAutoGrow」に変更される事になったようです。</summary>
    <author>
        <name>Hideki</name>
        <uri>http://www.skyward-design.net/</uri>
    </author>
    
        <category term="Web制作" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sns" label="SNS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skyward-design.net/blog/">
        <![CDATA[<p>（先月会社のFacebookウォールに書いた記事をより広めるために転載します。）</p>
<p>Facebookページの独自タブ（HTMLでオリジナルのFacebookページ）を作られている方にお知らせです。先日9月24日、Facebook開発者ブログの記事「<a href="http://developers.facebook.com/blog/post/565/">Platform Updates: Operation Developer Love</a>」にて、iframeの高さ調整に関するJavaScriptの仕様変更がアナウンスされています。</p>
]]>
        <![CDATA[<p>記事によると、現在iframeの自動高さ調整機能として「FB.Canvas.setAutoResize」が提供されていますが、コンテンツの高さが伸びた際は正しく調整できるものの、コンテンツの高さが縮まった際には高さが正しく調整できない問題があるようです。</p>
<p>そして、この問題の解決が難しいという結論に至ったことから、機能名が「<a href="https://developers.facebook.com/docs/reference/javascript/FB.Canvas.setAutoGrow/">FB.Canvas.setAutoGrow</a>」に変更される事になったようです。現在提供されている「FB.Canvas.setAutoResize」は、2012年1月1日までのサポートとなるようです。</p>
<p>iframeの自動高さ調整機能をご利用なさっている方はJavaScriptの確認を行ってみてください。サンプルをご覧になりたい方は、こちらの<a href="http://www.facebook.com/alpharook?sk=app_270852556261434">某社（謎）Facebookページの「Welcome」タブ</a>をご覧いただければ...。</p>
<p>ちなみにちょっとしたTipsですが、下方向のmarginが設定されていると、ほんの少しだけしか移動できない縦スクロールが現れることがあります。「FB.Canvas.setAutoGrow」を使っているのに縦スクロールが消えないという方は、下方向のmarginを確認されると良いかと思います。</p>
<h3>サンプルコード</h3>
<pre><code>&lt;body&gt;
&lt;!-- Loading Facebook JavaScript SDK --&gt;
&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
(function() {
    var d = document;
    var e = d.createElement(&quot;script&quot;);
    e.src = d.location.protocol + &quot;//connect.facebook.net/ja_JP/all.js&quot;;
    d.getElementById('fb-root').appendChild(e);
}());
window.fbAsyncInit = function() {
    FB.Canvas.setAutoGrow();
};
&lt;/script&gt;
&lt;!-- End of Loading Facebook JavaScript SDK --&gt;</code></pre>]]>
    </content>
</entry>

</feed>

