[CSS]ソーシャルボタンのリストが蛇腹状に折り畳まれるスタイルシート
Post on:2013年1月29日
ソーシャルサービスのボタンを配置したリストがアニメーションで蛇腹状に折り畳まれるスタイルシートを紹介します。
CSS 3D folding list with social buttons
デモ
デモページを下にスクロールすると、デモがあります。
デモはCSSの3D変形に対応したブラウザでご覧ください。
デモページ:閉じた状態
スクロールすると開いた状態になり、閉じるのは一番上のグレーのバーをクリックします。
デモページ:開いた状態
実装
外部ファイル
jQueryとModernizrを</body>の上に外部ファイルとして記述します。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
HTML
一番上のグレーはh2要素で、各ソーシャルボタンを配置するパネルはリスト要素で実装します。
<h2 class="connect">Connect with me:</h2> <ul class="folding folded"> <li class="fb"> <div class="content"> <div id="fb-root"></div> <div class="fb-like" data-href="https://www.facebook.com/RedTeamDesign" data-send="false" data-layout="button_count" data-show-faces="false"></div> <a href="https://www.facebook.com/RedTeamDesign" class="fontawesome-facebook"></a> </div> </li> <li class="tw">...</li> <li class="gp">...</li> <li class="rss">...</li> </ul>
JavaScript
Modernizrの使用により、CSSの3Dアニメーションをサポートするブラウザに折り畳みのアニメーションを適用します。
<script> (function(){ if ($('html').hasClass('csstransforms3d')) { var foldingList = $('.folding'), foldingListHeight = $('.folding').height(); topElemOffset = foldingList.offset().top, // Function responsible for unfolding the list unfold = function(){ setTimeout(function(){ if (foldingList.hasClass('folded')){ foldingList.removeClass('folded'); return; } }, 500); } // Fold/Unfold the list $('.connect').on("click",function(){ foldingList.toggleClass('folded'); }) // If needed, unfold the list right away if (topElemOffset <= $(window).height() - foldingListHeight) unfold(); // Check whether to unfold the list when scrolling/resizing $(window).on("scroll resize", function(){ var th = $(this); if (th.scrollTop() + th.height() - foldingListHeight >= topElemOffset) unfold(); }) } })() </script>
CSS
リストのスタイルや折り畳みのアニメーションは下記のスタイルシートを使用しています。
※ベンダープレフィックスは省略
.folding { list-style-type: none; margin: 0; padding: 0; } .csstransforms3d .folding { perspective: 700px; } .folding li { height: 50px; color: #fff; padding-left: 30px; border-left: 30px solid rgba(0,0,0,.1); } .csstransforms3d .folding li { transition: ease .15s all; } .csstransforms3d .folding li:nth-child(even) { margin-top: -1px; transform-origin: 50% 100%; transform: rotateX(10deg); } .csstransforms3d .folding li:nth-child(odd) { transform-origin: 50% 0%; transform: rotateX(-10deg); } .folding .fb { background-color: #3959a6; } .folding .tw { background-color: #2fc6ff; } .folding .gp { background-color:#d84d30; } .folding .rss { background-color: #ff7e09; } .rss-link { color: #fff; font: .9em Arial, Helvetica; } .folding .content { position: relative; overflow: hidden; display: block; height: 20px; padding: 15px 0; } .csstransforms3d .folded li:nth-child(even) { margin-top: -75px; transform: rotateX(75deg); background-image: linear-gradient(rgba(255,255,255,0) 50%, rgba(255,255,255,.5)); } .csstransforms3d .folded li:nth-child(odd) { transform: rotateX(-75deg); } .csstransforms3d .folded .content { display: none; } /* Folding list heading */ .connect { padding: 12px 0 12px 30px; margin: 0 0 1px 0; color: #fff; border-left: 30px solid rgba(0,0,0,.2); cursor: pointer; font: bold .9em 'Lucida sans unicode',Arial, Helvetica; background-color: #555; } .csstransforms3d .connect { background-image: url(data:image/png;base64[shortened]); background-repeat: no-repeat; background-position: -24px center; }
複数のドメインをまたがるスクリプトの利用
各ソーシャルサービスのボタンを設置する際に、複数のドメインをまたがるスクリプトを利用します。その際に下記のスニペットを使用し、各スクリプトをロードします。
(function(doc, script) { var js, fjs = doc.getElementsByTagName(script)[0], add = function(url, id) { if (doc.getElementById(id)) {return;} js = doc.createElement(script); js.src = url; id && (js.id = id); fjs.parentNode.insertBefore(js, fjs); }; // Google+ button add('https://apis.google.com/js/plusone.js'); // Facebook SDK add('//connect.facebook.net/en_US/all.js', 'facebook-jssdk'); // Twitter SDK add('//platform.twitter.com/widgets.js', 'twitter-wjs'); }(document, 'script
sponsors