0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

jQueryで擬似要素(::before,::afterなど)に変化を加える(風)!!

Last updated at Posted at 2019-12-25

概要

jQueryで「擬似要素に変化を加えるのってどうやるんだろう」、「そもそも擬似要素って要素として取得できるのかな〜」と少々苦戦したため、備忘録として残します。
世間はクリスマスですが、Qiita2投稿目にトライしてみるので、温かい目で見てくださると嬉しいです:relaxed:

まずは、デモ動画をご覧下さい!!
Image from Gyazo

非常に細かい点ですが、CategoryColorの右端にがあり、イベント発火時(mouseover)、になっております。
この擬似要素::afterです。
変化が加わり、向きが変わっているように見えますが、実際は別のclassを作成し、イベントの発火に伴いclassの入れ替えをしているというものです。

::before, ::afterなどの擬似要素はDOM要素では無いため、JavaScriptで要素の取得や、変化を与えることが出来ないためです。
では、順を追ってご説明します。

※そもそも擬似要素って?という方は以下のリンクを参考にしてみてください:point_up:
https://saruwakakun.com/html-css/basic/before-after

1.Haml, CSS

left-bar.html.haml
.left-header
  .left-header__lists 
    %ul.nav
      %li
        .select Category ※ここにカーソルが乗るとイベント発火
        %ul#option 
          %li
            = link_to  outer_items_path do
              = fa_icon "square-o"
              Outer
          %li
            = link_to tops_items_path do
              = fa_icon "square-o"
              Tops
          %li
            = link_to bottoms_items_path do
              = fa_icon "square-o"
              Bottoms
          %li
            = link_to shoes_items_path do
              = fa_icon "square-o"
              Shoes
          %li
            = link_to goods_items_path do
              = fa_icon "square-o"
              Goods
left-bar.css
.left-header{
  width: 250px;
  height: 650px;
  padding: 40px 30px 0 70px;
  position: relative;
  &__lists{
    width: 120px;
    height: 400px;
  }
  .nav {
    margin-bottom: 30px;
    position: relative;
    cursor: pointer;
  }
  .select{
    color: $black;
    font-family: $main-font;
    @include border-line;
    font-size: X-large;
    font-weight: bold;
  }
  #option{
    text-decoration: none;
    list-style: none;
    font-size: large;
    display: none;
    font-family: $main-font;
    li{
      a{
        color: $black;
        font-size: 21px;
      }
      .fa{
        color: $black;
      }
    }
    }
  } 今回のポイントはここです!!⇩
  .select:after{
    position: absolute;
    content: "▼";
    font-size: 12px;
    right: 0;
    bottom: 1px;
    color: #9a8478;
    }
  .select_a:after{
    position: absolute;
    content: "▲";
    font-size: 12px;
    right: 0;
    bottom: 1px;
    color: #9a8478;
  }

selectの擬似要素::afterを画像のように2種類用意しておくことがポイントです!
contenの中身だけを変更します!!

2.jQuery

以下jQueryのコードです。(jQueryが使用可能な環境になっているという前提で話を進めます。)

left-bar.js
$(function(){
	$(document).on("turbolinks:load", function(){
		var nav = $(".nav");
		$("li", nav)
		.mouseover(function(e){
			$("ul",this).stop().slideDown("fast"); 
			var select = $(this).children(".select")[0];
			$(select).toggleClass("select_a");
		})
		.mouseout(function(e){
			$("ul", this).stop().slideUp("fast");
			var select = $(this).children(".select")[0];
			$(select).toggleClass("select_a");
		});
	})
})

.nav%li、つまり.selectにマウスカーソルが乗った時、子要素の%ul#optionをスライドによって表示させます。

②mouseoverされた.selectのDOM要素を取得し、変数化します。
console.logで下記画像の様に取得出来ていればOKです!
Image from Gyazo

③変数化された.selectの擬似要素を.toggleClassで切り替えて実装完了です!:ok_hand:

mouseoutの時は、逆の動きをするのでslideDownslideUpを書き換えるだけでOKです!

まとめ

擬似要素には直接変化を与える事が出来ないので、classを切り替える事で変化を加える(風)に実装しました!
font-awesomeなどを用いていれば、もう少し簡単に実装出来たのかなとも思います。。。
最後まで読んで下さりありがとうございました:relaxed:

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?