Подтвердить что ты не робот

Как я могу изменить ширину кнопки Facebook Like Button?

Я реализую Facebook Like Button, но у меня проблемы с шириной. Я использую реализацию JavaScript SDK, а не прямой iframe.

В соответствии с документацией ширина по умолчанию 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 безрезультатно. И эта проблема еще больше усугубляется тем фактом, что это действительно просто причудливая разметка для iframe, добавленная FB SDK, поэтому я не могу изменить какое-либо ее содержимое с помощью CSS или JavaScript.

Мне нужно решение, которое будет либо (a) поддерживать ширину динамической области кнопки (то есть, она изменяется в соответствии с содержимым); или (b) выровнять по правому краю все в области кнопок.

Спасибо за любую помощь, которую любой может мне дать!

4b9b3361

Ответ 1

#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 являются фиксированной шириной. Никаких смешных эффектов. Надеюсь, что это поможет.

Ответ 2

Как все, наверное, уже знают, что нет простого способа сделать это. Тем не менее, я придумал программный кудд. И когда я говорю "kludge", я действительно это понимаю! Я не считаю это готовым к прайм-тайм, но кто-то может захотеть возиться с этой концепцией и попытаться найти что-то работоспособное.

Идея состоит в том, что, хотя вы не можете прочитать ширину содержимого iframe, вы можете пропустить серию ширины для самого iframe, пока не найдете тот, который едва ли предотвращает обтекание текста внутри. В этот момент текст должен касаться правой части iframe. Другими словами, мы хотим установить ширину iframe на 1px шире, чем ширина, которая заставит текст обернуть.

Обнаружение того, является ли перенос текста довольно простым в принципе - вы устанавливаете ширину iframe, дождитесь, когда код FB настроит контент, а затем прочитайте высоту. Если все поместится на одной линии, высота должна быть около 25 пикселей. Более того, текст завернут.

Трудность связана с "ожиданием части кода FB для настройки содержимого". Я чувствую, что должно быть что-то, чтобы заставить "перерисовать" iframe, но пока я его не нашел. Вызов FB.XFBML.parse() очевиден, но, похоже, он не работает. Это та часть, где я застрял. Я заставляю iframe перезагружаться, установив свой атрибут src, который выполняет эту работу, но по ужасной цене в скорости. На данный момент это просто означает "доказательство концепции". Почти так же хорошо было бы простым способом узнать, когда был завершен какой-либо перерисовка; Я чувствую, что это также должно быть возможно, но мой мозг увяз, прежде чем я нашел что-нибудь простое.

В любом случае, вот какой-то тестовый код, если вы хотите попробовать. Требуется навсегда, чтобы кнопка была на месте, но она работает хотя бы. Я оставил все видимым во время процесса загрузки, чтобы вы могли видеть, что он делает, на реальной странице было бы лучше держать вещи скрытыми, пока все не будет готово. Также обратите внимание, что выравнивание может быть слегка отключено, потому что я изменяю ширину 5 пикселей за раз. Если бы все могло быть сделано быстрее, было бы легко использовать 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>

EDIT: Немного больше экспериментировал, все еще неудобный обходной путь, но быстрее, чем раньше:

<!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 секунд), что он может быть полезен. BTW Я добавляю каждую новую версию кода вместо замены старых, потому что я не сделал много кросс-браузерного тестирования этого кода, и, возможно, более скоростные версии не сработают для кого-то. Поскольку весь экспериментальный код, я думаю, что лучше иметь разные версии для резервного копирования.

<!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>

Ответ 3

Если вы используете версию XFBML кнопки Like, наряду с SDK для Javascript Facebook, вы можете подписаться на событие "xfbml.render", и как только это событие срабатывает, вы можете установить ширину подобной кнопки iframe для небольшое значение. (Я использую 50px.) Затем iframe автоматически настраивает свою ширину, чтобы отображать кнопку и как счетчик и любые другие элементы, в соответствии с вашей конфигурацией.

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

Самым большим препятствием для этого решения является то, что вам понадобится идентификатор приложения Facebook. Вы можете получить идентификатор приложения, создав здесь приложение: https://developers.facebook.com/apps/

Ответ 4

Я лично использую следующее...

#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 на крайнее право, и поэтому она выравнивается с моим краем, и только добавленные комментарии (динамические по ширине) будут отображаться за краем. Я могу сохранить хороший дизайн, пока вы показываете комментарии, независимо от длины.

Ответ 5

Есть несколько ответов на часто задаваемые вопросы, которые стоит прочитать при выборе размера.

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

Хотя с этим сказано, что все еще довольно загадочно:

"Ширина плагина. Выбранный макет влияет на минимум и ширины по умолчанию, которые вы можете использовать, см. часто задаваемые вопросы ниже для более Подробности".

стандартные

Минимальная ширина: 225 пикселей.

Минимальное увеличение на 40 пикселей, если действие "рекомендуется" и увеличивается на 60 пикселей, если send is "true".

Ширина по умолчанию: 450 пикселей. Высота: 35 пикселей (без фотографий) или 80 пикселей (с фотографиями).

box_count

Минимальная ширина: 55 пикселей. По умолчанию ширина: 55 пикселей. Высота: 65 пикселей.

button_count

Минимальная ширина: 90 пиксели. Ширина по умолчанию: 90 пикселей. Высота: 20 пикселей.

кнопка

Минимум ширина: 47 пикселей. Ширина по умолчанию: 47 пикселей. Высота: 20 пикселей.

Ответ 6

Исправление CSS

.fb-like, 
.fb-like > span,
.fb-like > span iframe {
    max-width:273px;
}

Ответ 7

Мне пришлось столкнуться с этой же проблемой с добавлением этого плагина и решить аналогичным образом:

.addthis_button_facebook_like,
.addthis_button_facebook_like span,
.addthis_button_facebook_like span iframe {
    max-width: 450px !important;
}

Ответ 8

Я добавил это в свой CSS:

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

div.fb-like.fb_iframe_widget{
 width: 100%;
}