Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8780

【JavaScript / CSS】1行目だけ見えているアコーディオンの作り方

$
0
0
こんにちは、ウェブエンジニアのmasakichiです。 需要があるかわからない程度のtipsなどを書いています。 今回は1行目だけテキストが見えているアコーディオンに挑戦します。 なにそれ? こんなアコーディオンです。 テキストの1行目だけ表示されていて、タイトル部分をクリックすると全文が表示されます。 なぜ書いた? 実際、すごく簡単なコードなので記事にするほどでもないのですが、ググって見つけたサンプルが下記のようなコードが多かったので。 ↓ ↓ ↓ こんなHTMLがあるとして、 HTML <dl class="accordion"> <dt> TITLE </dt> <dd> <p> TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT </p> </dd> </dl> ↓ こんなCSSを記述して ↓ SCSS .accordion{ max-width: 300px; margin: 20px auto; dt{ padding: 1em; background-color: #ccc; } dd{ background-color: #eeeeee; height: 1em; overflow: hidden; transition: .3s; } } .accordion.active{ dd{ height: auto; } } ↓ JavaScriptでクラスの付け替えを実装して完成! ↓ JavaScript $(function(){ $('.accordion').on('click',function(e){ if(!$(e.target).parents().is('dt') && e.target !== $(this).find('dt').get(0)){ return; } $(this).toggleClass('active'); }); }); いや、まぁいいんですけど... お気づきの方もいらっしゃると思うのですが、アニメーションはガン無視なのですよ。 height:autoにしたところでtransitionはかからず。 中にはheightの数値を決め打ちで◯◯pxとしてるのもあって、これはたしかにtransitionかかるのですが。。。 数値決め打ちってなぁ。。。行数増えたらどうすんの?と思い、自作することにしました(最初から自作しろ) clip-pathを使ってみる まず考えたのが、heightがダメなら、切り抜き範囲を変えてみたらどうかなと思い、clip-pathを使うことにしました。 ↓ 以下HTML部分は以前のものと一緒です。 SCSS .accordion{ max-width: 300px; margin: 20px auto; dt{ padding: 1em; background-color: #ccc; } dd{ background-color: #eeeeee; clip-path: inset(0 0 calc(100% + -1em) 0); transition: .3s; } } .accordion.active{ dd{ clip-path: inset(0 0 0 0); } } JavaScript $(function(){ $('.accordion').on('click',function(e){ if(!$(e.target).parents().is('dt')&& e.target !== $(this).find('dt').get(0)){ return; } $(this).toggleClass('active'); }); }); これで無事にtransitionもかかって、しっかりテキストの高さ分アコーディオンしてくれるようになりました。 しかし、問題が。。。 まず、下記のようにclip-pathで切り抜いたとしても高さがなくなるわけではないので、もし下に別の要素来るとしたら変な隙間が空いてしまいます。 そしてさらに、clip-pathはIE11に対応しておらず。。。 うーん。これだとかなり使い道が限定されてしまいます。 JavaScriptで実装する はい。結局、JS使って実装しました。 他にもいろいろCSSプロパティをググってみたのですが、いいものが見つからず。。。 もしCSSだけでいけるよ!ってかたがいらっしゃいましたら是非教えてください m(_ _)m < なにとぞ それでは実装例です。 ↓ 先ほど同様に、HTML部分は以前のものと一緒です。 SCSS .accordion{ max-width: 300px; margin: 20px auto; dt{ padding: 1em; background-color: #ccc; } dd{ position: relative; background-color: #eeeeee; transition: .3s; padding-bottom: 1em; overflow: hidden; p{ position: absolute; top: 0; left: 0; } } } JavaScript $(function(){ $('.accordion').on('click',function(e){ if(!$(e.target).parents().is('dt') && e.target !== $(this).find('dt').get(0)){ return; } $(this).toggleClass('active'); let contentsH = $(this).find('p').height(); if($(this).hasClass('active')){ $(this).find('dd').css({ "padding-bottom": contentsH + "px" }); }else{ $(this).find('dd').removeAttr('style'); } }); }); 特に説明が必要なくらいのコードではないかと思いますが、要点として下記です。 クリックイベント時に親要素にactiveクラスを付け替えする クリックイベント時にアコーディオン箇所の高さを取得する activeクラスの有無によってアコーディオン箇所にスタイルをあてる んー。なにかいいCSSはないものだろうか。。。 今日は以上です!

Viewing all articles
Browse latest Browse all 8780

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>