31

Facebookの「いいね!」ボタンを実装していますが、幅に問題があります。直接のiframeではなく、JavaScriptSDKの実装を使用しています。

ドキュメントによると、デフォルトの幅は450です。それで問題ありません。タグのwidth属性を使用して幅を変更できることを理解しています。<fb:like>しかし、私の問題は、固定幅を実際に指定できないことです。ボタンの性質上、幅はすべての状態で一定ではありません。たとえば、まだ誰もそのページを気に入っていない場合は、「友達の中で最初にこれを気に入ってください」と表示されます。誰かが持っている場合は、「このようなXXX人。あなたの友達の最初になりなさい」と表示されます。それでも、気に入った場合は、「あなたはこれが好きです」または「あなたとXXX人はこれが好きです」と表示されます。つまり、ボタンには多くの状態があり、いずれも一定の幅を共有していません。

の右側に浮かぶボタンを表示したいという事実がなければ、これはそれほど問題にはなりません<div>。明確にするために、これは私がしていることです:

<div id="wrapper">
    <span class="fb-like"><fb:like show_faces="false" width="450" font="lucida grande""></fb:like></span>
    ...
</div>
<style type="text/css">
.fblike {
    display: inline-block;
    padding: 0.5em;
    position: absolute;
    right: 0;
    top: 0;
}
#wrapper {
    position: relative;
}
</style>

これは正常に機能しますが、問題は、iframeのが450ピクセルで一定になっていることです。iframeは左揃えなので、テキストが短い場合は右側に余分なスペースがあります。私はtext-align: right無駄にさまざまなアプリケーションを試しました。そして、これはFB SDKによって追加されたiframeの単なる派手なマークアップであるという事実によって、問題はさらに複雑になります。そのため、CSSまたはJavaScriptでコンテンツを変更することはできません。

(a)ボタン領域の幅を動的に保つ(つまり、コンテンツに応じて変化する)ソリューションが必要です。または(b)ボタン領域のすべてを右揃えにします。

誰もが私に与えることができるどんな助けにも感謝します!

4

8 に答える 8

14
#fblike iframe {
    width: 95px !important;
}

#fblike .fb_edge_comment_widget iframe {
    width: 330px !important;
}

<div id="fblike"><fb:like show-faces="false" layout="button_count"></fb:like></div>

このようにして、コメントといいねボタンの両方の iframe が固定幅になります。面白い効果はありません。それが役に立てば幸い。

于 2011-01-28T10:59:16.483 に答える
5

おそらく誰もが知っているように、これを行う簡単な方法はありません。しかし、私はある種のプログラム的なクラッジを思いついた. そして、私がクラッジと言うとき、私は本当にそれを意味します! 私はこれがプライムタイムの準備ができているとは考えていませんが、誰かがコンセプトをいじくり回して、実行可能なものを見つけようとするかもしれません.

アイデアは、iframe のコンテンツ幅を読み取ることはできませんが、iframe 自体の一連の幅を、内部のテキストの折り返しをかろうじて防ぐ幅が見つかるまでループできるということです。その時点で、テキストは iframe の右側に接している必要があります。つまり、iframe の幅を、テキストが折り返される幅よりも 1 ピクセル広く設定したいと考えています。

テキストが折り返されているかどうかの検出は、原則として簡単です。iframe の幅を設定し、FB コードがコンテンツを調整するのを待ってから、高さを読み取ります。すべてが 1 行に収まる場合、高さは約 25px になります。それ以上は、テキストが折り返されたことを意味します。

難しいのは、「FBコードがコンテンツを調整するのを待つ」部分です。iframeの「再描画」を強制する何らかの方法があるに違いないと感じていますが、これまでのところ見つかりませんでした。FB.XFBML.parse() の呼び出しは明らかですが、機能していないようです。これは私が行き詰まった部分です。src 属性を設定することで、iframe を強制的にリロードさせています。現時点では、「概念実証」としての意味があります。再描画がいつ終了したかを知る簡単な方法とほぼ同じです。それも可能だと思いますが、簡単なことを見つける前に私の頭が動かなくなりました。

とにかく、試してみたい場合は、ここにいくつかのテストコードがあります。ボタンを所定の位置に配置するには永遠に時間がかかりますが、少なくとも機能します. ロード プロセス中はすべてを表示したままにしたので、実際のページでは、すべての準備が整うまで非表示にしておくことをお勧めします。また、幅を5pxずつ調整しているため、位置合わせが少しずれている場合があります。物事をより速くすることができれば、代わりに 1px を使用するのは簡単でしょう. さらに良いのは、大まかに調整して近づけてから、微調整して完璧にすることです。明らかに、それを取り上げたいと思う人のために、多くの実験を行う必要があります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>
var likediv, likeframe;
function loadcode(d, s, id)
{
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}
function init()
{
loadcode(document, 'script', 'facebook-jssdk');
likediv=document.getElementById('d2');
setTimeout(initx, 10);
}
function initx()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
if (!likeframe) { setTimeout(initx, 10); return; }
likeframe.style.width='225px';
setTimeout(shrink, 10);
}
function shrink()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
var currwidth=parseInt(likeframe.style.width);
if (currwidth>=500) return;
newwidth=currwidth+5;
likeframe.style.width=newwidth+'px';
likeframe.style.height='0';
likeframe.src=likeframe.src;
setTimeout(checkframe, 10);
}
function checkframe()
{
var h=parseInt(likeframe.offsetHeight);
if (h==0) setTimeout(checkframe, 10);
else if (h>25) shrink();
//else we are done; make the frame visible if we hid it earlier
}
</script>
</head>
<body onload='init()' style='margin:10px 50px'>
<div id="fb-root"></div>
<div style='text-align:right'>Here is some right-aligned text to compare to.</div>
<div id='d2' style='float:right;height:25px;overflow:hidden;border:1px dotted red'>
<div class="fb-like" data-send="false" data-width="225" data-show-faces="false" data-action="recommend"></div>
</div>
</body>
</html>

編集:もう少し実験を行いましたが、それでも扱いにくい回避策ですが、以前よりも高速です:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>
var likediv, likeframe, targwidth;
function loadcode(d, s, id)
{
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}
function init()
{
loadcode(document, 'script', 'facebook-jssdk');
likediv=document.getElementById('d2');
setTimeout(initx, 10);
}
function initx()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
if (!likeframe) { setTimeout(initx, 10); return; }
likeframe.style.width='225px';
setTimeout(shrink, 10);
}
function shrink()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
var currwidth=parseInt(likeframe.style.width);
if (currwidth>=500) return;
targwidth=currwidth+5;
likeframe.style.width='10px';
likeframe.style.height='0';
setTimeout(checkframe, 10);
}
function checkframe()
{
var h=parseInt(likeframe.offsetHeight);
if (h==0) { setTimeout(checkframe, 10); return; }
likeframe.style.width=targwidth+'px';
likeframe.style.height='0';
setTimeout(checkframe2, 10);
}
function checkframe2()
{
var h=parseInt(likeframe.offsetHeight);
if (h==0) setTimeout(checkframe2, 10);
else if (h>25) shrink();
//else we are done; make the frame visible if we hid it earlier
}
</script>
</head>
<body onload='init()' style='margin:10px 50px'>
<div id="fb-root"></div>
<div style='text-align:right'>Here is some right-aligned text to compare to.</div>
<div id='d2' style='float:right;height:25px;overflow:hidden;border:1px dotted red'>
<div class="fb-like" data-send="false" data-width="225" data-show-faces="false" data-action="recommend"></div>
</div>
</body>
</html>

最終編集:これは、この方法がこれまでに得られると思う最高のものです。コードは確かに微調整できますが、トライアル幅を実行して何が機能するかを見つけるには、常に数秒かかります. しかし、実際に使用できるほどの速さ (約 5 秒) になりました。ところで、古いコードを置き換えるのではなく、新しいコード バージョンをそれぞれ追加しています。これは、このコードのクロス ブラウザー テストをあまり行っておらず、より高速なバージョンが誰かのために機能しない可能性があるためです。すべて実験的なコードなので、フォールバック用に別のバージョンを用意したほうがよいと思います。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>
var minwidth=225, maxwidth=500, finished=false, last_was_good=null;
var likediv, likeframe, targwidth, boundlow, boundhigh;
function loadcode(d, s, id)
{
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}
function init()
{
loadcode(document, 'script', 'facebook-jssdk');
likediv=document.getElementById('d2');
setTimeout(initx, 10);
}
function initx()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
if (!likeframe) { setTimeout(initx, 10); return; }
likeframe.style.width=minwidth+'px';
setTimeout(trynewwidth, 1);
}
function trynewwidth()
{
if (last_was_good==null) { boundlow=minwidth; boundhigh=maxwidth; }
else if (last_was_good) boundhigh=targwidth;
else boundlow=targwidth;
finished=((boundhigh-boundlow)<2);
if (finished && last_was_good) { done(); return; }
if (finished && !last_was_good) targwidth=boundhigh;
else targwidth=parseInt((boundlow+boundhigh)/2);
setTimeout(setwidth, 1);
}
function done()
{
//All finished, if we were hiding the div make it visible now
}
function setwidth()
{
likeframe=likediv.getElementsByTagName('iframe')[0];
likeframe.style.width='10px';
likeframe.style.height='0';
setTimeout(checkframe, 10);
}
function checkframe()
{
var h=parseInt(likeframe.offsetHeight);
if (h==0) { setTimeout(checkframe, 10); return; }
likeframe.style.width=targwidth+'px';
likeframe.style.height='0';
setTimeout(checkframe2, 10);
}
function checkframe2()
{
var h=parseInt(likeframe.offsetHeight);
if (h==0) { setTimeout(checkframe2, 10); return; }
if (finished) { done(); return; }
last_was_good=(h<26);
setTimeout(trynewwidth, 1);
}
</script>
</head>
<body onload='init()' style='margin:10px 50px'>
<div id="fb-root"></div>
<div style='text-align:right'>Here is some right-aligned text to compare to.</div>
<div id='d2' style='float:right;height:25px;overflow:hidden;border:1px dotted red'>
<div class="fb-like" data-send="false" data-width="225" data-show-faces="false" data-action="recommend"></div>
</div>
</body>
</html>
于 2011-10-12T18:35:09.033 に答える
5

いいねボタンの XFBML バージョンを Facebook Javascript SDK と共に使用する場合、「xfbml.render」イベントをサブスクライブできます。イベントが発生したら、いいねボタンの iframe の幅を小さな値に設定できます。 . (私は 50px を使用します。) iframe は、構成に従って、ボタンやいいね! カウント、その他の要素を表示するために、必要に応じて幅を自動調整します。

https://developers.facebook.com/docs/reference/javascript/

このソリューションの最大の障害は、Facebook アプリ ID が必要になることです。ここでアプリを作成すると、アプリ ID を取得できます: https://developers.facebook.com/apps/

于 2012-04-08T13:53:56.637 に答える
3

CSSの修正

.fb-like, 
.fb-like > span,
.fb-like > span iframe {
    max-width:273px;
}
于 2012-08-25T09:23:04.113 に答える
2

サイズを選択する際に読む価値のある FAQ の回答がいくつかあります。

https://developers.facebook.com/docs/plugins/like-button

そうは言っても、それはまだかなり不可解です:

「プラグインの幅。選択したレイアウトは、使用できる最小幅とデフォルト幅に影響します。詳細については、以下の FAQ を参照してください。」

標準

最小幅: 225 ピクセル。

action が「recommend」の場合、最小値は 40px 増加し、send が「true」の場合、60px 増加します。

デフォルトの幅: 450 ピクセル。高さ: 35 ピクセル (写真なし) または 80 ピクセル (写真あり)。

box_count

最小幅: 55 ピクセル。デフォルトの幅: 55 ピクセル。高さ: 65 ピクセル。

ボタン数

最小幅: 90 ピクセル。デフォルトの幅: 90 ピクセル。高さ: 20 ピクセル。

ボタン

最小幅: 47 ピクセル。デフォルトの幅: 47 ピクセル。高さ: 20 ピクセル。

于 2014-05-20T07:57:03.027 に答える
2

私は個人的に次のものを使用しています...

#fbook-like {
    width: 50px !important; /*width of just the button*/
    overflow: visible; /*so there is no cut off*/
    vertical-align: top; /*bc all other like buttons align top*/
}

私がここで行ったことは、右端に fb ボタンを配置して、私の端に合わせ、追加されたコメント (幅が動的) だけが端を越えて表示されるようにすることです。長さに関係なく、コメントを表示しながら良いデザインを保つことができます。

于 2012-09-08T22:22:30.437 に答える
0

これをCSSに追加しました:

div.fb-like.fb_iframe_widget > span {
 width: 100% !important;
}

div.fb-like.fb_iframe_widget{
 width: 100%;
}
于 2016-05-11T12:21:43.950 に答える
0

add-this プラグインでこれと同じ問題に直面しなければならず、同様の方法で解決しました。

.addthis_button_facebook_like,
.addthis_button_facebook_like span,
.addthis_button_facebook_like span iframe {
    max-width: 450px !important;
}
于 2014-04-02T14:29:43.033 に答える