• 締切済み

複数canvasを表示状態のまま一つの画像に

先だってchart.js4.2でカラー設定をする方法(https://okwave.jp/qa/q10117946.html)で複数グラフを上1、下3できれいに配置する方法を教えてもらいました。そのコードに今まで2.9系で上下2個づつの配置表示したものを一つの画像にする下記のコードを加え試しましたが使えませんでした。 function imageDownload() { var chartWidth = 350; var chartHeight = 242; var imageType = "image/png" var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas") bufferCanvas.width = chartWidth * 1.82; bufferCanvas.height = chartHeight * 2.2; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); var ctx = bufferCanvas.getContext("2d"); // 背景色を設定(しない場合は透過) ctx.fillStyle = "rgb(255, 255, 255)"; ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // グラフを貼り付け for (i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), i % 2 == 1 ? 0 : chartWidth, i <= 2 ? 0 : chartHeight ); } var imageURL = bufferCanvas.toDataURL(imageType); そこで、スタイル設定のボックスを無くし下記のように配置するようにしました。 <div class="row" style="width:100%;" > <div class="chart1" style="position: relative; top: 0; right: 0; left: 0; margin:0;" >c <canvas id="myChart1" width="400px" height="230px"></canvas></div> <div class="chart2" style="position: absolute; top: 300px; right: 0; left: 0; margin:0;" > <canvas id="myChart2" width="210px" height="210px"></canvas></div> <div class="chart3" style="position: absolute; top: 300px; right: 0; left:215px; margin:0;"> <canvas id="myChart3" width="210px" height="210px"></canvas></div> <div class="chart4" style="position: absolute; top: 300px; right: 0; left:430px; margin:0;"> <canvas id="myChart4" width="210px" height="210px"></canvas></div> </div> しかしながらこの画像化コードでは上下に2個配置するようになっているため大きさの違う上のグラフと下の最初のグラフが左右に一部重なって描画される結果となりました。 そこで、任意の配置状態を保ったまま一つの画像とする方法をお教えください。

みんなの回答

  • retorofan
  • ベストアンサー率33% (328/975)
回答No.19

補足のコードを拝見しました。 注目箇所は、ここ。 // グラフを貼り付け let arr = [0.5,0,1.2,2.4]; //画像幅が1536pxの場合は変数4個 let arr = [0.5,0,0.8,1,1.6];//画像幅が1920pxの場合は変数5個 どちらも4個に修正する必要があると思います。 全体をまとめてみましたので、お試ししてみてください。 function imageDownload() { //画面サイズによる変数定義 var para = (screen.width == 1536) ? 0 : 1; var chartWidth = [230, 270][para]; var chartHeight = [220, 250][para]; var imageType = "image/png"; var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas"); bufferCanvas.width = [874, 783][para]; bufferCanvas.height = [550, 500][para]; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); var ctx = bufferCanvas.getContext("2d"); ctx.fillStyle = "rgb(255, 255, 255)"; // 背景色を設定(しない場合は透過) ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // グラフを貼り付け (下記のうちの1つ) var arr = (para==0) ? [0.5,0,1.2,2.4] : [0.5,0,0.8,1]; //var arr = (para==0) ? [0.5,0,1.2,2.4] : [0.5,0,0.8,1.6]; var ch = (para==0) ? 264 : 225; for (var i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), 250 * arr[i-1], i <= 1 ? 0 : ch ); } var imageURL = bufferCanvas.toDataURL(imageType); //------------------------------------------------------------- FileMaker.PerformScript("script02", imageURL); }

turu575
質問者

お礼

単純にif文で分岐したための余分なコードを纏めていただいたほか数値等ですっきりした形にしていただきありがとうございます。 >let arr = [0.5,0,0.8,1,1.6];//画像幅が1920pxの場合は変数5個 これ、エディターの元コードをそのままコピペしたミスです。filemakerの場合使い方によってjs文をそのまま使えないので一度エスケープ処理等の加工を加えています。そこではこれを修正済みでした。 なお var arr = (para==0) ? [0.5,0,1.2,2.4] : [0.5,0,0.8,1]; //var arr = (para==0) ? [0.5,0,1.2,2.4] : [0.5,0,0.8,1.6]; は下の方が正解ですよね いま、最初にwebにコードの部分で <canvas id="myChart1" width="310px" height="210px"></canvas></div> の使い方は止した方がいいとされていましたが、今回のようにさらに一つのcanvasに纏めた場合グラフの大きさが同じになるのでこちらもありかなと考えています。

turu575
質問者

補足

モニターが違っても印刷の際グラフの大きさを近づけるために試した結果 cssで幅高さを設定し<div class="chart1">の場合 function imageDownload() { var para = (screen.width == 1536) ? 0 : 1; var chartWidth = [230, 270][para]; var chartHeight = [220, 250][para]; var imageType = "image/png"; var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas"); bufferCanvas.width = [910, 783][para]; bufferCanvas.height = [650, 500][para]; bufferCanvas.style.display = "none"; 微妙に違うがbufferCanvas.widthの値でグラフの大きさが決まる。 <canvas id="myChart1" width="300px" height="220px"></canvas>の場合 function imageDownload() { var para = (screen.width == 1536) ? 0 : 1; var chartWidth = [290, 210][para]; var chartHeight = [290, 210][para]; var imageType = "image/png"; var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas"); bufferCanvas.width = [960, 783][para]; bufferCanvas.height = [650, 500][para]; chartWidthの値で大きさが決まる あくまでfilemakerの設定が加わった上での印刷結果を見た目で判断しただけですのでこの数値は正確性に欠けるうえ果たしててこれが正解かも判断しかねています。なお、配置の調整はこれからです。

  • retorofan
  • ベストアンサー率33% (328/975)
回答No.18

パソコンの場合でも、 グラフの1つだけが大きく表示されたりする場合があります。 (グラフのレンダリングにパワー・時間を要するため) その時は、F5(再読み込み)させて解決しました。 モニターによっては、適正に配置されないようですね。 同じ環境が無いため、再現・対応は難しいです。 対策としては、 画像作成関数 imageDownload() のパラメーターを ラジオボタン等で切り替えるなど工夫されたら 使用するモニターに合ったグラフ間を保てるようになると思います。

turu575
質問者

お礼

有り難うございました。 やはり解像度が違うモニターでは難しいのが分かりました。なお、前にfilemakerのwebビューアで試した云々の時書き忘れましたが普通にwebでも同じような重なり等の状況でした(ちなみにfilemakerのwebビューアで使われているレンダリングエンジンもMS Edge WebView2です) 。 pxで大きさや配置が設定出来ないかと思い試してみましたがここの部分では無理みたいでした。 両方のモニターで妥協できる数値にするか、別々のパターンを用意するかどちらでもfilemaker上で処理出来るので塩梅のいいのを模索します。

turu575
質問者

補足

グラフの大きさも解像度によって相対的に決まるみたいなのか調節がききませんでしたが、配置はそこそこ調節でモニターに合わせて作るようif文で分岐しました。 function imageDownload() { if (screen.width == 1536) { var chartWidth = 230; var chartHeight = 220; var imageType = "image/png"; var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas"); bufferCanvas.width = chartWidth * 3.8; bufferCanvas.height = chartHeight * 2.5; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); let ctx = bufferCanvas.getContext("2d"); // 背景色を設定(しない場合は透過) ctx.fillStyle = "rgb(255, 255, 255)"; ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // グラフを貼り付け let arr = [0.5,0,1.2,2.4]; for (i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), 250 * arr[i-1], i <= 1 ? 0 : chartHeight * 1.2 ); } } else if (screen.width == 1920){ var chartWidth = 270; var chartHeight = 250; var imageType = "image/png"; var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas"); //var screenWidth = screen.width; bufferCanvas.width = chartWidth * 2.9; bufferCanvas.height = chartHeight * 2; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); let ctx = bufferCanvas.getContext("2d"); // 背景色を設定(しない場合は透過) ctx.fillStyle = "rgb(255, 255, 255)"; ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // グラフを貼り付け let arr = [0.5,0,0.8,1,1.6]; for (i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), 250 * arr[i-1], i <= 1 ? 0 : chartHeight * 0.9 ); } } var imageURL = bufferCanvas.toDataURL(imageType); //------------------------------------------------------------- FileMaker.PerformScript("script02", imageURL);

  • retorofan
  • ベストアンサー率33% (328/975)
回答No.17

拙作のコードで確認していただき ありがとうございます。 あなたは、次のようにこう書きました。 >先にせっかく教えてもらった1×3の配置なのに >それと、配置をCSSで新たに組み変えるのは意味がないので 今までのままのほうがいいです。 そうは言っても、今回のテーマとして、こうも書かれています。 >上下2個づつの配置表示したものを一つの画像にする・・・ 私は、この課題に沿うようにお答えしました。

turu575
質問者

お礼

「そうは言っても、今回のテーマとして、こうも書かれています。 >上下2個づつの配置表示したものを一つの画像にする・・・ 私は、この課題に沿うようにお答えしました。」 の部分に関しては、一度も希望したことはありません。すでに上下2個づつでは位置することはそのコードの内容如何に関わらずすでに実現している話で、教えられた1×3の表示に適用すると2×2となり大きさの違うグラフがあるため上の部分では重なる結果となると事を示し示しただけです。 もし問題があるとすれば、私の質問がだらだらとしたもになっているため、そのどこか部分でを取り違えられたものと思われます。 最初に >文章的に何がしたいのかわからないのですが。 と指摘された内容ですので誤解を与えたこと申し訳ありません。

turu575
質問者

補足

filemakerのwebビューアでもらったコードをそのまま実行したところ大きなモニター(ノートPCに接続)場合は問題なく合成され同じ画像が良好な配置で出力されますが。ノートPCのモニターで実行した場合、合成、出力画像共に重なり右及び下が切れた状態となりました。 一応報告まで

  • retorofan
  • ベストアンサー率33% (328/975)
回答No.16

続き <script> onload = function() { // 色の設定 (original) const color1 = ['red','green','skyblue']; const mycolor = ['rgb(221,160,221)','rgb(228,0,127)','rgb(160,216,239)','rgb(146,7,131)','rgb(0,153,68)','rgb(255, 215, 0)','rgb(0,158,150)']; //グラフの描画関数 function displayChart(canvasId, chartType, datasets, options) { var ctx = document.getElementById(canvasId); var myPieChart = new Chart(ctx, { type: chartType, data: { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // X軸のラベル datasets: datasets }, options: { plugins: { //responsive: false, title: { display: options.title.length > 0, // タイトルがあれば表示 text: options.title }, legend: { // 凡例 //onClick: function () { return false }, //凡例クリック時、何も返さないコード display: true, // 表示の有無 position: options.legendPosition, // 表示位置 labels: { usePointStyle: options.usePointStyle // 円の凡例スタイルを使うか } } } } }); return myPieChart; } const label1 = [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000]}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000]}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000]} ]; const datasets = [ {label: label1[0].label,data: label1[0].data}, {label: label1[1].label,data: label1[1].data}, {label: label1[2].label,data: label1[2].data} ]; //------------------------------------------------------------- //Bar chart const barChart = displayChart('myChart1', 'bar', datasets,{ title: 'Bar chart', usePointStyle: false, legendPosition: 'top' }); for (let i=0; i<datasets.length; i++){ datasets[i]["backgroundColor"] = color1[i]; //カラー設定 } barChart.update(); //更新 //------------------------------------------------------------- //Pie chart for (var i = 0; i < 3; i++) { PieChart = displayChart(`${'myChart'+(i + 2)}`, 'pie', [label1[i]], { title: label1[i].label, usePointStyle: true, legendPosition: 'left' }); label1[i]["backgroundColor"] = mycolor; //カラー設定 PieChart.update(); //更新 } //-------------------------------------------------------------------- // 4つのグラフを1つの画像でダウンロードするコード //-------------------------------------------------------------------- function imageDownload() { var chartWidth = 350; var chartHeight = 242; var imageType = "image/png" var bufferCanvas = document.createElement("canvas"); bufferCanvas.style.border = "solid 1px red"; bufferCanvas.width = chartWidth * 1.82; bufferCanvas.height = chartHeight * 2.2; console.log("canvas size",bufferCanvas.width, bufferCanvas.height); // bufferCanvas.style.display = "none"; document.querySelector(".console").appendChild(bufferCanvas); var ctx = bufferCanvas.getContext("2d"); ctx.fillStyle = "rgb(255, 255, 255)"; // 背景色を設定(しない場合は透過) ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // 各グラフを合成用キャンバスに貼り付け for (var i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), i % 2 == 1 ? 0 : chartWidth, //横幅 i <= 2 ? 0 : chartHeight //高さ ); } var imageURL = bufferCanvas.toDataURL(imageType); //URLを生成 //------------------------ //リンクを作成 const a = document.createElement("a"); a.style.display = "block"; a.href = imageURL; a.download = "chart.png"; a.textContent = "画像でダウンロード"; //a.click(); document.querySelector(".console").appendChild(a); } //グラフのレンダリングに時間を要するために一定時間経過後に実行 setTimeout(imageDownload, 3000); //-------------------------------------------------------------------- }; </script> </body> </html>

turu575
質問者

お礼

retorofan さん有り難うございます。 先にせっかく教えてもらった1×3の配置なのに >それと、配置をCSSで新たに組み変えるのは意味がないので 今までのままのほうがいいです。 何故なら、各キャンバスは見かけの位置でなくて、 オブジェクトとしてアクセス、移動、変更が自在に可能です。 極端に言えば、非表示の場合でも操作できるのですから。 見かけにこだわった私に問題があるのか・・・ web上で教えてもらったコードで再現したところ問題なく出力されました。 多分遅くなると思いますがこれをfilemakerのweb ビューアで表示させイメージを別オブジェクトフィールドに画像として挿入できるように試みてみます。filemakerでは、ビューアで表示されたグラフだけなら印刷できるのですが、他のフィールドを含めた場合難があるので一旦オブジェクトフィールドを使った印刷用レイアウトで実行する必要がある・・・ 合成部分まで作っていただき有り難うございました。

  • retorofan
  • ベストアンサー率33% (328/975)
回答No.15

turu575さん あなたの imageDownload()関数に 少し手直しすれば お望みが叶いますよ。 ただ、次の書き方はやめたほうがいいです。 <canvas id="myChart1" width="400px" height="230px"></canvas> 正しくは、単位を付けずに以下のようにしましょう! <canvas id="myChart1" width="400" height="230"></canvas> それと、配置をCSSで新たに組み変えるのは意味がないので 今までのままのほうがいいです。 何故なら、各キャンバスは見かけの位置でなくて、 オブジェクトとしてアクセス、移動、変更が自在に可能です。 極端に言えば、非表示の場合でも操作できるのですから。 だいぶ苦戦している模様ですが、私のコードでお試しください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>chart.js グラフを画像でダウンロードするサンプル</title> <style> fieldset { width: 700px; margin-bottom: 5px; } .container { width: 100%; } .container .chart1 { width: 400px; height: 350px; } .container .lateral { display: flex; width: 100%; height: 300px; } .container .lateral div { margin: 0 1em 0 0; width: 300px; height: 250px; } .container div > canvas { padding: 1em; border: solid 1px violet; } </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"></script> </head> <body> <h1>chart.js グラフを画像でダウンロードするサンプル</h1> <strong>【手順】</strong> <ul> <li>原図エリアに4つのグラフを描画する。 </li> <li>合成エリアで1つのキャンバスに合成する。</li> <li>ボタン押下で画像でダウンロードする。</li> </ul> <fieldset> <legend>原図エリア</legend> <div class="container"> <div class="lateral"> <div class="chart1">■Bar chart 1 <canvas id="myChart1"></canvas></div> <div>■Pie chart 1 <canvas id="myChart2"></canvas></div> </div> <div class="lateral"> <div>■Pie chart 2 <canvas id="myChart3"></canvas></div> <div>■Pie chart 3 <canvas id="myChart4"></canvas></div> </div> </div> </fieldset> <fieldset> <legend>合成エリア</legend> <div class="console"></div> </fieldset> 続く

回答No.14

まだ、解決しなそうでしたら、一度全体ソース 張ってみませんか?部分的な場所だけの回答をしてるので、 今どんな状態なのかは、正確にはわかってないんですよね。 (気が向いたらでOKですし、拒否しても気にしませんので!)

回答No.13

>等位置を変えて試みましたがイメージ画像の出力に至りませんでした。>何か勘違いして解釈をしているのでしょうか? あってるように見える^^。 ただ、これ表示するだけで出力には無関係なので、 出力側の問題はこれでは、解決はしませんよ。 ノートとデスクトップで見え方が違うって件だけの 吸収の話なので。

turu575
質問者

お礼

有り難うございます。 >ただ、これ表示するだけで出力には無関係なので、 出力側の問題はこれでは、解決はしませんよ。 ノートとデスクトップで見え方が違うって件だけの 吸収の話なので。 そこがよく分からないとこなのですが 新しいcanvasに配置されたグラフ・・・この表示状態が var imageURL = bufferCanvas.toDataURL(imageType); でどのような形でbase64のイメージ画像としてエンコード出力されているのか分かりませんが多分このとき画面サイズか解像度に従って相対的な配置で自動的に処理されるのているためと推測されます・・・ただし素人考えですが、 そのためデコード処理した画像で重なっている等としか表現しようがないのです。webで表示されているものにはどちらも問題はありませんので、イメージ画像の処理の過程(今触っているコード)の問題としか・・・手作業でモニターに合わせることをすればいいだけです。

回答No.12

>ここは、今回の場合無意味な設定で不要だし >それともCSSで設定する? ですです!CSSです。 var bufferCanvas = document.createElement("canvas") bufferCanvas.width = chartWidth * 1.82; bufferCanvas.height = chartHeight * 2.2; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); 見えない画面で合成するのをシャドウレンダリングって言うんですが、 この部分です。CSSで、 bufferCanvas.style.display = "none"; これ、<canvas style="display:none">って書いてるのと同じです!。 bufferCanvas.style.width bufferCanvas.style.heightですね。 で、 document.body.appendChild(bufferCanvas); これだと、BODYの一番最後になってしまうので、 <div id="waaa"> この位置に動的にCANVASを入れると仮定 </div> let waaa=document.getElementById("waaa"); var bufferCanvas = document.createElement("canvas") waaa.appendChild(bufferCanvas); まとめて、 document.getElementById("waaa").appendChild(bufferCanvas); でも構いません。 または、 <canvas id="ccccc"> を事前宣言してしまい、それを、 document.getElementById("ccccc").wight CANVASのサイズ document.getElementById("ccccc").height document.getElementById("ccccc").style.width CANVASの表示サイズ document.getElementById("ccccc").style.height などで、後からサイズを作り出してもOK CANVASはサイズの代入で初期化されるので、事前にどんなサイズであっても、 かまわない。 それと元々の、chart.js4.2のCANVASをむしろ、、、 display:noneして、見せないようにすることで、 見た目、最初から1枚のCANVASが出ているように見えるでしょう!。

turu575
質問者

お礼

具体的な内容でありがとうございます。 まだ全部試したわけではありませんが var imageFileName = "chart.png"; // var bufferCanvas = document.createElement("canvas") let waaa=document.getElementById("waaa"); var bufferCanvas = document.createElement("canvas"); waaa.appendChild(bufferCanvas); bufferCanvas.width = chartWidth * 3.2; bufferCanvas.height = chartHeight * 2.2; bufferCanvas.style.width = "100%"; bufferCanvas.style.height = "100%"; //document.body.appendChild(bufferCanvas); 等位置を変えて試みましたがイメージ画像の出力に至りませんでした。何か勘違いして解釈をしているのでしょうか?

回答No.11

>なかなか塩梅のいいものが出来ない。 CANVASって、中解像度と外解像度が違うので、 元々のchart.js4.2が出したCANVASではなく、 内部的に合成しているCANVASを画面にあわせて出せばいいですよ。 それなら、解像度の違いは、吸収されます。 要するに、画像を画面にあわせて「リサイズ」する方の概念ですね。 cssでcanvasに対してwidth,heightしても、中のCANVASはそのままで、 拡大縮小されるだけなので、 単純に100%とか書いてもOKですよ。

turu575
質問者

お礼

度々のご返事ありがとうございます。 >内部的に合成しているCANVASを画面にあわせて出せばいいですよ。 と専門の方が簡単におっしゃっても、どこに100%を記するのでしょうか? 新たなcanvasの大きさを決定しているのが bufferCanvas.width = 860; bufferCanvas.height = 584; この部分だと分かりますが、ここは違うし??? var chartWidth = 230; var chartHeight = 220; ここは、今回の場合無意味な設定で不要だし それともCSSで設定する?

回答No.10

必須ではないのですが、 offset_x,offset_yの部分で 250 * arr[i-1], i <= 1 ? 0 : chartHeight X成分 arrがこの関数内にないので、グローバル(つまりこの関数の外を見てる) ので、できれば、 function getXsize() { ここで、arrをreturnする。 } 使う側で、 let arr=getXsize(); として、それを呼んでるんだ!って空気を出した方が、 メンテしやすくなると思います。 Y成分 i <= 1 ? 0 : chartHeight iが0になる事は元々ないので、i==1? でもいいでしょうね。 ただ、これは、別に無視してもいいです。 動くのを最優先に~って事で^^

turu575
質問者

お礼

恥ずかしいですけど、今回の回答全く理解できていません。解説されても多分理解できないと思います。私の知識はその程度なので。 例えば >function getXsize() { ここで、arrをreturnする。 これどこの話、となり・・・この程度です。 情けな質問に対し、度々の回答ありがとうございます。

turu575
質問者

補足

大きなモニターで作業していたがノートPCだけで実行すると配置が重なる等のイメージが出来上がるの結果となり、それの手直し調整がちょっと面倒なので掛けるのを止めて全て数値処理するようにした。 function imageDownload() { var chartWidth = 230; var chartHeight = 220; var imageType = "image/png" var imageFileName = "chart.png"; var bufferCanvas = document.createElement("canvas") bufferCanvas.width = 860; bufferCanvas.height = 584; bufferCanvas.style.display = "none"; document.body.appendChild(bufferCanvas); var ctx = bufferCanvas.getContext("2d"); // 背景色を設定(しない場合は透過) ctx.fillStyle = "rgb(255, 255, 255)"; ctx.fillRect(0, 0, bufferCanvas.width, bufferCanvas.height); // グラフを貼り付け var arr = [0,0,280,560]; for (i = 1; i <= 4; i++) { ctx.drawImage( document.getElementById("myChart" + i), arr[i-1], i <= 1 ? 0 : 250 ); } var imageURL = bufferCanvas.toDataURL(imageType); なかなか塩梅のいいものが出来ない。

関連するQ&A

  • chart.jsのグラフを複数個表示する方法

    今回は、chart.jsのグラフを複数表示する方法についてお尋ねします。一応下記のコードで棒グラフ×1、円グラフ×3を上下2個ずつ配置出来るようにまではなったのですが、ただ単に1個のグラフのコードを4回繰り返したようなものですので無駄が多く冗長なコードになっています。これをもっとコンパクトなものに出来ないかと思い投稿した次第です。html,css,javascriptに関しては専門家でないのでつまみ食い程度の知識で間に合わせたお粗末なコードですが、宜しくご教授願います。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8">  <title>multiグラフ</title> </head> <body> <div class="row" style="width: 70%;" > <div class="chart1" style="float: left;" > <canvas id="myChart1" width="550" height="450"></canvas></div> <div class="chart2" style="float: right;"> <canvas id="myChart2" width="550" height="450"></canvas></div> <div class="chart3" style="bottom: 0;float: left;"> <canvas id="myChart3" width="550" height="450"></canvas></div> <div class="chart4" style="bottom: 0;float: right;"> <canvas id="myChart4" width="550" height="450"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script> <script src="https://unpkg.com/chartjs-plugin-colorschemes"></script> <script> Chart.defaults.global.legend.labels.usePointStyle = false; //以降の凡例スタイルを矩形のまま var ctx = document.getElementById("myChart1"); var myPieChart = new Chart(ctx, { type: 'bar', data: {labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000]}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000]}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000]}]}, options: { plugins: { colorschemes: {scheme: 'office.Slice6'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: false,  text:''},     legend: { // 凡例 display: true, // 表示の有無 position: 'top' } // 表示位置 }}); Chart.defaults.global.legend.labels.usePointStyle = true; //以降の凡例スタイルを矩形を円に変える var ctx = document.getElementById("myChart2"); var myPieChart = new Chart(ctx, { type: 'pie', data: {labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [{label:'仙台' ,data: [320000, 590000, 400000, 420000, 380000, 250000, 420000]}]}, options: { plugins: { colorschemes: {scheme: 'brewer.DarkTwo7'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: true,   text:'仙台'},     legend: { // 凡例 display: true, // 表示の有無 position: 'left',} // 表示位置 }}); var ctx = document.getElementById("myChart3"); var myPieChart = new Chart(ctx, { type: 'pie', data: { labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [{label:'札幌' ,data: [520000, 450000, 380000, 280000, 590000, 400000, 530000]}]}, options: { plugins: { colorschemes: {scheme: 'brewer.DarkTwo7'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: true, text:'札幌'}, legend: { // 凡例 display: true, // 表示の有無 position: 'left'} // 表示位置 }}); </script> </body> </html> 文字数の関係で渋谷のグラフ(myChart4)の部分はカットしました。

  • chart.js4.2でカラー設定をする方法

    過去にこのサイトでchart.js2.9を使い複数グラフを表示する方法(https://okwave.jp/qa/q9834370.html)を教えてもらいましが、今回v.4.2にそれを適用するにあたりプラグインのカラー設定に代わる方法がないかと試行を繰り返し、素人のため無理筋の方法ですが下記のコードまで至りました。そこで、このお粗末なコードを適切なものに手直ししていただきたくお願い申し上げます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;width:300px; height:250px" > <canvas id="myChart1"></canvas></div> <div class="chart2" style="float: right;width:300px; height:250px"> <canvas id="myChart2"></canvas></div> <div class="chart3" style="bottom: 0;float: left;width:300px; height:250px"> <canvas id="myChart3"></canvas></div> <div class="chart4" style="bottom: 0;float: right;width:300px; height:250px"> <canvas id="myChart4"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"></script> <script> function displayChart(canvasId, chartType, datasets, options) { var ctx = document.getElementById(canvasId); var myPieChart = new Chart(ctx, { type: chartType, data: { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // X軸のラベル datasets: datasets }, options: { plugins: { //responsive: false, title: { display: options.title.length > 0, // タイトルがあれば表示 text: options.title }, legend: { // 凡例 display: true, // 表示の有無 position: options.legendPosition, // 表示位置 labels: { usePointStyle: options.usePointStyle // 円の凡例スタイルを使うか } } } } }); } const color1 = ['red','green','skyblue']; const mycolor = ['rgb(221,160,221)','rgb(228,0,127)','rgb(160,216,239)','rgb(146,7,131)','rgb(0,153,68)','rgb(255, 215, 0)','rgb(0,158,150)']; const label1 = [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000],backgroundColor:mycolor}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000],backgroundColor:mycolor}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000],backgroundColor:mycolor} ]; const datasets = [ {label: label1[0].label,data: label1[0].data,backgroundColor:color1[0]}, {label: label1[1].label,data: label1[1].data,backgroundColor:color1[1]}, {label: label1[2].label,data: label1[2].data,backgroundColor:color1[2]} ]; displayChart('myChart1', 'bar', datasets,{ title: '', usePointStyle: false, legendPosition: 'top', }); for (var i = 0; i < 3; i++) { displayChart("myChart".concat(i + 2), 'pie', [label1[i]], { title: label1[i].label, backgroundColor:mycolor, usePointStyle: true, legendPosition: 'left' }); } </script> </body> </html> 特にbackgroundColorの設定をoptionで設定出来ないかと思いましたが方法が分かりませんでしたのでこのようなコードをに成り果てました。 また、カラースキーム組み合わせは別の手段を使って作りコピペしているのですがこれも貧弱なものですので、使えるプラグインがあればご教授お願いいたします。

  • javascriptのcanvasについて

    先日こちらで質問させて頂き、頂いた回答をもとに javascriptのcanvasについて勉強を続けていて、 canvasを2つ重ねたカラーシミュレーションのようなものを作りたいと考えています。 先日教えて頂いた内容をもとに 下記のような記述で2枚目のcanvasの画像を入れ替えることや、 色を変更することは出来ました。 ただ、「進む」ボタンや「戻る」ボタンを押したときに 色がもとの色に戻ってしまうので、色は固定されたまま(この記述でいうと茶色や赤)で 画像を入れ替える方法がわからずにいます。 なにか良い方法はないでしょうか。 <style type="text/css"> .canvas001 { position: absolute; top:100px; left:0px; } .canvas002{ position: absolute; top:100px; left:0px; } </style> <script> onload = function() { image1(); image2(); image3();}; function image1() { var cnvs = document.getElementById('canvas1'); var ctx = cnvs.getContext('2d'); var img = new Image(); img.onload = function() { ctx.drawImage(img, 0, 0); }; img.src = "face.png"; }; function image2() { var cnvs = document.getElementById('canvas2'); var ctx = cnvs.getContext('2d'); var img = new Image(); img.onload = function() { ctx.drawImage(img, 0, 0); }; img.src = "hair1.png"; }; var src = [  'hair1.png',  'hair2.png',  'hair3.png' ]; var currentIndex = 0; var currentImage; function hair(){ var img = currentImage = new Image(); img.onload = function() { if(currentImage === img){ var cnvs = document.getElementById('canvas2'); var ctx = cnvs.getContext('2d'); ctx.clearRect(0, 0, cnvs.offsetWidth, cnvs.offsetHeight); ctx.drawImage(img, 0, 0); } }; img.src = src[currentIndex]; } window.back = function(){ currentIndex = (currentIndex - 1 + src.length) % src.length; hair(); } window.foward = function(){ currentIndex = (currentIndex + 1) % src.length; hair(); } function black(){ var ctx = document.getElementById("canvas2").getContext("2d"); var imagedata = ctx.getImageData(0,0,300,300); var idata = imagedata.data; var num = idata.length; var pix = num / 4; for ( var i = 0 ; i < pix ; i++ ){ var r = idata[ i*4 ]; var g = idata[ i*4 + 1 ]; var b = idata[ i*4 + 2 ]; idata[ i*4 ] = 35; idata[ i*4 + 1 ] = 24; idata[ i*4 + 2 ] = 21; } ctx.putImageData(imagedata,0,0); } function brown(){ var ctx = document.getElementById("canvas2").getContext("2d"); var imagedata = ctx.getImageData(0,0,300,300); var idata = imagedata.data; var num = idata.length; var pix = num / 4; for ( var i = 0 ; i < pix ; i++ ){ var r = idata[ i*4 ]; var g = idata[ i*4 + 1 ]; var b = idata[ i*4 + 2 ]; idata[ i*4 ] = 140; idata[ i*4 + 1 ] = 96; idata[ i*4 + 2 ] = 37; } ctx.putImageData(imagedata,0,0); } function red(){ var ctx = document.getElementById("canvas2").getContext("2d"); var imagedata = ctx.getImageData(0,0,300,300); var idata = imagedata.data; var num = idata.length; var pix = num / 4; for ( var i = 0 ; i < pix ; i++ ){ var r = idata[ i*4 ]; var g = idata[ i*4 + 1 ]; var b = idata[ i*4 + 2 ]; idata[ i*4 ] = 182 ; idata[ i*4 + 1 ] = 0; idata[ i*4 + 2 ] = 5; } ctx.putImageData(imagedata,0,0); } </script> <body> <div> <div class="canvas001"><canvas id="canvas1" height="300"></canvas></div> <div class="canvas002"><canvas id="canvas2" height="300"></canvas></div> </div> <div> <form><div> <INPUT TYPE=button NAME="submit" VALUE="戻る" onClick="back()"> <INPUT TYPE=button NAME="submit" VALUE="進む" onClick="foward()"> </div></form> </div> <img src="btn_black.png" onclick="black()" > <img src="btn_brown.png" onclick="brown()" > <img src="btn_red.png" onclick="red()" > </body>

  • chart.jsのコードを2.9から4.2に変換

    以前使っていたchart.jsのバージョン2.9系から最新の4.2系に変えたいと思い試行しています。基本的なサンプルはなんとかなるのですが、3系統に変わってから大きく変化した部分が全く理解しないまま2系統を使い続けて来たのが現況です。今回、4系統に挑戦するにあたり下記の2系統で人口ピラミッドのためのコードの書き換え方をお教えください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;" > <canvas id="myChart1" width="300" height="450"></canvas></div> <div class="chart2" style="left: 300px"> <canvas id="myChart2" width="350" height="450"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script> <script> Chart.defaults.global.defaultFontColor = 'black'; var ctx = document.getElementById("myChart1").getContext('2d'); var myChart = new Chart(ctx, { type: "horizontalBar", // 水平棒グラフ data: { labels: ['90歳以上','85~89歳','80~84歳','75~79歳','70~74歳','65~69歳','60~64歳','55~59歳','50~54歳','45~49歳','40~44歳','35~39歳','30~34歳','25~29歳','20~24歳','15~19歳','10~14歳','5~9歳','0~4歳'], datasets: [ { label:'男',data: [-3790,-8605,-14805,-16655,-19641,-29027,-26151,-22360,-19752,-19288,-22510,-20397,-17238,-14645,-12763,-16385,-15610,-14625,-13880,], backgroundColor: "red" } ] }, options: { responsive: false, title: { display: true, text: 'Pyramide des ages' }, scales: { xAxes: [{ stacked: true, ticks: { callback: function (v){ return Math.abs(v) } } }], yAxes: [{stacked: true, ticks: { display: false } }] } } }); var ctx = document.getElementById("myChart2").getContext('2d'); var myChart = new Chart(ctx, { type: "horizontalBar", // 水平棒グラフ data: { labels: ['90歳以上','85~89歳','80~84歳','75~79歳','70~74歳','65~69歳','60~64歳','55~59歳','50~54歳','45~49歳','40~44歳','35~39歳','30~34歳','25~29歳','20~24歳','15~19歳','10~14歳','5~9歳','0~4歳'], datasets: [ { label:'女',data: [13400,18358,23241,22544,23231,29351,25690,22067,20064,19011,21714,19305,16677,14028,12091,14741,14919,13973,13049], backgroundColor: "green" } ] }, options: { responsive: false, title: { display: true, text: '' }, scales: { xAxes: [{ stacked: true, }], yAxes: [{stacked: true }] }, } }); </script> </body> </html> これは、Y軸のラベル表示を真ん中に置きたいがため2個のcanvasを強引に並べています。 ちなみに、canvas分けないで一つだけにしてY軸を左端にした場合で試したところ。 "horizontalBar"の部分を type: "bar", options: { indexAxis: "y", }, に代えても 肝心の「xAxes」の部分をどう変えていいか分からないためそままにしておいたら、当然のごとく Invalid scale configuration for scale: xAxes Invalid scale configuration for scale: yAxes のエラーメッセージが出てグラフも左右でなく上下の状態となります。 コピペだけで既存のコードを利用している者として不勉強で申し訳ありませんがご教授お願いいたします。

  • javascriptでオブジェクトの重なりを判定

    お世話になります。 javascriptを使用して、<div>で作られた複数のオブジェクトが重なったかどうかを判定したいのです。 果たして、そんなことは可能なのでしょうか。 <body> <div id="block1" style="background:#F00; width:200px; height:200px; marglin-left:200px;" onclick="javascript=aaa();"></div> <div id="block2" style="background:#0F0; width:200px; height:200px; margin-left:200px;"></div> <div id="block3" style="background:#0F0; width:200px; height:200px; margin-left:600px;"></div> <div id="block4" style="background:#0F0; width:200px; height:200px; margin-left:800px;"></div> <div id="block5" style="background:#0F0; width:200px; height:200px; margin-left:1200px;"></div> <div id="block6" style="background:#0F0; width:200px; height:200px; margin-left:2000px;"></div> </body> <script> fucntion aaa(){ var bbb = document.getElementById("block1"); var move= parseFloat(bbb.style.left); bbb.style.left = (move+10)+"px"; } </script> というのがあったとして、block1がblock2、block3・・・・のいずれかと重なった瞬間にalertか何かで「重なりました!」という感じで表示することはできないのでしょうか。javascript オブジェクト 重なり とかで検索しても、目的のものが出てこなかったので… どうぞ、よろしくお願い致します。

  • IEの「explorercanvas」で作ったCANVASがスクロール

    IEの「explorercanvas」で作ったCANVASがスクロール出来ない HTML5の<canvas>要素を、擬似的に使えるようにした「explorercanvas」↓ http://code.google.com/p/explorercanvas/ ですが、これを使って<canvas>要素を<div>要素の中に配置したんですが、 親の<div>ボックスをスクロールしても、canvasがスクロールされません。 本物の<canvas>要素はちゃんと出来ます。(FirefoxとChromeで確認) 何か代替策ないでしょうか?(canvas内に再描画しろってか..) (実験したコード) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Canvas Test</title> <style type="text/css"> </style> <!--[if IE]><script src="/jslib/excanvas.js"></script><![endif]--> </head> <body> <p>CANVAS</p> <h2 style="text-align:center">Canvas TEST By HTML5 or IE(excanvas.js)</h2> <div id="hoge" style="width;500px;overflow:scroll;border:solid 1px gray"></div> <p>イメージ</p> <div id="fuga" style="width;500px;overflow:scroll;border:solid 1px gray"></div> <script type="text/javascript"> //CANVASの場合  var container1 = document.getElementById("hoge");  var canvas = document.createElement("canvas");  canvas.width = 2000;  canvas.height = 500;  container1.appendChild(canvas);  if (typeof(G_vmlCanvasManager) != 'undefined')   canvas = G_vmlCanvasManager.initElement(this.canvas);  var ctx = canvas.getContext('2d');  var img = new Image();  img.src = "/image/mio.jpg" + "?" + new Date().getTime();   img.onload = function() {    ctx.drawImage(img,0,0,2000,500);   }  container1.scrollLeft = 500; //imgの場合  var container2 = document.getElementById("fuga");  var img2 = new Image();  img2.src = "/image/yui.jpg" + "?" + new Date().getTime();  img2.style.width="2000px";  img2.style.height="500px";  container2.appendChild(img2);  container2.scrollLeft = 500; </script> </body> </html>

  • ボーダースタイルがうまく表示できない

    #content { width:525px; } div.box { width:525px; margin-top: 20px; border-bottom:dotted 1px #ccc; } div.left { width:140px; float: left; font-weight: bold; margin-left: 5px; } div.right { width:380px; float: left; line-height: 20px; height: 20px; } <div id="content"> <div class="box"> <div class="left">Address</div> <div class="right">住所<br>東京都</div> </div> </div> クラス名boxというボックスのボトムにボーダー指定をしましたが、ボックスのズレ?によりボーダーがトップになっているように見えてしまいます。 どこが間違っておりますか? アドバイスを宜しくお願いします。

    • ベストアンサー
    • HTML
  • HTML、CSS が、なかなかうまくいきません。

    お世話になります。 HTMLを始めたばかりですので、 ご教授いただけたら幸いです。 以下の図のような感じに並べたいのですが、 なかなかうまい具合にいきません。 黄色は、全てボタンになります。 赤は、ボタンについた吹き出し部分となります。 上段の2つのボタンは、やや大きい感じのボタン。 下段の3つのボタンは、上段に比べて、少し小さい感じのボタンになります。 ボタンは、上段(A)と下段(B)で、 HTML と CSS は、分けようかと考えています。 【HTML】 <div class="Button"> <div class="contents"> <div class="Button_boxA clearfix"> <div class="Yellow_Btn_01"><img src="img/Yellow_Btn_01.png" width="200" height="75" /> </div> <div class="Yellow_Btn_02"><img src="img/Yellow_Btn_02.png" width="200" height="80" /> </div> </div> <div class="btn_boxB clearfix"> <div class="Yellow_Btn_03"><img src="img/Yellow_Btn_03.png" width="100" height="60" /> </div> <div class="Yellow_Btn_04"><img src="img/Yellow_Btn_04.png" width="100" height="65" /> </div> <div class="Yellow_Btn_05"><img src="img/Yellow_Btn_05.png" width="100" height="60" /> </div> </div> </div> </div> 【 CSS 】 div.Button{ width:600px; margin-top:20px; margin-right:auto; margin-left:auto; padding-right:25px; } div.btn_boxA{ width::500px; margin-left:auto; margin-right:auto; margin-bottom:10px; } div.low_btn_01{ width:200px; height:75px; margin-left:auto; margin-right:auto; margin-bottom:10px; float:left; } div.low_btn_02{ width:200px; height:80px; margin-left:auto; margin-right:auto; padding-left:25px; margin-bottom:10px; float:left; } div.btn_boxB{ width::500px; margin-left:auto; margin-right:auto; margin-bottom:10px; } div.low_btn_03{ width:100px; height:60px; margin-left:auto; margin-right:auto; margin-bottom:10px; padding-left:25px; float:left; } div.low_btn_04{ width:100px; height:65px; margin-left:auto; margin-right:auto; margin-bottom:10px; padding-left:25px; float:left; ] div.low_btn_05{ width:100px; height:60px; margin-left:auto; margin-right:auto; margin-bottom:10px; padding-left:25px; float:left; } 長ったらしくなってしまいましたが、 ご教授いただけたら、幸いです。 宜しくお願いします。

    • 締切済み
    • CSS
  • 画像を横並びに2つと、その右側に文字入りのボックス

    画像を横並びに2つと、その右側に文字入りのボックスを横並びに2(よこ)×3段(たて)で配置したいのですが、IE7だけ2つの画像の下に、文字入りボックスが3(よこ)×2段(たて)で並んでしまいます。 IE8やそれ以外のブラウザは画像右側に文字入りボックスが2(よこ)×3段(たて)で並びます。 どのようにすれば、IE7も他と同じようになりますか。 よろしくお願い致します。 <div class="imagebox"> <p class="image"><img src="1.jpg" width="145" height="120" alt=""/></p> </div> <div class="imagebox" style="margin:0 20px 0 10px"> <p class="image"><img src="2.jpg" width="145" height="120" alt=""/> </div> <ul class="box"> <li>aaa</li> <li>bbb</li> <li>ccc</li> <li>ddd</li> <li>eee</li> <li>fff</li> </ul> <div style="clear: left;"></div> div.imagebox { background-color: #383838; width: 145px; float: left; margin: 0px; } p.image { text-align: center; margin: 0px; } ul.box { list-style:none; width:100%; margin: 0 0 5px 0; padding: 0; } ul.box li { width: 180px; height: 14px; padding: 4px 5px 4px; border-color: #000033; border-style: double; background: #373737; color: #7e7763; text-align: center; float: left; display: inline; list-style: none; margin: 2px; }

    • ベストアンサー
    • HTML
  • 4枚の画像を均等間隔で一列に並べる

    4枚の画像を一列に並べようと思います。 4枚に与えられたスペースは550pxです。画像の下のコンテンツも550pxを基準に配置するので、4枚のうちの両側の2枚は550pxの両端に配置しようと思います。 この趣旨でコーディングしたのが下記URLです。 http://makoji.web.fc2.com/test/test_18/test.html 他の画像を margin-right: 14px; とすると綺麗に並びました。ただ確認をとったのは最近のブラウザだけで、古いブラウザでどうなっているのか分かりません。過去の例でうまく並んだと思ったらIE6.0で4枚目が2列目に改行されてしまっていたことがあります。 そこでmarginをブラウザに自動割り振りさせることが出来ないものかと思案するのですが・・・ とりあえず右端の画像を右端に寄せるために margin-right: 0px; margin-left: auto; としてみましたがダメでした。でも width: 125px; もしくは float: right; を挿入すれば解決できます。 しかしながら真ん中の2枚をどうすれば均等に配置できるかが分かりません。 この場合、古いブラウザを試せる環境を全部揃えて片っ端からチェックを入れるしかないのでしょうか。 -------------------------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <style type="text/css"> <!-- * { font-size: 14px; font-wight: 100; color: #000000; } .wrap { margin: 0px auto; width: 700px; } .logo { border: solid 1px #FF0099; } .main { padding-top: 15px; padding-bottom: 15px; border: solid 1px #FF0099; } .main img { margin-right: 2px; float:left; display: block; } .menu { float: left; margin-top: 0px; margin-left: 10px; padding-left: 0px; } .menu li { margin-bottom: 2px; padding-top: 5px; padding-bottom: 5px; padding-left: 10px; width: 100px; list-style-type: none; background-color: #FFCCFF; } .list span { color: #FF0099; } .menu a:link { color: #FF0099; } .menu a:visited { color: #FF0099; } .menu a:active { color: #FF0099; } .menu a:hover { color: #FF0099; } .clear { clear: both; } /* インデックス */ .index_body { margin-top: 15px; padding-left: 133px; } .sample { margin-bottom: 10px; width: 550px; text-align:center; background-color: yellow; } .sample a { text-decoration: none; } .sample img { border: solid 1px #FF0099; float: none; } .sample .left { float: left; margin: auto auto auto 0px; text-align: center; } .sample .middle { float: left; margin: auto; text-align: center; } .sample .right { margin-right: 0px; margin-left: auto; text-align: center; } --> </style> </head> <body> <div class="wrap"> <div class="logo"> <img src="dot_999999.gif" width="698" height="120"> </div><!-- end of "logo"--> <div class="main"> <ul class="menu"> <li>ああ</li> </ul><!-- end of menu --> <div class="index_body"> <div class="sample"> <div class="left"> <img src="dot_999999.gif" width="123" height="170" alt="ああああ"> <div>aaaaa</div> </div><!-- end of "left" --> <div class="middle"> <img src="dot_999999.gif" width="123" height="170" alt="ああああ"> <div>aaaaa</div> </div><!-- end of 1of"middle" --> <div class="middle"> <img src="dot_999999.gif" width="123" height="170" alt="ああああ"> <div>aaaaa</div> </div><!-- end of 2of"middle" --> <div class="right"> <img src="dot_999999.gif" width="123" height="170" alt="ああああ"> <div>aaaaa</div> </div><!-- end of "right" --> </div><!-- end of "sample" --> <div><img src="dot_999999.gif" width="550" height="450" alt="" /></div> <div class="clear"></div> </div><!-- end of "index_body" --> </div><!-- end of "main" --> </div><!-- end of "wrap" --> </body> </html>

専門家に質問してみよう