2013/06/12(水)twitter埋め込みタイムラインのデザイン変更方法
API1.0の廃止と共にTwitterウイジェットが使えなくなってしまいました。新しい埋め込みタイムラインは通常の方法では細かいデザイン(配色)を変更することができないので、小細工してデザイン変更したまとめ。
新ウイジェットのHTML
<a class="twitter-timeline" href="https://twitter.com/nabe_abk" data-widget-id="344823557110497281">@nabe_abk からのツイート</a> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
設定値がなくなり「data-widget-id="344823557110497281"」というwidget-idで管理されるようになりました。この設定はtwitterの設定画面のものが反映されるようです。
生成されるHTML
<iframe title="Twitter Timeline Widget"
style="border: medium none; max-width: 100%; min-width: 180px;"
allowtransparency="true" class="twitter-timeline twitter-timeline-rendered"
id="twitter-widget-0" frameborder="0"
height="600" scrolling="no" width="520"></iframe>
aタグで書かれていたウイジェット情報がiframeに置きかわっています。以前のように直接HTMLで展開されるわけではないため、CSSでデザイン変更という手も使えません。
iframeの中身を取得する
しょうがないのでiframeの中身を取得しました。
<textarea cols="80" rows="10" id="xxx"></textarea><br>
<input type="button" onclick="get_tw_wiget();" value="取得"><br>
<script type="text/javascript">
function get_tw_wiget() {
var iframe = document.getElementById('twitter-widget-0');
var doc = iframe.contentDocument || iframe.document;
var ele = doc.documentElement;
//alert(ele.innerHTML);
var ta = document.getElementById('xxx');
ta.value = ele.innerHTML
}
</script>
iframe内の構造(2013/06/13現在)
<head>
<link href="http://platform.twitter.com/embed/timeline.567ea07eddcd605b5baec3636ed11d02.default.css" type="text/css" rel="stylesheet" id="twitter-widget-css">
<base target="_blank">
<style type="text/css">body{display:none}</style>
</head>
<body>
<div data-twitter-event-id="0" id="twitter-widget-0" class="root timeline"(以下省略) lang="ja">
<div class="timeline-header customisable-border">
<h1 class="summary">
<a class="customisable-highlight" href="https://twitter.com/nabe_abk" title="nabe@abkさんからのツイート">ツイート</a>
</h1>
<iframe data-twttr-rendered="true" title="Twitter Follow Button" style="width: 165px; height: 20px;" class="twitter-follow-button twitter-follow-button" src="http://platform.twitter.com/widgets/follow_button.1370380126.html#_=1371047423479&align=right&id=twitter-widget-1&lang=ja&screen_name=nabe_abk&show_count=false&show_screen_name=true&size=m" allowtransparency="true" frameborder="0" scrolling="no"></iframe>
</div>
<div role="alert" class="new-tweets-bar" aria-live="polite" aria-atomic="false" aria-relevant="additions">
<button><i class="ic-top"></i>新しいツイート</button>
</div>
<div style="height: 513px;" class="stream">
<ol class="h-feed">
<!--***ひとつのツイートの始まり********************************************************************-->
<li class="tweet h-entry customisable-border" data-tweet-id="344803094204399616">
<a class="u-url permalink customisable-highlight" href="https://twitter.com/nabe_abk/statuses/344803094204399616" data-datetime="2013-06-12T13:07:18+0000"><time pubdate="" class="dt-updated">1<abbr title="時間">時間</abbr></time></a>
<div class="header h-card p-author">
<a class="u-url profile" href="https://twitter.com/nabe_abk" aria-label="nabe@abk (ユーザー名: nabe_abk)">
<img class="u-photo avatar" alt="" src="https://si0.twimg.com/profile_images/1124339503/adiary-100915_normal.jpg" data-src-2x="https://si0.twimg.com/profile_images/1124339503/adiary-100915_bigger.jpg">
<span class="full-name">
<span class="p-name customisable-highlight">nabe@abk</span>
</span>
<span class="p-nickname" dir="ltr">@<b>nabe_abk</b></span>
</a>
</div>
<div class="e-entry-content">
<p class="e-entry-title">ツイート内容</p>
</div>
<div class="footer customisable-border">
<ul class="tweet-actions">
<li><a href="https://twitter.com/intent/tweet?in_reply_to=344803094204399616" class="reply-action web-intent" title="返信"><i class="ic-reply ic-mask"></i><b>返信</b></a></li>
<li><a href="https://twitter.com/intent/retweet?tweet_id=344803094204399616" class="retweet-action web-intent" title="リツイート"><i class="ic-retweet ic-mask"></i><b>リツイート</b></a></li>
<li><a href="https://twitter.com/intent/favorite?tweet_id=344803094204399616" class="favorite-action web-intent" title="お気に入り"><i class="ic-fav ic-mask"></i><b>お気に入り</b></a></li>
</ul>
</div>
</li>
<!--***ひとつのツイートの終わり********************************************************************-->
</ol>
<button class="load-more customisable">さらに読み込む</button>
<p class="no-more-pane" role="alert">
これ以上のツイートはありません。
<i class="ic-bird-flourish"></i>
</p>
</div>
<div class="timeline-footer">
<a class="tweet-box-button web-intent" href="https://twitter.com/intent/tweet?screen_name=nabe_abk">@nabe_abkさん宛にツイートする</a>
</div>
</div></body>
ツイートが複数あるときは繰り返しです。
もともと変更可能なデザイン(2013/06/13現在)
貼り付けHTMLのdata属性等を設定することでCSSに頼らなくても以下のものは変更可能です。
- テーマ: data-theme="dark" または data-theme="light"
- リンクの色: data-link-color="#cc0000"
- 幅と高さ
- レイアウト「noheader nofooter noborders noscrollbar transparent」
- ボーダーの色: data-border-color="#cc0000"
- 言語:
- ツイート数を固定
- おすすめしたいユーザー
transparentに設定すると背景およびボーダーが非表示になるようです。
デザインの変更(2014/08/10更新)
jQueryなどを使って直接CSSを適用させてしまうのが確実ではありますが、それでは新たなツイートをロードしたときに再度jQueryでCSS処理させる必要があります。
仕方ないのでスペシャルなウイジェットiframe専用のCSSをロードさせることにしましょう。
<script type="text/javascript">
!function(){
function css_fix() {
var iframes = document.getElementsByTagName('iframe');
var ch;
for (var i=0; i<iframes.length; i++) {
var iframe = iframes[i];
if (iframe.id.substring(0, 15) != 'twitter-widget-') continue;
if (iframe.className.indexOf('twitter-timeline')<0) continue;
var doc = iframe.contentDocument || iframe.document;
if (!doc || !doc.documentElement) continue;
ch = doc.documentElement.children;
break;
}
if (!ch) return -1;
var head;
var body;
for (var i=0; i<ch.length; i++) {
if (ch[i].nodeName == 'HEAD') head = ch[i];
if (ch[i].nodeName == 'BODY') body = ch[i];
}
if (!head || !body) return -2;
if (body.innerHTML.length == 0) return -3;
var css = document.createElement('link');
css.id = "add-tw-css";
css.type = "text/css";
css.rel = "stylesheet";
css.href = "/css/css-for-twitter-widget.css";
head.appendChild(css);
return ;
};
var try_max = 20;
var try_msec = 250;
function callfunc() {
var r=1;
if (try_max--<1) return;
try{
r = css_fix();
} catch(e) { ; }
if (r) setTimeout(callfunc, try_msec);
}
setTimeout(callfunc, try_msec);
}();
</script>
- 上記JavaScriptソースコードのライセンスはWTFPLです。
- widgetを1画面に2つ以上貼り付ける場合は、多少改造が必要です。
- jQueryを使うともっと簡単だと思います。
- タイマーではなくもっと賢い方法を思いついたら(知っていたら)教えてください。
- IE6, 7非対応。
- 2014/01/31 ツイートボタンがあるとき動作が不安定になる不具合を修正
外部CSSではなく直接指定する方法
上のソースを一部書き換えれば可能になります。
var css = document.createElement('style');
css.id = "add-tw-css";
css.type = "text/css";
css.innerHTML = '\
body div.timeline { \
background-color: red; \
border-color: blue; \
} \
';