コード
HTML
<div class="fbWrapper" id="fbWrapper"></div>
まずHTMLですが、facebook標準の埋め込みコードはJSで出力するため、class="fb-page"
等が付いているdiv
はごっそり削除してラッパーのdiv
のみとします。
※<div id="fb-root"></div>
やscript
タグは残しておいてください。
jQuery
$(function() {
if($('#fbWrapper').length) {
facebookResize();
}
});
//facebookをリサイズする度に幅を調整
function facebookResize() {
var $fbWrapper = $('#fbWrapper');
var fbBeforeWidth = '';
var fbWidth = $fbWrapper.width();
//setTimeOutで負荷軽減
var timer = false;
$(window).on('load resize', function() {
if (timer !== false) {
clearTimeout(timer);
}
timer = setTimeout(function() {
fbWidth = $fbWrapper.width();
if(fbWidth !== fbBeforeWidth) {
$fbWrapper.html(fbCodeGen(fbWidth));
window.FB.XFBML.parse();
fbBeforeWidth = fbWidth;
}
}, 300);
});
}
//facebookのコードを生成
function fbCodeGen(w) {
var hrefUrl = 'https://www.facebook.com/facebook'
var name = 'Facebook'
return '<div class="fb-page" data-href="' + hrefUrl + '" data-tabs="timeline" data-width="' + w + '" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="false"><blockquote cite="' + hrefUrl + '" class="fb-xfbml-parse-ignore"><a href="' + hrefUrl + '">' + name + '</a></blockquote></div>';
}
こんな感じです。ポイントは
- ロード時、リサイズ時にfacebook埋め込みコードの出力とページプラグインの再読み込みを実施
- facebook埋め込みコードの中の幅を
w
で動的に変動させている
- facebook埋め込みコードの中の幅を
- 負荷軽減のため
setTimeout
を使う
- タグURLと名前は使い回しが効くように変数に切り出し
Scss
.fbWrapper{
height: 600px; //描画の度に高さが変動してカクつくのを防ぐ
max-width: 500px;
margin: 0 auto;
& > .fb-page {
width: 100%;
& > span {
width: 100% !important;
}
}
}
iframe {
width: 100% !important;
}
Scssはこんな感じで。
height: 600px;
はスマホ表示などで1カラムになった際に、リサイズで再描画が走ると一時的に高さが失われてしまい、下のコンテンツが上下してしまうのを防ぐために書いておきました。
これでとりあえず目的は達成できました。