質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

1回答

383閲覧

figure(img)> figcaption(button) で button:hover したら figure(img) を変化させたい

dokoyakoko

総合スコア15

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2022/04/08 07:28

編集2022/04/10 06:57

新たな問題点(2022/04/10-)

<button>の記述が誤っていたことに気付き、以下の HTML に変更したところ、
PC(Windows+chrome)からの閲覧や動作ではまったく問題の無い javascript が
スマホ(android+chrome)からの閲覧でのみ<button>を長押しする、もしくは
onclick後で無ければ filter: grayscale(0); に変化しない、という問題が発生致しました。
ワンタップでもホバー判定はされるものの、filter: grayscale(100%); が変わらず、
上記の長押し~onclick後に遅れて filter: grayscale(0); となります。

javascript 内に touchstart などを加筆するといった自力解決に努めましたが、
スマホ閲覧での不具合を直すことが出来ません。
どのように記載を修正すれば、スマホ閲覧でも<button>を長押しせずに
filter: grayscale(0); に変化させられるか、
どうかご助力、ご回答のほど、何卒よろしくお願い致します。

元々記載していた HTML・CSS には 2022/04/08 時点とは違う変更点がある為、
修正済みとして現状のものに差し替え、一部追加させていただきました。


元々の問題点(2022/04/08時点)

こちらのサイト様や他所や調べても、同様の症状らしきものにすら出会えず、とても困っております。
親要素となる<figure>内の<img>に対し、子孫要素である<button>をホバーすることで
<img>に仕込んでいた filter: grayscale(100%); を filter: grayscale(0); に変化させたいのですが、
本当にうんともすんとも……。
それと「子孫要素から親要素に影響を与えることは出来ない」という記事も見かけたものの、
ここまでコードを書いたのに……と諦め切れず、こちらで質問させて頂きました。
(キャラクターリストのような複数横並びのものを制作しようと思っています)

追記(2022/04/08時点)

CSSのみの実現や問題解決は困難、と回答者さんが判断された場合は
こちらの質問内容の実現を可能とするJavaScript、またはjQueryをお教え頂きたく存じます。


HTML(修正済み)

HTML

1 <ul> 2 <li> 3 <figure> 4 <center><img src="images/sample.png"></center> 5 <figcaption> 6 <h3>ファーストネーム・<br>ファミリーネーム</h3> 7 <hr> 8 <span>firstname familyname</span> 9 <button type="button" onclick="window.open('file/sample.html', '_blank')"> 10 <i class="fa-solid fa-check fa-fw"></i> sample link text</button> 11 </figcaption> 12 </figure> 13 </li> 14 <li> 15 <figure> 16 <center><img src="images/sample.png"></center> 17 <figcaption> 18 <h3>ファーストネーム・<br>ファミリーネーム</h3> 19 <hr> 20 <span>firstname familyname</span> 21 <button type="button" onclick="window.open('file/sample.html', '_blank')"> 22 <i class="fa-solid fa-check fa-fw"></i> sample link text</button> 23 </figcaption> 24 </figure> 25 </li> 26 <li> 27 <figure> 28 <center><img src="images/sample.png"></center> 29 <figcaption> 30 <h3>ファーストネーム・<br>ファミリーネーム</h3> 31 <hr> 32 <span>firstname familyname</span> 33 <button type="button" onclick="window.open('file/sample.html', '_blank')"> 34 <i class="fa-solid fa-check fa-fw"></i> sample link text</button> 35 </figcaption> 36 </figure> 37 </li> 38 </ul>

CSS( ul / li )

CSS3

1ul { 2margin: auto; 3display: flex; 4flex-flow: row wrap; 5place-content: space-between center; 6list-style-type: none; 7max-width: 1200px; 8gap: 3rem; 9} 10@media screen and (min-width: 360px) { main li { width: 90%;}} 11@media screen and (min-width: 960px) { main li { width: 255px;}}

CSS( figure / img )(修正済み)

CSS3

1img { 2backface-visibility: hidden; 3image-rendering: -webkit-optimize-contrast; 4image-rendering: crisp-edges; 5vertical-align: bottom; 6} 7figure, figure img, figure.hovered, figure.hovered img { transition: 1.1s; will-change: filter;} 8figure { 9background: #81A611; 10margin: 0; 11width: 255px; 12overflow: hidden; 13box-sizing: border-box; 14display: block; 15} 16figure img { 17width: 460px; 18object-fit: cover; 19filter: grayscale(100%); 20} 21@media screen and (min-width: 360px) { figure img { height: 122px;}} 22@media screen and (min-width: 960px) { figure img { height: 125px;}} 23figure.hovered img { filter: grayscale(0);}

CSS( figcaption / button )(修正済み)

CSS3

1figcaption { 2letter-spacing: 2.55px; 3line-height: 1.55; 4color: #000; 5background: #FFF; 6position: relative; 7} 8@media screen and (min-width: 360px) { figcaption { padding: 1.55rem; height: 200px;}} 9@media screen and (min-width: 960px) { figcaption { padding: 1.65rem 1.55rem; height: 215px;}} 10figcaption span { font-size: x-small; text-transform: uppercase; display: block;} 11figcaption hr { 12margin: 1.05rem 0 1.3rem; 13padding: 0; 14border-top: solid thin; 15height: 0; 16opacity: 0.45; 17} 18figcaption button { 19cursor: help; 20letter-spacing: 1.55px; 21color: #FFF; 22background: #000; 23padding: 3px 8px 1px 7px; 24transition: .65s; 25position: absolute; 26} 27figcaption button:hover { color: #000; background: #FFF;} 28@media screen and (min-width: 360px) { figcaption button { font-size: x-small; bottom: 1.55rem;}} 29@media screen and (min-width: 960px) { figcaption button { font-size: small; bottom: 1.65rem;}}

javascript

javascript

1buttonObserver(); 2 3 function buttonObserver() { 4 const buttons = document.querySelectorAll('figcaption button'); 5 buttons.forEach(button => { 6 const figure = button.closest('figure'); 7 button.addEventListener('mouseenter', () => { 8 figure.classList.add('hovered'); 9 }); 10 button.addEventListener('mouseleave', () => { 11 figure.classList.remove('hovered'); 12 }); 13 }); 14 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arcxor

2022/04/08 08:26

期待する結果(実現したいこと)は何ですか?JavaScript を使わず CSS のみで実現したいのですか?
dokoyakoko

2022/04/08 08:57

大切な情報を欠如させたまま質問を投稿してしまい、申し訳ございません。 当方の質問内容が「CSSのみの実現や解決は困難」という事でありましたら、 実現を可能とするJavaScriptをお教え頂きたく存じます。 よろしくお願い致します。
guest

回答1

0

色々書かれている CSS の意味が理解できていませんが、button の hover 時に figure へ class 名を付与する JavaScript を書く必要があります。

js

1 2buttonObserver(); 3 4function buttonObserver() { 5 const button = document.querySelector('figcaption button'); 6 const figure = button.closest('figure'); 7 8 button.addEventListener('mouseenter', () => { 9 figure.classList.add('hovered'); 10 }); 11 button.addEventListener('mouseleave', () => { 12 figure.classList.remove('hovered'); 13 }); 14}

CSS だけで実現するには :has 疑似クラスを用いる必要がありますが、:has 疑似クラスは多くのブラウザで実装されていません。

投稿2022/04/08 14:19

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dokoyakoko

2022/04/08 15:08

arcxorさん、ご回答ありがとうございます。 有難くもご提案頂いたJavaScriptですが、例えば<figure>~<figure>を包み込んだ<ul>の display:flex; などで複数並べた状態だと、最も先頭(1番目)の<img>にのみ適応され、 2番目の<img>からは button:hover; しても全て無反応となってしまっています。 (当方のCSSに追加して頂いた部分もきちんとCSS内に追記しております) 少しでも問題解決へ前進できたことを嬉しく思っています。 よろしければ、引き続きよろしくお願い致したく存じます。
arcxor

2022/04/08 15:58

期待する結果(実現したいこと)は何ですか?と問うたように、質問文に要件を全て書くようにしてください。 複数の figure に対応したバージョンです。 https://codepen.io/arcxor/pen/mdpLprp
dokoyakoko

2022/04/09 02:18

引き続いてのご回答、および複数対応について誠に有難うございます。 追記してくださった ul 部分は既に自身のソースコードにございますので、お手数をお掛けして申し訳ありません。 複数対応後のご回答を頂く前から、ご提案くださったJavaScriptの「querySelector」を「querySelectorAll」へ 適査書き変えたりしましたが、スーパーリロードをしてもソース表示をして確かめても、自身で確実に書いた 「querySelectorAll」の効果は全くありませんでした。 arcxorさんの複数対応後のJavaScriptの「querySelectorAll」はきちんと効果が出てくださり、とても嬉しいです! また、現在の学業カリキュラムとして採用されているプログラミング授業において、その修学者たちがネット上に フリー配布されているソースコードの盗作や無断転載をして、学内で自作発言をするケースが目立ってきています。 その為、arcxorさんが要求する「要所」をあれ以上記載することは出来ません。 今回の質問内容は当方のソースコード全体(すでにul~liも記述を終了させた状態)から、 今回の問題点の必要箇所のみを限定的かつシンプルに抜粋したものです。 このような、すぐに埋もれるであろう些細な質問内容であったとしても、<figure>~</figure>以上の先祖要素に 近い部分までこちらで開示することは私的なリスクとして危惧し、正当性をもって事前に回避させて頂きました。 自身で組み上げたソースコードの完全な私物化は有り得ないと完璧に認めておりますが、上記のような不確定性の 多い学業環境からの安全確保のため、何卒ご理解のほどをお願い致します。 この度は問題解決に沢山ご尽力くださり、本当に有難うございました。 arcxorさんのお陰で自分だけでは不可能だった問題解決に至ることが叶いました。 こちらの上記を憂慮し過ぎたための情報不足による複数対応のお願いにおきましては大変ご不快な思いをさせて しまったかと思われますが、それでもご助力には心の底から御礼を申し上げたく。 それでは、失礼致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問