新たな問題点(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 }