MENU

CSSでChromeのinput要素のオートフィル時に黄色い背景色になる問題を解決

すごい細かいことで、気づいていない方もいるかもしれませんが、僕は気になったので解決方法を紹介します。本当に細かい部分まで配慮できるWeb制作者こそ素晴らしいと思います。

Chromeにおける問題



こんな感じで <input> 要素を配置します。そして、ダブルクリックしてみると、黄色い背景色とともに候補が表示されます。ここに表示される候補は、他サイトで入力した際のものも表示されます。どのような場合に候補に表示されるかというと、name 属性が他サイトなどと同じだったら候補として表示されます。場合によっては、ダブルクリックしなくても初期状態で、<input> 要素に値が入力され、背景色が黄色になっていることもあります。

この黄色い背景色がダサいですよね。ページの配色とマッチしないときなどは最悪です。これをなくしていきたいと思います。

box-shadowで隠す


input:-webkit-autofill
{
  /* 色はinput要素の背景色(ここでは#fff)にそろえる */
  box-shadow: 0 0 0px 999px #fff inset;
}

古くからある手法で、色々なWebサイトで紹介されていると思います。内向きの box-shadow で隠してしまうということですね。しかし、この手法には弱点があります。

弱点


input 
{
  background-color: red;
  -webkit-transition: .3s ease;
  transition: .3s ease;
}
input:focus 
{
  background-color: blue;
}
input:-webkit-autofill
{
  box-shadow: 0 0 0px 1000px blue inset;
}

このようにフォーカスしたときに背景色を赤色から青色transition で変えたいときなど、transition プロパティを使用するときは注意が必要です。このままだと、<input> 要素をダブルクリックして候補を表示し、その候補にマウスカーソルを持って行ったり、候補からマウスカーソルを外したりすると、transition.3s の分、一瞬ですが黄色い背景色がチラつくのです。この方法では黄色い背景色は消しているわけではなく、ただ box-shadow で上にかぶせて見えないようにしているだけです。なので、このような問題が起きます。

また、box-shadow で色を毎回指定する必要があり、汎用性に欠けます。

transition-duration


input 
{
  background-color: red;
  -webkit-transition: .3s ease;
  transition: .3s ease;
}
input:focus 
{
  color: pink;
  border-color: green;
  background-color: blue;
}
input:-webkit-autofill 
{
  /* ここで指定しているbackground-colorは黄色い背景色のことです */
  -webkit-transition: background-color 9999s;
  transition: background-color 9999s;
}

duration9999s など非常に長い時間にしてしまうことで、回避することができます。この手法なら :-webkit-autofill の部分はその都度変更する必要はなく transiton も好きなように使えます。汎用性が非常に高いのでオススメです。