CSS tips - Material Design な Text Field を作ろう

phi phi on css

Demo

input 要素にフォーカスすると label が縮んで上に移動し, ボーダーの色が変わります.

Code

HTML

<div class='text-field'>  
  <input type='text' onfocus='this.classList.add("focused")' />
  <label>name</label>
</div>  
<div class='text-field'>  
  <input type='password' onfocus='this.classList.add("focused")' />
  <label>password</label>
</div>  

CSS

.text-field {
  position: relative;
  margin-top: 1.5rem;

  input {
    padding-bottom: 0.5rem;
    background-color: transparent;
    border: none;
    outline: none;
    border-bottom: 1px solid rgba(0, 0, 0, 0.1);

    transition: 256ms;
    &:focus {
      border-bottom: 2px solid blue;
    }
  }

  label {
    position: absolute;
    left: 0;
    top: -2px;
    color: #888;
    pointer-events: none;
    transition: 256ms;
  }

  input.focused + label {
    color: blue;
    top: -1rem;
    font-size: 0.6rem;
  }
}

Points

もともと input に当たっているスタイルをリセット

下記のように指定することでブラウザがデフォルトで当てているスタイルをリセットすることができます.

input {  
  background-color: transparent;
  border: none;
  outline: none;
}

隣接セレクタ(+)

隣接セレクタを使うことで js を使わずにフォーカス時のスタイルを変更することができます.

今回は, input 要素に .focused クラスが付与されていると label の位置, 色, サイズが変わるように指定しています.

input.focused + label {  
  color: blue;
  top: -1rem;
  font-size: 0.6rem;
}

Reference