【CSS】ホバーしたら左からシュッとなるボタンを作る

タイトルで何を実装したいのか分かった方はいるのでしょうか。

下記のようなボタンのことを指しています。

左からしゅっ

左からシュッとしていますよね。

よく見かけるこのボタンの実装方法をご紹介していくのですが、この機能を実装する上での考え方をマスターすると、他のことにも応用できそうな知識が盛りだくさんなのでぜひご覧いただけたらと思います。

様々なCSSの知識を学ぶことができます。

こんな人におすすめ

・上記のボタンの原理を知りたい方

目次

考え方

まずはボタンを実装していく上での考え方を、図を使ってご紹介していきます。

まずはこのようなボタンを作成します。

続いてこのボタンの左端に「幅0・高さがボタンと同じ要素」を作成します。

分かりやすいように図では幅を持たせています。

さらに、ボタンをホバーしたときに、この緑の要素の幅を「0px → ボタンと同じ幅」にするよう設定します。

このままではボタンの丸みが無くなってしまうので、ボタンの枠外を非表示にします。

これで理論上は実装することができました。

ポイントなのは、ホバーしたときに緑の要素の幅を変化させている点です。この緑の要素はCSSの擬似要素を使用して作成していきます。

それでは実際に実装していきましょう!

実装していく

実装する流れをある程度イメージができたとこで、実際にどんなプロパティを適用させていくのかを噛み砕いて解説していきます。

本記事でご紹介する方法でなきゃならないということは決してありません。あくまで選択肢の一つとしてご覧いただけたらと思います。

ボタンを作る

まずは土台となるボタンを作成しましょう。

<a href="#">
  <p>移動する</p>
</p>
a:link, a:visited, a:hover, a:active {
  color: inherit;
  text-decoration: none;
}

a:hover {
  cursor: pointer;
}

a {
  position: relative;
  display: flex;
  width: 200px;
  height: 30px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border: solid 2px #D90A27;
  border-radius: 15px;
}

「移動する」という文字をボタンの中心に配置するために下記のプロパティを設定しています。

a {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

あえてポイントを述べるとしたらそんなもんでしょうか。

このようなボタンができます。

この時点では待てど暮らせど変化はしません。

擬似要素を追加する

続いて、擬似要素「::before」を用いて幅0pxの要素を作成していきます。

a::before {
  position: absolute;
  width: 0;
  height: 30px;
  content: '';
  background-color: #D90A27;
  left: 0;
}

::beforeのルールとして、「content」プロパティを定義しなくてはなりません。今回は空文字「”」を定義しています。

また「width: 0;」によって幅を無くしています。

さらに後でこの擬似要素が幅を持ったとしても、元のボタンの位置が変化しないように「position: absolute;」を設定しています。

これを作成しました。

上記のコードを追加した後のボタンは、見た目は特に変化ありません。

虎視眈々と幅ゼロの擬似要素が待機しています。

ホバー時の挙動を設定

ついに、ボタンにホバーした際の擬似要素の挙動を設定します。

a:hover::before {
  width: 100%;    /* ホバーしたときに幅を100%にする */
}

するとホバー時に擬似要素の幅が100%となり、ボタン全体が赤色で覆われます。

a::before:hover {}だと効かないので注意です。

現段階ですと、一瞬でボタン全体が覆われてしまいます。別にこれでもよいのですが、今回はシュッとさせたいので、ホバー時の要素の変化時間を指定してあげましょう。

a::before {
  position: absolute;
  width: 0;
  height: 30px;
  content: '';
  background-color: #D90A27;
  left: 0;
  transition-duration: .2s;  /* 追加 */
}

この「transition-duration」を設定することで、ホバー時の変化時間を制御できます。

左からシュッとさせることができました。

はみ出している部分を隠す

まだホバー時の赤塗りの形が長方形となっており、ボタンからはみ出しています。

overflow」プロパティを使用してこれを解決します。

a {
  position: relative;
  display: flex;
  width: 200px;
  height: 30px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border: solid 2px #D90A27;
  border-radius: 15px;
  overflow: hidden;  /* 追加 */
}

これで、擬似要素(子要素)が<a>タグ(親要素)からはみ出した部分を非表示にすることができます。

ボタンらしくなってきました。けど「移動する」の文字が擬似要素の下にあるので表示されていません。

重なり順を変える

z-indexプロパティで重なり順を変更し、ホバー時に「移動する」が隠れないようにします。

p {
  z-index: 1;
}

z-indexの数値が大きいほど前面に配置されます。

ホバー時にもちゃんと文字が表示されています。

ホバー時の文字色も変える

真っ赤の背景に黒の文字は視認性が悪いので、ホバー時の文字色を白に変えていきます。

a:hover {
  color: #ffffff;  /* ホバー時に文字色を白に */
}

p {
  transition-duration: .3s;  /* 文字が白になるまでの時間を設定 */
  z-index: 1;
}

ここまでにご紹介した知識のおさらいです。

この辺の文字色や変化時間はお好きに変更してください。

完成しました!

ここまでのコードを全てまとめましたので、確認用としてご覧ください。

index.html
<a href="#">
  <p>移動する</p>
</a>
styles.css
a:link, a:visited, a:hover, a:active {
  color: inherit;
  text-decoration: none;
}

a:hover {
  cursor: pointer;
}

a {
  position: relative;
  display: flex;
  width: 200px;
  height: 30px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border: solid 2px #D90A27;
  border-radius: 15px;
  overflow: hidden;
  margin-top: 100px;
  margin-left: 300px;
}

a::before {
  position: absolute;
  width: 0;
  height: 30px;
  content: '';
  background-color: #D90A27;
  left: 0;
  transition-duration: .2s;
}

a:hover::before {
  width: 100%;
}

a:hover {
  color: #ffffff;
}

p {
  transition-duration: .3s;
  z-index: 1;
}

まとめ

本記事では、ホバー時に左からシュッとするボタンの作成方法をご紹介させていただきました。

ポイントとなるのは、擬似要素を制御して見た目を変化させている点です。本記事の内容をマスターすることで、様々な表現に応用することができます。

ご覧いただきありがとうございました!

記事が見つかりませんでした。

案件、ありますか?

「メインの仕事があるけれど、週1、2日だけできる仕事ないかな、、、」

「ある程度スキルが身に付いてはきたけど、そのスキルを活用できる場が欲しい」

なんて悩みが以前はありました。

自分で仕事を探しに行くのも大事ですが、蛇の道は蛇。その道の人に頼むことで、自分だけでは見つからないような案件に携わることができます。

IT PRO パートナーズでは、簡単に無料でアカウントを登録でき、さらにはエージェントさんに希望の働き方・案件の種類を提示することでお仕事を紹介してくれます!

登録自体も非常に簡単で、「エージェントさんとの面談を希望する」という欄にチェックをするだけで、エージェントさんから直接連絡をいただくことができます。

驚くほど簡単で正直拍子抜けしてしまいました笑

もしお仕事探しに困っておりましたら、一度登録し案件を眺めてみることをおすすめします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

勤めていた設計会社を退社し、フリーランスとして活動しています
また、趣味で主にpyhonを用いて機械学習を行なっています!
現在競艇の予測モデルの開発中です。

コメント

コメントする

目次