Result
ちょっと今更感ありますけど、チェックボックスがチェックされるとinputが入力できるようになるやつです。上のUIは少し違いますけど、鍵の部分がチェックボックスになっています。
よくある「同意するにチェックを入れて~」的なやつに使えそうでしょうか。
※この同意する云々のUIの意味に対する是非はここでは割愛します
css
div { --field-size: 50px; --field-border-color: #ccc; margin: auto; top:40px; font-size: 1rem; background: #ffffff; border-radius: 5px; position: relative; width: 400px; overflow: hidden; display: flex; background: white; } div input[type="checkbox"] { position: absolute; opacity: 0; width: var(--field-size); height: var(--field-size); cursor: pointer; padding: 0; margin: 0; } div input[type="checkbox"]:hover + span { background-image: url("unlock.png"); background-repeat: no-repeat; background-position: center center; background-size: 50%; } div input[type="checkbox"]:checked + span { background-image: url("unlock.png"); background-repeat: no-repeat; background-position: center center; background-size: 50%; } div input[type="checkbox"]:checked + span::before, div input[type="checkbox"]:checked + span::after { pointer-events: none; } div input[type="checkbox"]:checked + span::after { transform: translateY(-100%); } div input[type="checkbox"]:checked + span::before { transform: translateY(100%); } div input[type="checkbox"] + span { width: var(--field-size); height: var(--field-size); border-right: 1px solid var(--field-border-color); background-image: url("lock.png"); background-repeat: no-repeat; background-position: center center; background-size: 50%; cursor: pointer; } div input[type="checkbox"] + span::after, div input[type="checkbox"] + span::before { content: ""; position: absolute; right: 0; height: 50%; left: var(--field-size); transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); background: rgba(0, 0, 0, 0.075); z-index: 2; cursor: not-allowed; } div input[type="checkbox"] + span::after { top: 0; } div input[type="checkbox"] + span::before { bottom: 0; } div input[type="text"] { padding: 1em; border: 0; flex: 1; font-size: 1rem; --placeholder-color: #ababab; font-family: inherit; }
disable風に見せかけて、実際はpointer-events: none;
とcursor: not-allowed;
、背景カラーのグレー化でそれっぽく見せてるだけです。ロック/アンロックのスイッチは隣接セレクタで実装します
分かりにくいかもしれないので部分的なサンプルを用意しました。
以下はinput要素にpointer-events: none;
を指定すると選択不能になる、のサンプルです。
手前のチェックボックスにチェックが入ってないと、隣接するinput要素がこの状態になっている上に背景色やマウスポインターが変更あれた状態なのでdisableの状態に見える、という仕組みです。
html
<div> <input type="checkbox" /> <span></span> <input type="text" placeholder="hogehoge" /> </div>
空要素が気になる方はちょっと気持ち悪いかもしれませんね。必要に応じて便宜工夫してください
can i use
pointer-eventsのブラウザ対応状況です。概ね動作するみたい