🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

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

CSS

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

Q&A

解決済

2回答

9542閲覧

擬似クラスで要素を重ねるとz-indexが無視されてしまう

patsuco

総合スコア2

HTML5

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

CSS

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

0グッド

0クリップ

投稿2021/02/24 02:52

編集2021/02/24 04:08

divで設定した要素に、背景としてストライプの要素を下に重ねたく
擬似クラス::afterを使ってコーディングしたところ、
z-indexの順番が効かず、親要素(.item)の上に重なってしまいます。

理想の重なり順は
上 <div class="item">
中 擬似要素
下 <div class="bg">
なのですが、どなたか解決方法ご存知でしたら、教えていただきたいです。

該当のソースコード

HTML

1<div class="bg"> 2 <div class="item"> 3 <p>テキスト</p> 4 <a href="#">クリック</a> 5 </div> 6</div>

scss

1.bg { 2 height: 500px; 3 background: #FFFAF0; 4} 5 6.item { 7 position: relative; 8 width: 300px; 9 height: 200px; 10 border: 1px solid #333; 11 border-radius: 10px; 12 z-index: 100; 13 background-color: #fff; 14 &::after { 15 content: ""; 16 position: absolute; 17 top: 0; 18 right: 0; 19 left: 0; 20 bottom: 0; 21 z-index: 0; 22 background-size: auto auto; 23 background-color: rgba(255, 255, 255, 1); 24 background-image: repeating-linear-gradient(-45deg, transparent, transparent 8px, rgba(103, 207, 240, 1) 8px, rgba(103, 207, 240, 1) 16px ); 25 -webkit-transform: translate(10px,10px); 26 transform: translate(10px,10px); 27 border-radius: 20px; 28 pointer-events : none; 29 } 30}

試したこと

.itemのz-indexを削除し、
::after要素のz-indexを-1にしたところ、重なりのエラーは解消されましたが
親要素(.bg)の背景の下になってしまうため、見えません。

これは、親要素に position:relative, z-index:-2 を指定することで見栄えは解消しましたが
次は要素内に入れたリンクボタンがクリックできなくなります。

理想とする見栄え

.itemに直接背景を入れては?というご指摘がありましたが、
.itemと.bgは異なる背景にしたいためこのような記述としています。

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

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

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

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

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

Lhankor_Mhy

2021/02/24 03:19

「親要素の背景の下になってしまうため、見えません。」とのことですが、この「親要素」とは.itemのことですか?
mai1210

2021/02/24 03:22

こんにちは。 .item に背景を付けるのではなく、疑似要素にしたい理由を伺っても良いですか? 単純にこれではダメなのでしょうか・・・ .item { width: 300px; height: 200px; background-color: rgba(255, 255, 255, 1); background-image: repeating-linear-gradient(-45deg, transparent, transparent 8px, rgba(103, 207, 240, 1) 8px, rgba(103, 207, 240, 1) 16px ); -webkit-transform: translate(10px,10px); transform: translate(10px,10px); border-radius: 20px; }
mari.rinn

2021/02/24 03:45 編集

すみません、一旦書いたのですが、リンクのクリックが出来るかどうかは試してないのでわからないため、内容を取り消しとさせて頂きましたのでこの書き込みは無視してください。すみません。
patsuco

2021/02/24 03:51

@Lhankor_Mhy様 >この「親要素」とは.itemのことですか? こちらは.bgのことになります。わかりづらく、申し訳ございません。修正いたします。
patsuco

2021/02/24 03:54

@mai1210様 .bgの背景と.itemの背景は違うものにしたいのです(cssに記述漏れていたので追加いたします。) また、ご指摘いただいた記述では擬似要素が.itemの上にきてしまうようです。
Lhankor_Mhy

2021/02/24 04:02

> こちらは.bgのことになります。 では、「::after要素のz-indexを-1にしたところ、重なりのエラーは解消されましたが親要素(.bg)の背景の下になってしまうため、見えません。」という問題が再現しませんでした。 https://jsfiddle.net/Lhankor_Mhy/z9xaujpk/ おそらく、ご提示いただいていない部分に原因があると思われます。 問題が再現するコードをご提示ください。
hatena19

2021/02/24 04:10

backgroud-color: #fff; がタイポという落ちではないのかな? background-color: #fff;
Lhankor_Mhy

2021/02/24 04:28

↑それを修正しても問題が再現しないのですが、問題が共有される前に自己解決したようなので、なんだかよくわからないけどめでたしめでたし。
mai1210

2021/02/24 04:55

ちょっとズレた影(?)みたいに入れたかったんですね。やりたい事が今やっとわかりました。 何にせよ解決したようなので良かったです。
guest

回答2

0

自己解決

.itemで再現したかったbackground:#fffを
新たな擬似クラス::beforeにて定義し、
z-indexで重なりを調整することで解決できました。
pointer-events : none;が鍵でした。
みなさまご回答いただき、ありがとうございます。

重ね順

・.item
・::before
・::after
・.bg

HTML

1<div class="bg"> 2 <div class="item"> 3 <p>テキスト</p> 4 <a href="#">クリック</a> 5 </div> 6</div>

scss

1.bg { 2 height: 500px; 3 background: #FFFAF0; 4} 5 6.item { 7 position: relative; 8 width: 300px; 9 height: 200px; 10 11 border-radius: 10px; 12 z-index: 100; 13 background-color: #fff; 14 &::before { 15 content: ""; 16 position: absolute; 17 top: 0; 18 right: 0; 19 left: 0; 20 bottom: 0; 21 z-index: 0; 22 z-index: -1; 23 background-size: auto auto; 24 background-color: #fff; 25 border: 1px solid #333; 26 border-radius: 10px; 27 pointer-events : none; 28 } 29 &::after { 30 content: ""; 31 position: absolute; 32 top: 0; 33 right: 0; 34 left: 0; 35 bottom: 0; 36 z-index: 0; 37 z-index: -2; 38 background-size: auto auto; 39 background-color: #fff; 40 background-image: repeating-linear-gradient(-45deg, transparent, transparent 8px, rgba(103, 207, 240, 1) 8px, rgba(103, 207, 240, 1) 16px ); 41 -webkit-transform: translate(10px,10px); 42 transform: translate(10px,10px); 43 border-radius: 20px; 44 pointer-events : none; 45 } 46}

投稿2021/02/24 04:23

編集2021/02/24 04:32
patsuco

総合スコア2

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

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

0

追記 始めに画像が見たかった…

回答 同じ親を持つ子要素に、同じようにポジションを設定する

すみません、itemに直接backgroundではダメなんでしょうか?
試されたことをこちらで再現しながら追ってみましたが、
ずれていること以外は差異が無いような気がします。
もしかしてずれがポイントだったりしますか?

と、たずねつつ検証した結果、paに以下のCSSでいけそうです。

CSS

1 p , a { 2 position: relative; 3 }

以下蛇足です。

検証したり飯食ったり洗濯物を干してる間に同じことを言ってる人がっ
みんな考えることは同じだね~

投稿2021/02/24 03:50

編集2021/02/24 04:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/02/24 06:26

コンパクト版 ちょっとストライプが荒いけども。 <style > body { background: aliceblue; } .outside { position: relative; background: white; width: 100%; max-width: 300px; border: 1px solid; border-radius: 10px; padding: 30px; } .outside::before { content: ""; position: absolute; background: linear-gradient(45deg, white 25%, orange 50%,white 75%, orange 100%); background-size: 6px 6px; top: 8px; left: 8px; width: 100%; height: 100%; border-radius: 10px; z-index: -1; } </style> <body> <div class="outside"> <div class="inside"> <p>ちゃれんじ</p> <a href="#link">どうなることかとおもった</a> </div> </div> </body>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問