プログレッシブ エンハンスメントを使用してこれを適切に行う方法を次に示します。アイデアは単純です。適切にマークアップされた HTML フォームを、JavaScript を使用しているユーザー向けに、より適切な色とサイズの見本ボタンに変換します。
この方法には多くの利点があります。コンポーネント (JS/CSS) を簡単に切り替えたり削除したりしても、フォームは引き続き機能します。JavaScript を使用しないユーザーでも機能します。注意すれば、キーボードやスクリーン リーダーからアクセスできるようになります。また、送信時に追加のコードを必要とせず、フォームバリデーターでの使用がはるかに簡単になります.
ほとんどの作業は CSS を使用して行われ、最後の仕上げには最小限の JavaScript のみが使用されます。
完全な動作例は jsbin にあります。色とサイズの両方の選択が含まれます。CSS にはわずかな違いしかないため、ここでは色のみを含めました。
HTML
まず、フォーム コンポーネントをマークアップします。これが基本です。明らかに、ウィジェット全体のラッパーなどを追加したり、他のクラス名を使用したりすることができます。
<label>Color</label>
<ul class="radio color">
<li class="red">
<input type="radio" name="color" id="color_red" value="red" />
<label for="color_red">Red</label>
</li>
<li class="green">
<input type="radio" name="color" id="color_green" value="green" />
<label for="color_green">Green</label>
</li>
<!-- ...and so on... -->
</ul>
これは「基本」には多くのように思えるかもしれませんが、ここではいくつかのことが行われています。コンテナ全体UL
に「ラジオ」のフラグが付けられるため、その中のすべてを CSS で適切にターゲットにすることができます ( "ul.radio label"
)。
さらに、入力の名前に対応するクラスを追加し、それぞれLI
に値をエコーするクラスを追加して、CSS が適切なスタイルを追加できるようにします ( "ul.color li.red"
)。残りは、ほぼ標準のフォーム マークアップです。
JavaScript
JavaScript は非常に単純です。現在選択されているラジオ入力を検出し、コンテナLI
に「選択された」クラスのフラグを付けて、CSS が適切に強調表示できるようにするだけです。
jQuery(function($){
// notify CSS that JS is present
$( 'body' ).addClass( 'js-active' );
// for every radio control...
$( 'ul.radio' )
// redo every change
.bind('click', function () {
// refresh "current classes"
$( 'li', this ).removeClass( 'selected' )
.filter( ':has(:checked)' ).addClass( 'selected' );
})
// trigger initial run
.trigger( 'click' );
});
注意: クリックをトリガーして最初の実行を強制するこの「トリック」は、クリック ハンドラーがより高い (通常はdocument.body
) 場合、安全ではない可能性があります。簡潔にするためにこの方法を使用します。
CSS
ここで本当の魔法が起こります。アイデアは、入力コントロールをビューの外に押し込んで、ラベルをカラー ボタンとしてスタイルすることができるということです。for
ラベルの属性が入力の を正しく指している限りid
、ラベルをクリックするだけでコントロールを正しく選択できます。
".js-active"
JavaScript を持っていないが、まだ CSS を持っているユーザーがラジオ入力要素を見ることができるように、内部のみをターゲットにする必要があります。あるいは、ある種の「.radio-js」クラスをUL
ラッパーに追加して、同じことを行うこともできます。
まず、ボタンをフロートさせて、ボタンのような外観にします。
/* attributes are lined up horizontally */
ul.color li,
ul.size li {
border : 1px solid #aaa;
margin : 0 4px 0 0;
padding : 2px;
float : left;
overflow : hidden;
position : relative;
}
position:relative
各 LI にとを付けoverflow:hidden
て、入力要素をビューの外に移動できるようにします。これにより、アクセス可能になりますが、もう見る必要はありません。
/* if JS: remove inputs from sight */
.js-active ul.color input,
.js-active ul.size input {
position : absolute;
left : -999em;
}
次は、ラベルをボタンに変換します。
/* if JS: turn color labels into buttons */
.js-active ul.color label {
cursor : pointer;
display : block;
height : 18px;
width : 18px;
text-indent : -999em; /* hide text */
}
/* color buttons in color -- allowed even if no JS */
ul.color li.red label { background : red; }
ul.color li.green label { background : green; }
ul.color li.blue label { background : blue; }
最後に、強調表示/選択したアイテムのスタイルをいくつか設定します。
/* if JS: current selected highlight */
.js-active ul.color .selected,
.js-active ul.size .selected {
border : 2px solid #000;
padding : 1px;
}
完全を期すために: さらに効果を追加する場合の選択値の取得については、SO の別の場所で説明しています。