Vue.jsなどでデータバインディングするとき<input>要素がきちんと(セマンティックに)使われて欲しくなる。jQueryなどで見かけ上の動作をされても困るのだ。かといってブラウザデフォルトの<input>の見た目はダサいので格好よくはしたい。 CSSのみでラジオボタンやチェックボックスをボタン化する方法は色々と紹介されているがフォーカス、キーボード操作、flexboxによるサイズの自動調整など細かいところまで考慮されたものが少なかったので、その方法を整理してみる。 基本形 この方法のポイントは以下。 JavaScript不使用 シンプルなHTMLマークアップ ボタンサイズ自動調整 hover checked disabledなどのinput要素自身の属性のみに応じて見た目が変化 フォーカスした時にブラウザが自動で付加する枠がボタンとズレない HTML5バリデーション結果のフィードバッ