<?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>JSBin &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/jsbin/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Wed, 13 Aug 2025 06:04:17 +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>ラジオボタンでグラフィカルなトグルボタンを作ってみる</title>
		<link>https://blog.mach3.jp/2012/07/31/graphical-togglebutton-by-radio-input.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 31 Jul 2012 01:00:11 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSBin]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2617</guid>

					<description><![CDATA[HTMLでトグルボタンを実装するにはinput[type=radio]が近道ですが、 リッチな雰囲気にする為に見た目を制御したい。今回はそんなお話です。 ラジオボタンでグラフィカルなトグルボタン 「ラジオボタンがすでにグ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>HTMLでトグルボタンを実装するにはinput[type=radio]が近道ですが、 リッチな雰囲気にする為に見た目を制御したい。今回はそんなお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-EyrTrqI8cl0/UBavQ8lA-sI/AAAAAAAABi8/MTipTnjLFlE/s400/20120731-02.png" alt="ラジオボタンでグラフィカルなトグルボタンを作ってみる"/></figure>



<p></p>



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



<h2 class="wp-block-heading">ラジオボタンでグラフィカルなトグルボタン</h2>



<p>「ラジオボタンがすでにグラフィカルでは？」という細かいつっこみは置いといて頂き、 本稿ではより自由度高く外見をカスタマイズする方法を記していきます。</p>



<p>ラジオボタンでなくともトグルボタンはJavaScriptで作れますが、 択一で選択する仕組みをわざわざ自前で実装するよりも、 その為に作られた物をその為に使って実現してみます。</p>



<h2 class="wp-block-heading">マークアップ</h2>



<p>例えばこんなHTMLとCSSを書きます。 血液型を選択する簡単なトグルボタンです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-0MHZN0g8NKk/UBavQ47RQ7I/AAAAAAAABi8/_GBZo7g9bHs/s500/20120731-01.png" alt="血液型を選択する簡単なトグルボタン"/></figure>



<p></p>



<h3 class="wp-block-heading">HTML</h3>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"question"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>あなたの血液型は？<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bloodtype-list"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"bloodtype"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"A"</span> <span class="hljs-attr">checked</span> /&gt;</span>A<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"bloodtype"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"B"</span> /&gt;</span>B<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"bloodtype"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"O"</span> /&gt;</span>O<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"bloodtype"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"AB"</span> /&gt;</span>AB<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">CSS</h3>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/**
 * 重要な箇所のみ抜粋
 */</span>

<span class="hljs-selector-class">.bloodtype-list</span> <span class="hljs-selector-tag">label</span> <span class="hljs-selector-tag">input</span> {
    <span class="hljs-attribute">display</span>:none;
}
<span class="hljs-selector-class">.bloodtype-list</span> <span class="hljs-selector-tag">label</span> {
    <span class="hljs-comment">/* 非選択時のスタイル */</span>
}
<span class="hljs-selector-class">.bloodtype-list</span> <span class="hljs-selector-tag">label</span><span class="hljs-selector-class">.selected</span> {
    <span class="hljs-comment">/* 選択時のスタイル */</span>
}
</code></span></pre>


<p>label&gt;input という構造にして、inputをdisplay:none;で隠してしまいます。 選択されたラジオボタンのlabelに「selected」クラスが付加されれば、選択状態を表現できまね。 その部分は、JavaScriptにお任せします。</p>



<h2 class="wp-block-heading">JavaScript</h2>



<p>jQueryを使います。非常に単純な処理です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> radios = $(<span class="hljs-string">"input&#91;name=bloodtype]"</span>);

radios.on(<span class="hljs-string">"change"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-comment">// 一旦全てのlabel要素からselectedクラスを除去</span>
    radios.closest(<span class="hljs-string">"label"</span>).removeClass(<span class="hljs-string">"selected"</span>);
    <span class="hljs-comment">// 選択されたラジオボタンの親のlabelにselectedクラスを設定</span>
    $(e.target).closest(<span class="hljs-string">"label"</span>).addClass(<span class="hljs-string">"selected"</span>);

    <span class="hljs-comment">// 選択変更時に何かしたければここで</span>
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Changed to "</span> + e.target.value);
});


<span class="hljs-comment">// 選択状態を初期化する</span>
radios.filter(<span class="hljs-string">":checked"</span>).trigger(<span class="hljs-string">"change"</span>);
</code></span></pre>


<p>これで概ね動くのですが、IE8以下はもう一工夫必要です。</p>



<h2 class="wp-block-heading">旧IE対策</h2>



<p>IE8以下は、非表示にしているラジオボタンのlabel要素をクリックしても 選択状態は変わらず、changeイベントも発火しない様子です。</p>



<p>なので、その挙動を簡単にエミュレートしてあげます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">radios.closest(<span class="hljs-string">"label"</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-keyword">var</span> input = $(<span class="hljs-keyword">this</span>).find(<span class="hljs-string">"input"</span>);
    <span class="hljs-keyword">if</span>(! input.prop(<span class="hljs-string">"checked"</span>)){
        input.prop(<span class="hljs-string">"checked"</span>, <span class="hljs-literal">true</span>).trigger(<span class="hljs-string">"change"</span>);
    }
});
</code></span></pre>


<p>親のlabel要素をクリックした時に、子のinput要素が選択されていなければ、 checkedにしてchangeイベントに着火します。</p>



<h2 class="wp-block-heading">jQueryプラグインにまとめてみる</h2>



<p>一連の動作をプラグインにまとめてみました。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.fn.extend({
    <span class="hljs-attr">toggleButtons</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">callback</span>)</span>{
        <span class="hljs-keyword">var</span> radios = <span class="hljs-keyword">this</span>;
        radios.on(<span class="hljs-string">"change"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            radios.closest(<span class="hljs-string">"label"</span>).removeClass(<span class="hljs-string">"selected"</span>);
            $(e.target).closest(<span class="hljs-string">"label"</span>).addClass(<span class="hljs-string">"selected"</span>);
             callback.call(<span class="hljs-keyword">this</span>, e);
        });
        radios.closest(<span class="hljs-string">"label"</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            <span class="hljs-keyword">var</span> input = $(<span class="hljs-keyword">this</span>).find(<span class="hljs-string">"input"</span>);
            <span class="hljs-keyword">if</span>(! input.prop(<span class="hljs-string">"checked"</span>)){
                input.prop(<span class="hljs-string">"checked"</span>, <span class="hljs-literal">true</span>).trigger(<span class="hljs-string">"change"</span>);
            }
        });
        radios.filter(<span class="hljs-string">":checked"</span>).trigger(<span class="hljs-string">"change"</span>);
    }
});
</code></span></pre>


<h3 class="wp-block-heading">使い方</h3>



<p>引数のcallbackは、選択状態が変更された時にコールされます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"input&#91;name=bloodtype]"</span>).toggleButtons(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-comment">// 選択変更時に何かする</span>
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Changed to "</span> + e.target.value);
});
</code></span></pre>


<h2 class="wp-block-heading">デモ</h2>



<p>JSBinにデモを用意しました。</p>



<ul class="wp-block-list">
<li><a href="http://jsbin.com/amufub/21/">DEMO ( JS Bin )</a></li>
</ul>



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



<p>あとはlabelとlabel.selectedの見た目を存分にデザインしてあげましょう。 CSS3で記述するもよし、画像置換するもよし、子にimgを入れて差し替えてもよし。 お好みのコースで心ゆくまでごゆっくりと。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<dl>
<dt>2013/06/22</dt>
<dd>checkedにあわせて選択するようにコードを調整</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
