背景画像を更新ボタンを押すごとに変化させたい
先日、背景画像の入れ替え方法をこちらで教えていただきました。そこで更に変化を加えたいのですが・・・用意した複数の背景を、更新ボタンを押すごとに変化させるにはどのようにしたらいいでしょうか?現在の私のブログはこちらです。
調べるとJAVAを使用するとの事だったのですが、どこを削除してどこにはめ込めばいいのかサッパリわかりません。
こういうのとか、
ranimg = new Array();
ranimg[0]="
こういうやつです。
jmp[0] = "
ド素人なので分かりやすく教えていただければ助かります^^;
回答(1)
1.

まあ、その生成した配列でonloadイベントごとにランダム変数なのかただ配列の次の画像の番号にするのかして配列内の新しい画像を呼び出せばいいんだと思われ。
onload="get_new_pics"で
array_num; //配列ナンバ
function get_new_pics(){
if(array_num && array_num<ranking.length-1 ]){
array_num++;
}else{
array_num=0;
}}
//配列ナンバに何かしらの値が入っていて
//ranking配列の最後のイメージの配列番号より小さければ
//配列ナンバーを1個プラス、それ以外は0に初期化。
とりあえず元のコードがわからんとなんとも。。。
詳しく教えて下さって感謝いたします。
またこまごまと質問するかもしれませんが、その時はまたよろしくお願いします!!
コメント(24)
Java"script"な
length-1 ]){の"]"はタイプミスなので削除してねorz
/* =============================================== */
/** 03. Title - ブログタイトルエリア */
/* ----------------------------------------------- */
#container .blog-title-outer {
width: 870px;
height: 300px;
margin: 0 auto;
background: url(http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6...) no-repeat;
text-align: left;
}
#container .blog-title-outer h1 {
margin: 0;
padding: 125px 0 0 340px;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 22px;
font-weight: bold;
color: #000;
}
#container .blog-title-outer h1 a {
color: #000;
text-decoration: none;
}
#container .blog-title-outer .blog-description-outer {
margin: 0;
padding: 10px 0 0 340px;
font-size: 12px;
color: #000;
line-height: 1.3;
}
コードとはJavaScriptのソースコードのことです。
たとえばこんな感じの。
<script type="text/javascript">
<!--
ranimg = new Array();
ranimg[0]="画像1のURL";
ranimg[1]="画像2のURL";
ranimg[2]="画像3のURL";
xx = Math.floor(ranimg.length*Math.random());
ranimg = ranimg[Math.floor(xx)];
document.write('<img src="'+ ranimg +'">');
// -->
</script>
imqさんありがとう御座います。
私が他サイトで見かけたのはそのコードです。
ライブドアのCSSに組み込ませるにはどうのようにすればいいのかが分かりません。
#3のコメントに置いてるのが、ブログのタイトルエリアのシートになります。見当違いだったらすいません。
これはトップページの部分のコードです。
どこがどうなのか分からないのでそれっぽいとこを貼ります>.<
<!-- ............... Header ............... -->
<$BlogHeader$>
<!-- ............... Container ............... -->
<div id="container">
<!-- ..... Title ..... -->
<div class="blog-title-outer">
<div class="blog-title-outer-2">
<div class="blog-title-outer-3">
<h1 id="blog-title"><a href="<$BlogUrl$>" title="<$BlogTitle ESCAPE$> トップへ"><$BlogTitle ESCAPE$></a></h1>
<div class="blog-description-outer"><p id="blog-description"><$BlogDescription$></p></div>
</div>
</div>
</div>
<div id="content" class="hfeed">
<!-- ..... MainColumn ..... -->
<div id="main" class="column">
<div class="column-inner">
<div class="column-inner-2">
<$IndexNavigator$>
ベストありがとう。
>>#3はCSSでレイアウトの設定の部分です。
>>#4でimgさんが示してるようなものです。
CSSでの設定ですか。
あろーずさんのいう「背景画像の入れ替え方法」というのはどういったものだったのでしょうか?単にCSSの
background: url(http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6...) no-repeat;のurlを変更すれば画像が好きなものに替えられますよ、ということなのでしょうか?その辺がいまいち飲み込めてません。
Javascriptで「動的に」(ユーザーの操作でプラグラムが臨機応変に動く)動かすなら、
フリーエリアというプラグインを追加して、そこにJavascriptのコード(プログラム)を追加しないといけません。
幸いDOMというAPI(全体で何かをうまく機能させるためのプログラムの集合体とその命令郡)でCSSを動かすメソッド(命令コード)が用意されてます。
多分これですね
backgroundImageプロパティ
http://jsajax.com/BackgroundImageArticle526.aspx
このメソッドを利用して
background: url(http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6...) no-repeat;のurlを「動的に」替えられると思います。
ああ、ちょっと待って。
背景といってもWindow全体の背景ではなくて
CSSでいう.blog-title-outerのbackgoundimageを変えなきゃいけないのか。
とりあえずできそうだ。途中経過
やっつけでもいいよねw
そのブログタイプの表紙画像を変えるのは
var obj = document.getElementById("container").childNodes[1];
まずCSS見てもわかるように#container内の.blog-title-outerクラスのノード(階層)で設定してるのでそこのノードを変数に入れます。本当はclass指定でDIVタグの階層を呼べるといいのだがclassの呼び方忘れたので、その上の階層のid="container"タグから実際のHTMLを見て階層を降りていきましたw(ヘタレでスマソ)
<div id="container"> |-<!-- ..... Title ..... --> |-<div class="blog-title-outer"> |-<div class="blog-title-outer-2"> ・・・・こういう階層になってると思う。なのでid=id="container"DIVの2番目(配列は0からなので[1])の子ノードを指定します。
その後、その階層のstyle
background: url(http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6...) no-repeat; text-align: left; }のうち、イメージ画像部分を変更します。
obj.style.backgroundImage = "url(http://parts.blog.livedoor.jp/img/usr/lovely_xmas/header.jpg)";
多分同じブログデザインタイプだからそれで変更されると思うよ。
で注意してもらいたいのは、この変更はこのブログデザインのタイプだからできるのであって、他のデザインだと別の構造や名前のところのCSSで指定しているからどこで指定されているかチェックしてidやclassから変更するCSSの階層を指定してやらなきゃいけない。
とりあえずは、ブログパーツにフリーエリアを追加して、下のコードをそのまま貼り付ければ今の流れを確認できると思う。
最初にCSSで指定されてる表紙画像が出て、Helloのアラートが表示される。でOKすると表紙画像がクリスマスのやつに変わるよ。
<script type="text/javascript"><!--
alert("hello");
var obj = document.getElementById("container").childNodes[1];
obj.style.backgroundImage = "url(http://parts.blog.livedoor.jp/img/usr/lovely_xmas/header.jpg)";
--></script>
できた。コメントに入らないので分割で
<script type="text/javascript"><!--
var bgrounds = new Array('http://parts.blog.livedoor.jp/img/usr/lovely_xmas/header.jpg','http://parts.blog.livedoor.jp/img/usr/t_butterfly_reki/header.gif','http://parts.blog.livedoor.jp/img/usr/prison_break_3c/bg_body.jpg','http://parts.blog.livedoor.jp/img/usr/kamiki_aya/main.jpg','http://parts.blog.livedoor.jp/img/usr/hanamonogatari/header.jpg','http://parts.blog.livedoor.jp/img/usr/bt011_tulip_girl/entry_bottom.gif');
//bgrounds:背景画像URLの配列
var array_num = Math.floor( Math.random() * bgrounds.length);
//配列の中でランダムに配列ナンバー
var obj = document.getElementById("container").childNodes[1];
//<div id="container">下階層の2番目にある<div class="blog-title-outer">エレメントのノード取得
obj.style.backgroundImage = "url(" + bgrounds[array_num] +")";
//取得ノードで背景イメージをCSSにて変更
//--></script>
以上
補足:
・このコードはあのデザインタイプでしか使えません。
(上に書いたようにデザインによって構造が違っていて、背景画像URLの収まってるCSSがどのノードのものか変わってくるため)
・URLはいくつ入れてもいいように設定してある。
・CSSの方で
>background: url(http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6...) no-repeat;
の行は消してください。
(一度もとのやつが見えてから切り替わってしまうので)
・途中で処理をはさんでるので画像が1テンポ遅れで表示されます。
・コードがヘタレなのかなんなのかたまにランダム画像が表示されない時があります。(途中でアラート入れて確認するとこの不具合は起きないから不思議)リロードすればそのうち本来の画像が出るはずです。
ベストもらったのになんだか頼りないですが一応形にはしてみました。
他の方でいいやり方があれば補足してくださいorz
以上
プーニンさん有難う御座います!
何枚でもURLを貼れるのもいい感じです♪
ただ、やはり最初の「1テンポ」が気になってしまうのですが、#4のimqさんが貼ってくれてるようなVer.にすると、そういのも解消されるのでしょうか?
更にもうワンプッシュなお願いで申し訳ないです。
もちろん今のでも大満足です♪
ありがとう御座いました!
imqさんのコードとほぼ同じですよ。
imqさんのは単純なHPに書いてある要素(文字・画像etc)の最後にイメージを追加するコードなので、表紙画像は変えることはできません。(まあよくあるJavascriptのサンプルをこんなものでは?と提示してもらったんだと思います)
処理の遅さはDOM使っている点ですかね。Javascriptやってたのも数年前だし、今じゃ色々調べればもっといいAPIがあるみたいですから(JQueryとか)そっちで同じ作業を作り直せばできるんじゃないでしょうか。おじさんはそれが世に出たときはもうJavascriptやってなかったのでやっつけではどんなメソッドがあるのかもわからず使いませんでした。
調べたらlivedoorでもhttp://blog.livedoor.jp/eeu/archives/55095489.htmlのようなサイトがあり、コメントしてくれてるimqさんの名もあったので、ナレにいる人かもね。サイトに行って声をかけてみて教えてもらってもいいかもしれません。
ブログタイトルのすぐ後ろにJavaScriptを設置するといいです。
フリーエリアは削除して、
「トップページ」「個別記事ページ」「カテゴリアーカイブ」「月別アーカイブ」の各テンプレートにある
<div id="content" class="hfeed">の上の行辺りに貼り付けるのがちょうどいいと思います。
あとIE以外のブラウザではうまく取得できないので↓の2行を、
var obj = document.getElementById("container").childNodes[1];
obj.style.backgroundImage = "url(" + bgrounds[array_num] +")";
↓に変えてみてください。var obj = document.getElementsByTagName('div');
for(var i = 0; i < obj.length; i++)
if(obj[i].className == 'blog-title-outer')
break;
obj[i].style.backgroundImage = "url(" + bgrounds[array_num] +")";
プーニンさんありがとう!
そして、imqさんもありがとう!!
ナレを振りまきたいくらい感謝しています♪
早速ためしたところ、ページもサクサク表示されとてもスッキリしました^^
またヘンピな質問するかもですが、その時はまたよろしくお願いします!!
あああ、しいて言うなら、更新を押すとブラウザの左下にエラーが出るようになったことくらいでしょうか。別になにか問題があるわけではないのですが、毎回出るので気になります・・orz
ライン4
文字367
エラー:終了していない文字列型の定数です。
コード:0
URL: http://blog.livedoor.jp/lovehima1/
毎回というわけではないのですが、頻度が高めに感じます。
不要なプラグインを設置してるかもなのですが・・・
前後はこのようになってます(文字数オーバーのため2分割)
</div>
</div>
</div>
<script type="text/javascript"><!--
var bgrounds = new Array('http://image.blog.livedoor.jp/lovehima1/imgs/6/f/6f5371f6.jpg','http://image.blog.livedoor.jp/lovehima1/imgs/b/0/b0cd039d.jpg');
var array_num = Math.floor( Math.random() * bgrounds.length);
var obj = document.getElementsByTagName('div');
for(var i = 0; i < obj.length; i++)
if(obj[i].className == 'blog-title-outer') break;obj[i].style.backgroundImage = "url(" + bgrounds[array_num] +")";
//--></script>
<div id="content" class="hfeed">
<!-- ..... MainColumn ..... -->
教えて下さった箇所とは無関係なのかもしれませんが^^;
他の方が試されたようです。
http://knowledge.livedoor.com/40850
BLUEPIXさんのやり方でやればどの仕様もできそうですね。
{}を省略してませんか?
for(var i = 0; i < obj.length; i++){
if(obj[i].className == 'blog-title-outer')break;
obj[i].style.backgroundImage = "url(" + bgrounds[array_num] +")";
}
{}がないとスコープを外れちゃってるので
obj[i].style.backgroundImageにfor文内のi変数値が参照されずおかしくなったのでは?
>imqさん
補足ありがとうございます。フリーエリアじゃなくて直書きの方が早いんですね。




