質問するログイン新規登録

Q&A

2回答

523閲覧

image要素を背景として表示するJavaScript

uniikurashirako

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/06/22 07:28

編集2023/06/23 08:06

0

0

実現したいこと

  • javascriptでwebページ内の特定のimage要素を背景として表示する機能を動作するようにする

前提

JavaScriptで、以下のhtml構成を下記の要件で動作させたい。

html構成は以下の通りです。

<div class="wc_back"> <div class="wc_back_img"> <img src="画像のURL" /> </div> <div class="wc_back_txt"> <div><p>テキストの内容</p></div> </div> </div>

作成するjavascriptsの要件は以下の通りです。
1."wc_back_img"を親に持つ画像を画面幅一杯で表示してください。
2.表示した際の余白は上下左右すべて0にしてください。
3.画面サイズが変わったら自動でリサイズしてください。
4.画像の高さは最低390pxにしてください。
5.表示した画像に"wc_back_txt"を親に持つテキストを被せてください。
6.テキストの表示位置は、画像の左上にしてください。
7."wc_back_center"を追加持つテキストは画像中央に表示してください。
8.上記html構成が複数存在する場合は全てに適用してください。

発生している問題・エラーメッセージ

4.画像の高さは最低390pxにしてください。 が反映されない

該当のソースコード

JavaScript

1// image要素を背景として使う関数 2function useImageAsBackground() { 3 // wc_backというクラスを持つすべてのimage要素を取得 4 const imageElements = document.querySelectorAll('.wc_back img'); 5 const textElements = document.querySelectorAll('.wc_back_txt'); 6 7 if (imageElements.length === textElements.length) { 8 // wc_back要素の数だけループ処理を行う 9 for (let i = 0; i < imageElements.length; i++) { 10 const imageElement = imageElements[i]; 11 const textElement = textElements[i]; 12 13 // 取得したimage要素の親要素に背景要素を作成 14 const parentElement = imageElement.parentNode; 15 const backgroundElement = document.createElement('div'); 16 backgroundElement.classList.add('background-element'); 17 18 // 取得したimage要素のパスを取得して背景として設定 19 const imagePath = imageElement.getAttribute('src'); 20 backgroundElement.style.backgroundImage = `url(${imagePath})`; 21 22 // 取得したimage要素を非表示にする 23 imageElement.style.opacity = '0'; 24 25 // 最低の高さを指定するための変数 26 const minHeight = 390; 27 28 // 背景要素に対して適用するCSSを設定 29 backgroundElement.style.position = 'absolute'; 30 backgroundElement.style.top = '0'; 31 backgroundElement.style.left = '0'; 32 backgroundElement.style.width = '100%'; 33 backgroundElement.style.height = '100%'; 34 backgroundElement.style.backgroundSize = 'cover'; 35 backgroundElement.style.backgroundPosition = 'center'; 36 backgroundElement.style.backgroundRepeat = 'no-repeat'; 37 38 // テキスト要素を配置 39 textElement.style.position = 'relative'; 40 textElement.style.zIndex = '1'; 41 42 // 背景要素とテキスト要素を親要素に追加 43 parentElement.appendChild(backgroundElement); 44 45 // 背景要素の下部の余白を0に設定 46 parentElement.style.paddingBottom = '0'; 47 48 // 背景画像の読み込みが完了した後に背景要素の高さを設定する 49 imageElement.addEventListener('load', () => { 50 const textHeight = textElement.offsetHeight; 51 const backgroundHeight = Math.max(textHeight, minHeight); 52 backgroundElement.style.height = `${backgroundHeight}px`; 53 54 // 背景要素の下部の余白を0に設定 55 parentElement.style.paddingBottom = '0'; 56 }); 57 } 58 } 59} 60 61// HTMLの要素が読み込まれた後に実行する処理 62window.addEventListener('DOMContentLoaded', () => { 63 useImageAsBackground(); 64});

試したこと

最低の高さを指定するための変数を調整した

補足情報(FW/ツールのバージョンなど)

下図のようなイメージですが伝わりますでしょうか。
イメージ説明

サンプル適用時
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

yambejp

2023/06/22 08:12

イメージがわかないので図示できませんか?
guest

回答2

0

この回答はGPT-4による自動生成回答です

以下のように修正してみてください。imageElementloadイベントリスナーを追加する前に、imageElementsrc属性を再設定することで、イベントが正しく発火するようになります。

JavaScript

1// 背景画像の読み込みが完了した後に背景要素の高さを設定する 2imageElement.addEventListener('load', () => { 3 const textHeight = textElement.offsetHeight; 4 const backgroundHeight = Math.max(textHeight, minHeight); 5 backgroundElement.style.height = `${backgroundHeight}px`; 6 7 // 背景要素の下部の余白を0に設定 8 parentElement.style.paddingBottom = '0'; 9}); 10 11// 画像の読み込みを再度トリガーするために、src属性を再設定 12imageElement.src = imagePath;

これで、画像の高さが最低390pxになるように設定されるはずです。

投稿2023/06/22 07:29

teratail-ai

Powered by GPT-4

0

不明な箇所がいくつかありますがとりあえず雛形
想定と違う箇所があればご指摘ください

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const wc_back=document.querySelector('.wc_back'); 4 const wc_back_img=document.querySelector('.wc_back_img'); 5 const img=wc_back_img.querySelector('img'); 6 const wc_back_txt=document.querySelector('.wc_back_txt'); 7 wc_back.style=` 8 position:relative; 9 `; 10 wc_back_img.style=` 11 background-Image:url(${img.src}); 12 background-repeat:no-repeat; 13 background-size:100%; 14 background-position: center; 15 min-height:390px; 16 `; 17 img.style=` 18 display:none; 19 `; 20 wc_back_txt.style=` 21 position:absolute; 22 top:0; 23 `; 24}); 25</script> 26<br><br><br> 27<div class="wc_back"> 28<div class="wc_back_img"> 29<img src="https://gihyo.jp/assets/images/ICON/2015/1367_interview_teratail.png"> 30</div> 31<div class="wc_back_txt"> 32<div><p>テキストの内容</p></div> 33</div> 34</div>

投稿2023/06/23 01:10

yambejp

総合スコア118273

uniikurashirako

2023/06/23 08:08

ご回答頂きありがとうございます。 いただきました雛形を実際に試させていただきました。 画像がコンテンツ幅内に収まっている状態でした。 スクリーンショットを本文文末に追記させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問