アプリ版:「スタンプのみでお礼する」機能のリリースについて

複数の画像の中から数個を選び、それを重複しないように表示し、尚且つ各画像に合った文章を表示したいのです。
それで、色々と調べて、以下のようなものを見つけました。
私が求めているものに極めて近いのですが、2~3変更したいのです。
しかし、どこをどうしたら良いの全くわかりません。
どなたか助けてください。

質問は3つあります。
一つ目は、画像をリンクにしたいということです。
二つ目は、文章を画像の下に持って来たいのです。
(画像、文章、画像、文章・・・の順に縦に表示されるように)
三つ目は、文章もリンクにしたいということです。

三つ目はできればで構いませんが、一つ目と二つ目は必須でお願いします。

初心者なものですから、わかりやすく教えて頂けるとありがたいです。
よろしくお願いします。

記述は以下の通りです。
<html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>test 23区外</title>
<script type="text/javascript">
<!--
function createGalleryTable() {
//表に表示する数を指定
var n = 6;

//画像のURL
var img = [
'samp1.jpg', 'samp2.jpg', 'samp3.jpg', 'samp4.jpg',
'samp5.jpg', 'samp6.jpg', 'samp7.jpg', 'samp8.jpg'
];
var inum = img.length;

//画像の代替テキスト
var alt = [
'画像a', '画像b', '画像c', '画像d',
'画像e', '画像f', '画像g', '画像h'
];

//画像とセットで表示する文章(画像と個数を合わせる)
var str = [
'1番目の文章が表示されます。',
'2番目の文章が表示されます。',
'3番目の文章が表示されます。',
'4番目の文章が表示されます。',
'5番目の文章が表示されます。',
'6番目の文章が表示されます。',
'7番目の文章が表示されます。',
'8番目の文章が表示されます。'
];

//画像・文章の個数と同じだけ数字を配列に入れる
//この例だと [0, 1, 2, 3, 4, 5, 6, 7] という配列ができる
var num = new Array();
for(var i = 0; i < inum; i++) num[i] = i;

//上で作った配列の中身をランダムに並び替える
//並び替えなので、数字は重複しません
for(var j = inum - 1; j >= 0; j--) {
var r = Math.floor(Math.random() * inum);
var tmp = num[j];
num[j] = num[r];
num[r] = tmp;
}

//並び替えた配列の先頭から、ほしい数だけ抜き取る
var result = num.splice(0, n);

//表を作成し、指定箇所に挿入する
var target = document.getElementById('galleryArea');
var table = document.createElement('table');

for(var k = 0; k < n; k++) {
var row = table.insertRow(k);

var rImg = new Image();
rImg.src = img[result[k]];
rImg.alt = alt[result[k]];

var cell1 = row.insertCell(0);
cell1.appendChild(rImg);

var text = document.createTextNode(str[result[k]]);

var cell2 = row.insertCell(1);
cell2.appendChild(text);
}

target.appendChild(table);
}

if(window.addEventListener) {
window.addEventListener('load', createGalleryTable, false);
}
else if(window.attachEvent) {
window.attachEvent('onload', createGalleryTable);
}
//-->
</script>
<div id="galleryArea"></div>

A 回答 (4件)

こんにちは。



表示内容やスタイルをHTMLやCSSで自由に設定できるように、スクリプトの処理内容をを限定化してみました。
galleryArea内の子要素のdivの順序をランダムにし、指定数だけ表示する機能だけにしたものです。
表示する内容はHTMLで好きに記載できますし、スタイルもCSSなどで指定しておけばよろしいかと…
また、各divの内容は必ずしも同じ形式のものである必要はありません。
(例では、各divの上下の間隔を少し広げています)

イベントの組込み方法は、ご質問文のものをそのまま利用しています。
<html>
<head>
<style type="text/css">
#galleryArea div { margin-bottom:12px; }
</style>
<script type="text/javascript">
function setGallery() {
var n = 6; // ←表示する数を指定

var ga, i = -1, j = 0, e = [], tmp;
ga = document.getElementById('galleryArea'), elm = ga.childNodes;
while (elm[++i]) if (elm[i].nodeName=='DIV') e[j++]=elm[i];
if (n>e.length) n = e.length;
for (i=0; i<e.length; i++) {
j = Math.floor(Math.random() * e.length);
tmp = e[i], e[i] = e[j], e[j] = tmp;
}
for (i=0; i<e.length; i++) {
ga.appendChild(e[i]);
if (i>=n) e[i].style.display = 'none';
}
}

if(window.addEventListener) {
window.addEventListener('load', setGallery, false);
}
else if(window.attachEvent) {
window.attachEvent('onload', setGallery);
}
</script>
</head>

<body>
<div id="galleryArea">
<div><a href="#a1"><img src="sampl1.jpg" alt="画像a"></a>
<br><a href="#a2">1番目の文章表記</a></div>

<div><a href="#b1"><img src="sampl2.jpg" alt="画像b"></a>
<br><a href="#b2">2番目の文章表記</a></div>

<div><a href="#c1"><img src="sampl3.jpg" alt="画像c"></a>
<br><a href="#c2">3番目の文章表記</a></div>

<div><a href="#d1"><img src="sampl4.jpg" alt="画像d"></a>
<br><a href="#d2">4番目の文章表記</a></div>

<div><a href="#e1"><img src="sampl5.jpg" alt="画像e"></a>
<br><a href="#e2">5番目の文章表記</a></div>

<div><a href="#f1"><img src="sampl6.jpg" alt="画像f"></a>
<br><a href="#f2">6番目の文章表記</a></div>

<div><a href="#g1"><img src="sampl7.jpg" alt="画像g"></a>
<br><a href="#g2">7番目の文章表記</a></div>

<div><a href="#h1"><img src="sampl8.jpg" alt="画像h"></a>
<br><a href="#h2">8番目の文章表記</a></div>

<div><a href="#i1"><img src="sampl9.jpg" alt="画像i"></a>
<br><a href="#i2">9番目の文章表記</a></div>
</div>
</body>
</html>
    • good
    • 0
この回答へのお礼

なるほど・・・
こういうやり方もあるのですね。

とっても参考になりました。
ありがとうございます。

お礼日時:2009/10/14 20:48

#1です



margin : 10px;
これを小さく

t.appendChild( tag( 'DIV', (A.href = o[3], A.target = '_blank', A.appendChild( d.createTextNode( o[2] ) ), A) ) );
でどうだろう?
    • good
    • 0
この回答へのお礼

やりたかった通りにできました!!!
本当にありがとうございます。

これを機に私も色々勉強してみます。
お世話になりました。

お礼日時:2009/10/14 20:47
    • good
    • 0
この回答へのお礼

参考にさせて頂きました。
ありがとうございます。

お礼日時:2009/10/14 20:45

ごめんなさい。

きづいてみたら、わかりにくくなってました。^^;
ぜんかくくうはくは、はんかくになおしてね。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>test</title>
<style type="text/css">
#galleryArea div {
border : 2px outset;
width : 400px;
margin : 10px;
}
#galleryArea div a img {
display : block;
border : none;
}
</style>

<body>
<div id="galleryArea"></div>

<script type="text/javascript"><!--
(function ( random, tag ) {
 var n = 6;
 var part = [
  [ 'samp1.jpg', '画像a', '1番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp2.jpg', '画像b', '2番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp3.jpg', '画像c', '3番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp4.jpg', '画像d', '4番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp5.jpg', '画像e', '5番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp6.jpg', '画像f', '6番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp7.jpg', '画像g', '7番目の文章が表示されます。', 'http://www.jp' ],
  [ 'samp8.jpg', '画像h', '8番目の文章が表示されます。', 'http://www.jp' ]
 ];
 var d = document, t = d.getElementById( 'galleryArea' ), k, o, DIV, A, IMG;
 
 part.sort( random ).sort( random );

 while( o = part[--n] ) {
  A = tag( 'A', (IMG = tag( 'IMG' ), IMG.src = o[0], IMG.alt = o[1], IMG) );
  t.appendChild( tag( 'DIV', (A.href = o[3], A.appendChild( d.createTextNode( o[2] ) ), A) ) );
 }
})(
 function ( ) { return Math.random() < 0.5; },
 function ( t, c ) {
  var d = document, n = d.createElement( t );
  c && n.appendChild( 'object' === typeof c ? c: d.createTextNode( c ) );
  return n;
 }
);
//-->
</script>

この回答への補足

早速の回答、ありがとうございます。
私の望んでいたものが出来そうです。

質問なのですが、それぞれの間隔を狭める(空白を少なくする!?)にはどうすればよいのでしょうか?

あと、もうひとつ・・・
リンクを新しいページで開くにはどうすればよいでしょうか?

ずうずうしいですが、よろしくお願いします。

補足日時:2009/10/14 11:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!