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

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

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

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

CSS

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

Q&A

解決済

1回答

2889閲覧

[CSS]擬似要素に対してposition:relativeを指定できない理由

HirotakaKOBORI

総合スコア2

HTML

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

CSS

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

0グッド

0クリップ

投稿2021/01/18 15:34

前提・実現したいこと

CSSにて擬似要素でboxを作成し、そのboxを基準(position:relative)として子要素の位置を相対的に決定したいです。
擬似要素にposition:relativeを指定しているのですが、効かない状況です。
擬似要素にposition:relativeは指定できないのでしょうか。
できない場合、その理由も含めて教えていただきたいです。

また、後述の”試したこと”に記載した通り、擬似要素を当てているクラス自体にposition:relativeを指定したら、擬似要素として作成したboxを基準として子要素の位置を決定できました。
こちら何故できたのかわからないので教えていただきたいです。

よろしくお願いいたします。

該当のソースコード

CSS

1.top_wrapper { 2 background-color: red; 3} 4 5.top_wrapper:before { 6 content: ""; 7 display: block; 8 background-color: gray; 9 padding-top: 50%; 10 position: relative; 11} 12.top_left { 13 position: absolute; 14 top: 150px; 15} 16

html

1 <div class="top_wrapper"> 2 <div class="container"> 3 <div class="top_left"> 4 <h1 class="top_message">身近な旅、新しい旅。</h1> 5 <div class="top_btn">近場の宿泊先を探す</div> 6 </div> 7 </div> 8 </div>

試したこと

CSSを以下のように変更(擬似要素を当てているクラス自体にposition:relativeを指定)したらできました。

CSS

1.top_wrapper { 2 background-color: red; 3 position: relative; 4} 5 6.top_wrapper:before { 7 content: ""; 8 display: block; 9 background-color: gray; 10 padding-top: 50%; 11 12} 13.top_left { 14 position: absolute; 15 top: 150px; 16} 17

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

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

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

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

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

int32_t

2021/01/18 15:41

.top_left の座標の基準を.top_wrapper::beforeにしたかった、という理解でよいですか?
m.ts10806

2021/01/18 22:22

理由は「仕様」になるのでは。 やりたい事ができないならできる方法を模索する方向に質問かえられたほうが良いかと
HirotakaKOBORI

2021/01/19 03:23

>int32_tさん 仰る通りです。 >m.ts10806さん 仕様ですね。できる方法は”試したこと”に記載をしています。
guest

回答1

0

ベストアンサー

CSSにて擬似要素でboxを作成し、そのboxを基準(position:relative)として子要素の位置を相対的に決定したいです。

ご自身が上記のように書いている通り、子要素(正確には子孫要素)からみて基準になるものを指定するものです。
疑似要素は子要素を持つことができないので、指定しても意味がないです。

.top_left は .top_wrapper:before の子孫要素ではないので効かない。
.top_wrapper は子孫要素なので効く。
ということです。

投稿2021/01/19 00:55

hatena19

総合スコア33784

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

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

HirotakaKOBORI

2021/01/19 03:29

ご回答ありがとうございます。 >.top_left は .top_wrapper:before の子孫要素ではないので効かない。 >.top_wrapper は子孫要素なので効く。 こちら理解できました。ありがとうございます。 追加で質問があります。 .top_left は、.top_wrapperの子孫要素なので効くというのは分かりましたが、 一方で、.top_wrapper にposition:relativeを指定すると、基準となるのは.top_wrapperではなく、.top_wrapper:beforeでした。 親子関係を考えたときに.top_wrapperが基準となると思ったのですが、何故でしょうか。
hatena19

2021/01/19 03:53

提示のHTMLとCSSだと、.top_wrapper と .top_wrapper:before の位置、サイズは同じになりますので、.top_wrapper:before 基準のように見えますが、実際は .top_wrapper 基準です。 例えば、下記のように transform で下に100px移動させてみてください。 .top_wrapper::before { transform: translatey(100px); } ::before疑似要素は100px下に移動しますが、.top_left は移動しません。
HirotakaKOBORI

2021/01/19 11:39

うわー!ありがとうございます。疑問解消しました! ご親切にどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問