Google Feed APIのカスタマイズ方法について、頻繁に質問をいただいています。今回は、以下の内容でコメントを頂きました。
質問だらけの中大変恐縮なのですが、この記事にあるまさに「左から、更新日の新しい順に並んでいます。」
のような横並びのものと全く同じものを実現したいのですが(ずっとこれを探していました)イマイチCSSとHTML部分をどうしたら良いのかわかりません・・・宜しかったらご教授願えませんでしょうか?
なるほどなるほど~。こういうのをしたいんですね。
方法を書きました。似たようなことをされたい方は、是非ともご参考ください。
前提が1つあります
まずは、Google Feed APIの使い方について書いた記事に掲載されているサンプルコードを動作できることを前提として書いています。「コピー&貼り付けしてできた!」という方でもいいです。
※2015/12/04現在、非推奨のコードになっていますので、代替の方法も考えた方がよいです。
早速コードサンプルです
とりあえず「やりたいことができる」ことを最優先にコードを書きました。「文法などをもっと厳密にしたい!」という方は専門書籍や解説サイトなどを別途参考ください。
それではスタート~。
Javascriptコード
htmlコードを出力させるプログラム箇所のみ、抜粋して書いています。「一体何をやっているんだ・・・」という方は「Google Feed APIでサムネイル付きで複数サイトの最新記事を取得する際、出力するhtmlコードを変更する方法」のページを見て、コードの意味が不明な場合は併せてご参考ください。
for (var j = 0; j < feedsArr.length; j++) { var li = document.createElement("LI"); var aE = document.createElement("A"); var h3 = document.createElement("H3") var spanD = document.createElement("SPAN"); aE.href=aE.title=feedsArr[j][1]; if(feedsArr[j][4].length > 15){ //記事タイトルの長さが16文字以上の場合で条件分岐 aE.appendChild(document.createTextNode(feedsArr[j][4].substr(0, 15) + "...")); } else { aE.appendChild(document.createTextNode(feedsArr[j][4])); } h3.appendChild(aE); spanD.appendChild(document.createTextNode(feedsArr[j][5])); var img_link = document.createElement("img"); img_link.setAttribute("src", feedsArr[j][6]); img_link.setAttribute("width", "150"); //幅:width属性に150pxを指定 container.appendChild(li); li.appendChild(img_link); li.appendChild(h3); li.appendChild(spanD); } }
上のコードで工夫していることは、記事タイトルの長さを特定の文字数を超えると「…」で表示させているところです。記事タイトルが長いと、サムネイルが隠れてしまいますもんね。
続いて、htmlコードについてです。
htmlコード
例えば「3サイト分の新着記事を1記事ずつ表示」させると、以下のようなコードが出力されます。
<ul id="feed"> <li> <img src="サムネイルURL1"> <h3><a href="記事URL1">記事タイトル1</a></h3> <span>サイト名1</span> </li> <li> <img src="サムネイルURL2"> <h3><a href="記事URL2">記事タイトル2</a></h3> <span>サイト名2</span> </li> <li> <img src="サムネイルURL3"> <h3><a href="記事URL3">記事タイトル3</a></h3> <span>サイト名3</span> </li> </ul>
「Google Feed API」を利用すると、サイトごとに出力される「<li>~</li>」はJavascriptで行ってくれますので、出力させるための入れ物「<ul id=”feed”></ul>」さえhtmlファイルに書いてあればいいです。
ただ、「具体的にどういうコードが出力されるの?」という理解が難しいだろうな~と思って、「こんなのが出力されるよ!」という意味で上のコードを紹介しています。
というわけで、出力されたhtmlコードをCSS(スタイルシート)でデザインします。
cssコード
ほんと一例ですけど、こんな感じで書きます。
body{ font-size:11px; width: 100%; background: #eee; padding: 0px; margin: 0px; } a{ text-decoration:none; } ul#feed{ width:100%; margin:10px 0px 0px; padding:0px; } ul#feed li{ position:relative; list-style-type:none; display:inline-block; width:150px; height:100px; overflow:hidden; vertical-align:top; margin:0px 5px 5px; background:#f5f5f5; } ul#feed li h3{ position:absolute; bottom:0px; margin:0px; background:#303030; width:100%; font-weight:normal; } ul#feed li h3 a{ color:#fff; display:block; padding:5px; } ul#feed li span{ position:absolute; top:0px; right:0px; background:#fff; padding:5px 7px; }
重ねて書きますが、コードはサンプルなので、ブラッシュアップなどされたい場合は専門書などを参考ください。
まとめ
こういうのやりたい方って結構多いんだな~と実感しています。結構巷でよく見るアンテナサイトやまとめサイトなどで割と採用されているデザインだったりしますね。ずらっと並んでて、サムネイルもあるんで目を引きます。
質問回答記事はあんまり慣れていないんで、わかんねぇ・・・ってところもあるかも。なるべく最小限の説明にしましたが、どの程度の範囲で説明するのが適切なのか、大変悩みます。
範囲が広すぎると理解されづらいと思いますし。つくづく、相手に伝えるってのは難しいな~と感じながら書きました。お役にたてますと幸いです。
imamuraさん
今回の記事も、とても勉強になりました!
調べつつ、試行錯誤しつつ、わからないことがあります”
画像に記事リンクをはるにはどうすればよいのでしょうか?
教えていただけますとありがたいです。
2014/02/03 11:06:11
ツイート
シェア
どうもです~。html出力に関わるところのみ書いています。
for (var j = 0; j < feedsArr.length; j++) {
/* エレメント作成 */
var aE = document.createElement("A"); //「a」エレメント作成
var img_link = document.createElement("img"); //「img」エレメント作成
/* 値、属性を設定 */
aE.href=aE.title=feedsArr[j][1]; //リンクURLを設定
img_link.setAttribute("src", feedsArr[j][6] ); //「src」属性追加,画像のURLを指定
img_link.setAttribute("width", "150" ); //幅:width属性追加 150pxを指定
/* ノード追加 */
container.appendChild(aE); //「a」エレメント追加
aE.appendChild(img_link); //「a」エレメントの中に「img」エレメント追加
}
前回書いた記事を応用しただけですので、頑張ってみてください~。
Google Feed APIでサムネイル付きで複数サイトの最新記事を取得する際、出力するhtmlコードを変更する方法
https://www.imamura.biz/blog/google/15237
2014/02/05 21:03:13
ツイート
シェア
imamuraさん!
いつもありがとうございます!!!
で、できましたーーーーーーー!!!!!
ありがとうございました(感涙)
2014/02/06 11:41:37
ツイート
シェア
よかったです~!
2014/02/06 11:49:13
ツイート
シェア
画像に記事リンクを入れる方法ですが上記のように記入してもHTMLが崩れてしまいます。
for (var j = 0; j 15){
aE.appendChild(document.createTextNode(feedsArr[j][4].substr(0, 15) + "…"));
}
else {
aE.appendChild(document.createTextNode(feedsArr[j][4]));
}
h3.appendChild(aE);
spanD.appendChild(document.createTextNode(feedsArr[j][5]));
img_link.setAttribute("src", feedsArr[j][6] ); img_link.setAttribute("width", "200");
img_link.setAttribute("height", "160");
container.appendChild(li);
li.appendChild(aE);
aE.appendChild(img_link);
li.appendChild(h3);
li.appendChild(spanD);
}}
});
}}
google.setOnLoadCallback(initialize);
間違っている所を教えて頂けますでしょうか。
2015/07/13 16:58:13
ツイート
シェア
連投すみません。なんか前半の部分がうまくコード貼れていませんでした。
for (var j = 0; j < feedsArr.length; j++) {
var li = document.createElement("LI");
var aE = document.createElement("A"); //「a」エレメント作成
var img_link = document.createElement("img"); //「img」エレメント作成
var h3 = document.createElement("H3");
var spanD = document.createElement("SPAN");
aE.href=aE.title=feedsArr[j][1]; //リンクURLを設定
2015/07/13 17:00:38
ツイート
シェア
出力されたときのhtmlと、CSSがちゃんと適用されているかどうかがちょっと不明ですね。記事の通りにやれば、全く同じ表示にならなくても、近い形にはなると思います。
2015/07/13 17:26:50
ツイート
シェア
ありがとうございます。
もう一度記事を読み直していろいろコードイジってたらなんとか思い通りの表示ができました。
感謝です!
2015/07/14 10:31:09
ツイート
シェア
imamuraさん初めまして。
こちらの記事のような出力方法でなどページ別にURLを変えたいのです。
つまり
——
1ページ目
記事タイトル1
サイト名1
記事タイトル2
サイト名2
——
2ページ目
記事タイトル3
サイト名3
記事タイトル4
サイト名4
—–
このようにしたいのです。
var FA = new Array
"URL1",
"URL2"
);
function initialize() {
var feedsArr = new Array();
var numEntr = 1;
var container = document.getElementById("feed");
恐らくここ辺りを弄ってオブジェクトを2つ作成するということだと思っていますが、どうにも上手く行かず困っています。
試行錯誤して1週間、自分の力では難しくご教示していただけると嬉しいです。
長文失礼しました。
2016/06/07 07:20:36
ツイート
シェア