<?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>box-shadow &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/box-shadow/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 09 Oct 2012 02:00:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>CSS3のbox-shadowでお絵かきアプリを書いてみたものの…</title>
		<link>https://blog.mach3.jp/2012/10/09/shadowcanvas.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 09 Oct 2012 02:00:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[box-shadow]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Illustration]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2731</guid>

					<description><![CDATA[先日、CSS3のbox-shadowで描画されたモナリザが話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。 作ってみたもの まずはデモから。当たり前ですが、box-sh [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日、<a href="http://codepen.io/jaysalvat/pen/HaqBf">CSS3のbox-shadowで描画されたモナリザ</a>が話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-CYh_0uVRHXE/UHOEkHMC8zI/AAAAAAAABn4/yZ5IoXHh0C8/s400/20121009-00.png" alt="CSS3のbox-shadowでお絵かきアプリを書いてみたものの…"/></figure>



<p></p>



<span id="more-2731"></span>



<h2 class="wp-block-heading">作ってみたもの</h2>



<p>まずはデモから。当たり前ですが、box-shadowに対応していないブラウザでは動きません。</p>



<ul class="wp-block-list">
<li><a href="http://jsbin.com/osenaj/1/edit">DEMO on JS Bin</a></li>
</ul>



<p><style type="text/css">
  iframe.jsbin-embed {<br />
    height:700px !important;<br />
}<br />
</style>
</p>



<p><a class="jsbin-embed" href="http://jsbin.com/osenaj/1/embed?live">JS Bin</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



<h2 class="wp-block-heading">感想</h2>



<p>作って動かしてみた率直な感想を申し上げると…そもそもこういう用途を想定していないと思うので、当然あまり捗りませんでした。 が、描かれる物の雰囲気は、これはこれで嫌いではないです。水墨画的な物が描けそう。</p>



<h3 class="wp-block-heading">重さが加速する</h3>



<p>Webkitはかなり軽快に動くのですが、Firefoxだとかなりもっさりした動きになります。IE9だとまだマシです。 そして、書けば書くほど重くなっていきます。 box-shadowを一点ずつどんどん重ねていっているわけですから、そりゃ当然重くなりますよね。</p>



<h3 class="wp-block-heading">線を引きにくい</h3>



<p>基本的にブラシで点描を繰り返している様な物なので、あまりはやく描こうとすると途切れて線になりません。 そういうブラシだと思うしかないでしょう。 間を補完するような感じに描画しようかとも思いましたが、むしろ味が損なわれる感じがしたので途中でやめました。</p>



<h2 class="wp-block-heading">ライブラリ</h2>



<p>書いてみたライブラリがこちら。別にやってる事はどうということはないです。 使い道は多分ないと思うのですが、使ってみたい方はお好きにお使いください。</p>



<h3 class="wp-block-heading"><a href="https://gist.github.com/3851837">ShadowCanvas : Drawing illustration with css box-shadow — Gist</a></h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/**
 * ShadowCanvas
 *
 * Drawing illustration with css box-shadow
 *
 * <span class="hljs-doctag">@version </span>0.9
 * <span class="hljs-doctag">@author <span class="hljs-variable">mach3ss</span></span>
 * <span class="hljs-doctag">@require <span class="hljs-variable">jQuery</span></span>
 */</span>
<span class="hljs-keyword">var</span> ShadowCanvas = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">selector, option</span>)</span>{

    <span class="hljs-comment">// config</span>
    <span class="hljs-keyword">this</span>.option = $.extend({}, <span class="hljs-keyword">this</span>.option, option);
    <span class="hljs-keyword">this</span>.node = $.extend({}, <span class="hljs-keyword">this</span>.node);

    <span class="hljs-comment">// nodes</span>
    <span class="hljs-keyword">this</span>.node.container = $(selector);
    <span class="hljs-keyword">this</span>.node.canvas = $(<span class="hljs-string">"&lt;div&gt;"</span>)
    .css({<span class="hljs-attr">position</span>:<span class="hljs-string">"absolute"</span>})
    .appendTo(<span class="hljs-keyword">this</span>.node.container);

    <span class="hljs-comment">// events</span>
    <span class="hljs-keyword">this</span>.node.container
    .on(<span class="hljs-string">"mousemove"</span>, $.proxy(<span class="hljs-keyword">this</span>._onMouseMove, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mousedown"</span>, $.proxy(<span class="hljs-keyword">this</span>.start, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mouseleave mouseup"</span>, $.proxy(<span class="hljs-keyword">this</span>.stop, <span class="hljs-keyword">this</span>));
};
(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fn</span>)</span>{

    fn.boxShadowText = <span class="hljs-string">"{x}px {y}px {blur}px {size}px {color}"</span>;
    fn.drawing = <span class="hljs-literal">false</span>;

    fn.node = {
        <span class="hljs-attr">container</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">canvas</span> : <span class="hljs-literal">null</span>
    };

    fn.option = {
        <span class="hljs-attr">color</span>: <span class="hljs-string">"black"</span>,
        <span class="hljs-attr">blur</span> : <span class="hljs-number">5</span>,
        <span class="hljs-attr">size</span> : <span class="hljs-number">5</span>
    };

    <span class="hljs-comment">/**
     * Configure option or get the option value
     *
     * @param String key
     * @param Mixed value (optional)
     * @return Mixed
     */</span>
    fn.config = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.option.hasOwnProperty(key)){
            <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span>(value) !== <span class="hljs-string">"undefined"</span>){
                <span class="hljs-keyword">this</span>.option&#91;key] = value;
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.option&#91;key];
            }
        }
    };

    <span class="hljs-comment">/**
     * Get css text for box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return String
     */</span>
    fn._getBoxShadowText = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> o, callback;
        o = <span class="hljs-keyword">this</span>.option;
        o.x = x;
        o.y = y;
        callback = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b</span>)</span>{
            <span class="hljs-keyword">return</span> o&#91;b];
        };
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.boxShadowText.replace((<span class="hljs-regexp">/\{(\w+)\}/g</span>), callback);
    };

    <span class="hljs-comment">/**
     * Draw the point with box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return self
     */</span>
    fn.draw = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> shadow = <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
        shadow = shadow === <span class="hljs-string">"none"</span> ? <span class="hljs-string">""</span> : <span class="hljs-string">","</span> + shadow ;
        shadow = <span class="hljs-keyword">this</span>._getBoxShadowText(x, y) + shadow;
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, shadow);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };


    <span class="hljs-comment">/**
     * Start drawing
     *
     * @return self
     */</span>
    fn.start = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Stop drawing
     *
     * @return self
     */</span>
    fn.stop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">false</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    fn._onMouseMove = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        <span class="hljs-keyword">var</span> offset, x, y;

        <span class="hljs-keyword">if</span>(! <span class="hljs-keyword">this</span>.drawing){
            <span class="hljs-keyword">return</span>;
        }

        offset = <span class="hljs-keyword">this</span>.node.container.offset();
        x = e.clientX - offset.left + <span class="hljs-built_in">document</span>.body.scrollLeft;
        y = e.clientY - offset.top + <span class="hljs-built_in">document</span>.body.scrollTop;
        <span class="hljs-keyword">if</span>(x &lt; <span class="hljs-keyword">this</span>.node.container.width() &amp;&amp; y &lt; <span class="hljs-keyword">this</span>.node.container.height()){
            <span class="hljs-keyword">this</span>.draw(x, y);
        }
    };

    <span class="hljs-comment">/**
     * Clear all on canvas
     *
     * @return self
     */</span>
    fn.clear = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, <span class="hljs-string">"none"</span>);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Get css text of the illustration on canvas now
     *
     * @return String
     */</span>
    fn.getCSS = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
    };

}(ShadowCanvas.prototype));
</code></span></pre>


<p>使い方は、キャンバスにしたいボックス要素のセレクターを引数にしてnewするだけです。 各設定はconfigで。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myCanvas = <span class="hljs-keyword">new</span> ShadowCanvas(<span class="hljs-string">"#my-canvas"</span>);
myCanvas.config(<span class="hljs-string">"color"</span>, <span class="hljs-string">"black"</span>);
myCanvas.config(<span class="hljs-string">"size"</span>, <span class="hljs-number">8</span>);
myCanvas.config(<span class="hljs-string">"blur"</span>, <span class="hljs-number">10</span>);
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>表現力は結構ありそうですが、実用的なアプリかと問われると…</p>



<p>cf) <a href="http://kachibito.net/web-design/pure-css-mona-lisa.html">CSS3のbox-shadowだけで作られたモナリザ・・・ &#8211; かちびと.net</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
