PixiJSで画像読み込んだりなんやらかんやらする。
だいたいChatGPTくんに教えてもらったことのメモ。
参考
htmlから
なんにもしないボタンのみの表示。
このhtmlファイルはファイルをダブルクリックするだけでブラウザに表示される。この時点でバグるのは保存時の文字コードの問題。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Modal</title>
</head>
<body>
<button id="close-modal">閉じる</button>
</body>
</html>
html+CSS
CSSによってhtml要素を装飾する。
ここではボタン要素にid属性ではなくclass属性をしていることに注意を要する。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Modal</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<button class="close-modal">閉じる</button>
</body>
</html>
styles.css
.close-modal {
background-color: #4CAF50; /* 背景色 */
border: none; /* 枠線を非表示にする */
color: white; /* 文字色 */
padding: 10px 20px; /* 内側の余白 */
text-align: center; /* テキストの位置 */
text-decoration: none; /* テキストの装飾を無効にする */
display: inline-block; /* ブロック要素として表示する */
font-size: 16px; /* フォントサイズ */
margin: 4px 2px; /* 外側の余白 */
cursor: pointer; /* カーソルをポインタにする */
border-radius: 12px; /* 角を丸くする */
transition-duration: 0.4s; /* ホバーエフェクトのアニメーション時間 */
}
セマンティクス(Semantics)
ある表現(ここではウェブページ)の内容や意味をhtmlという構造的な文章を用いて相手に伝えようとする努力。
html製作者は、ページの内容、コンテンツについて適切と思われるhtmlタグを当てはめるわけであるが、それが適切に当てはまってるかどうかは最終的にはページを訪れた個々人の判断にゆだねられる。
極論を言えば、html製作者は自分がそうだと思うようにページの内容にタグ付けすれば良い。ただしそれが他人に伝わるかは別の話である。可能な限り伝えたいのであればその辺の規範なりベストプラクティスなどにのっとれという話であると思われる。
極論を言えば、あなたのパソコンのファイルがぐっちゃぐちゃになるように、画像ファイルの分類がうまくいかないように、タグ付けという手法は必ず漏れ、およびなんとも言えない領域を作り出す。
ゆえに仕事としてお給料をもらいながらSEO対策を言いつけられているとかでなければそんなに難しく考える領域ではない。と思われる。
id属性とclass属性
属性(attribute)
id属性は要素ごとに一意(他に重複が無い)でなければならないとされる。規格上でしなければならないとされている。
class属性は要素ごとに複数設定してよい。そして設定したクラスごとにCSSなどを切り替えることができる。
モーダルなウィンドウ作る
html+CSS+JavaScript
index.html
<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="UTF-8">
<title>Modal</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<button id="open-dialog">開く</button>
<div id="dialog" class="dialog hidden">
<div class="dialog-content">
<button id="close-dialog">閉じる</button>
</div>
</div>
<script src="app.js"></script>
</body>
</html>
styles.css
.dialog {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.dialog-content {
background-color: white;
padding: 20px;
border-radius: 5px;
text-align: center;
}
.hidden {
display: none;
}
app.js
const openDialogButton = document.getElementById("open-dialog");
const dialog = document.getElementById("dialog");
const closeDialogButton = document.getElementById("close-dialog");
// ダイアログを表示する関数
function showDialog() {
dialog.classList.remove("hidden");
}
// ダイアログを非表示にする関数
function hideDialog() {
dialog.classList.add("hidden");
}
// イベントリスナーを追加
openDialogButton.addEventListener("click", showDialog);
closeDialogButton.addEventListener("click", hideDialog);
classList
ファイル選択ダイアログ
html+JavaScript
src属性:画像ファイルのURL
alt属性:画像が未指定、あるいは読み込めない時に表示される代替テキスト。
scriptタグ内部はJavaScript
<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="UTF-8">
<title>Image Preview Example</title>
</head>
<body>
<input type="file" id="file-input" accept="image/*">
<img id="preview" src="" alt="プレビュー" style="max-width: 100%; max-height: 100%;">
<script>
const fileInput = document.getElementById('file-input');
const preview = document.getElementById('preview');
fileInput.addEventListener('change', (event) => {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
preview.src = e.target.result;
};
reader.readAsDataURL(file);
});
</script>
</body>
</html>
ファイル選択ダイアログ(+PixiJS)
html+CSS+JavaScript+PixiJS
PixiJSのスプライトに対してファイル選択ダイアログから画像を読み込む。
pixi.jsはindex.htmlと同じフォルダにダウンロードしてきているものとする。
index.html
<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="UTF-8">
<title>PixiJS FileSelectDialoge</title>
</head>
<body>
<input type="file" id="image-file" accept="image/*" hidden>
<script src="pixi.js"></script>
<script src="app.js"></script>
</body>
</html>
app.js
const app = new PIXI.Application({ width: 800, height: 600, backgroundColor: 0x1099bb });
document.body.appendChild(app.view);
//初期スプライトを作成する場合(この辺はローカルサーバーじゃないと動かない)
//const initialTexture = PIXI.Texture.from("img.jpg");
//const sprite = new PIXI.Sprite(initialTexture);
//sprite.x = (app.view.width - sprite.width) / 2;
//sprite.y = (app.view.height - sprite.height) / 2;
//sprite.interactive = true;
//app.stage.addChild(sprite);
const graphics = new PIXI.Graphics();
graphics.beginFill(0xDE3249);
graphics.drawRect(0, 0, 100, 100);
graphics.endFill();
app.stage.addChild(graphics);
const renderTexture = app.renderer.generateTexture(graphics);
const sprite = new PIXI.Sprite(renderTexture);
sprite.interactive = true;
app.stage.addChild(sprite);
const imageFileInput = document.getElementById("image-file");
// 画像ファイルが選択されたときに呼ばれる関数
function handleImageFileSelect(event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
const texture = PIXI.Texture.from(e.target.result);
sprite.texture = texture;
};
reader.readAsDataURL(file);
}
// スプライトがクリックされたときに呼ばれる関数
function handleSpriteClick() {
imageFileInput.click();
}
// イベントリスナーを追加
imageFileInput.addEventListener("change", handleImageFileSelect);
sprite.on("pointerdown", handleSpriteClick);
この記事が気に入ったらサポートをしてみませんか?