これは正しくprogressive enchancementを使ってこれを行う方法です。このアイデアは簡単ですが、JavaScriptを使用するユーザーにとっては、マークアップされたHTMLフォームを色やサイズのスウォッチボタンに変えてください。
この方法の利点は多くあります。コンポーネント(JS/CSS)を簡単に切り替えたり削除したりして、フォームが動作するようにすることができます。 javascriptを使わないユーザーにとってはうまくいくでしょう。注意しておけば、キーボードやスクリーンリーダーからアクセスできるようになります。また、提出時に余分なコードを必要とせず、フォームバリデーターで使いやすくなります。
ほとんどの作業は、仕上げのタッチを追加するために最小限のJavaScriptを使用してCSSで行われます。
完全な実例の例はon 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は非常に簡単です。すべてのラジオ入力が現在選択されているかどうかを検出し、コンテナーに "selected"クラスの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
を正しく指している場合は、ラベルをクリックするだけでコントロールを正しく選択できます。
JavaScriptを使用していないがCSSを持っているユーザーにはラジオ入力の要素が表示されるように、".js-active"
内のもののみをターゲットにする必要があります。代わりに、ある種の ".radio-js"クラスを同じようにするために、UL
ラッパーに追加することができます。我々はビューのうち、入力要素をシフトすることができますように、我々は各LIにposition:relative
とoverflow:hidden
を入れ
/* 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;
}
:
まず、ボタンを浮遊し、それらをより多くのボタンのような外観を与えます。これは、アクセス可能な、それを維持しないだろうが、我々はちょうどもはやそれを見ている:
/* 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;
}
:Getting the select valuesあなたはより多くのエフェクトを追加したい場合は他の場所SOに示されています。
非常に明確で包括的な - ありがとう! –
頑固に..はるかに良い答え。 –