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

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

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

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

CSS

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

Q&A

4回答

4849閲覧

CSSでposition:fixed;する際に、画面でなく親要素を基点にしたい。

maimaime

総合スコア17

HTML

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

CSS

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

0グッド

0クリップ

投稿2018/10/19 03:54

編集2018/10/19 08:03

前提・実現したいこと

CSSでposition:fixed;する際に、画面でなく親要素を基点にしたい。

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

該当のソースコードについて、
「.A」は、「.inner」の33%
「.B」は、「.inner」の66%
という幅にしたい。

該当のソースコード

該当のソースコードのサンプル
https://jsfiddle.net/byxms2e6/

該当のソースコード

html

1<main> 2 3 <section id="left"> 4 <p>100px固定</p> 5 </section> 6 7 <section id="right"> 8 <div class="inner"> 9 <div class="A"> 10 <p>「.inner」の33%</p> 11 </div> 12 <div class="B"> 13 <p>「.inner」の66%</p> 14 <p>「.inner」の66%</p> 15 <p>「.inner」の66%</p> 16 <p>「.inner」の66%</p> 17 <p>「.inner」の66%</p> 18 <p>「.inner」の66%</p> 19 <p>「.inner」の66%</p> 20 <p>「.inner」の66%</p> 21 <p>「.inner」の66%</p> 22 <p>「.inner」の66%</p> 23 </div> 24 </div> 25 </section> 26 27</main> 28 29<style type="text/css"> 30main { 31 width: 100%; 32} 33#left { 34 position: fixed; 35 background: skyblue; 36 height: 100vh; 37 width: 100px; /* 固定100px */ 38} 39#right { 40 margin: 0 0 0 100px; 41 width: 100%; /* 「main幅 - #leftの100px」という意味での100%*/ 42 position: relative; 43} 44.inner { 45 margin: 0 auto; 46 max-width: 500px; 47} 48.A { 49 position: fixed; 50 background: khaki; 51 color: red; 52 width: 33%; /* 「.inner」の33%にしたい */ 53 z-index: 1; 54} 55.B { 56 position: relative; 57 background: palegreen; 58 width: 66%; /* 「.inner」の66%にしたい */ 59 margin: 0 0 0 33%; 60} 61.B p { 62 height: 50px; 63} 64</style>

試したこと

ネットで検索し、box-sizingや親要素への指定など一通り試しましたが、思うようにいきませんでした。

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

特にありません。

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

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

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

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

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

x_x

2018/10/19 04:25

absoluteではいけない理由があるのでしょうか?
maimaime

2018/10/19 04:44 編集

はい。「.A」をabsoluteすると「.A」はスクロールされてしまいます。「#left」と「.A」は固定(fixed)し、「.B」だけをスクロールさせる。といいう動作を意図しております。
x_x

2018/10/19 04:49

.B にスクロールバーを持たせるのが自然かと思うのですがどうでしょうか?
maimaime

2018/10/19 04:56

なるほど。「.B」に「height: 100vh;」と「overflow-y: scroll;」ですか。一案ですね。参考にさせて頂きます。
yoshinavi

2018/10/19 12:16

レイアウト動作の意図が今ひとつ理解出来ていないのですが、「position:fixed;」のグループとその他と分けるべきでは?レスポンシブ等は考慮するのでしょうか?
guest

回答4

0

やりたいのはこういうことじゃないかと、解釈しているのですが、いかがでしょう?

css

1<style type="text/css"> 2body{ 3 margin:0; 4} 5main { 6 width: 100%; /*編集・追記依頼を受けて修正致しました。*/ 7} 8#left { 9 position: fixed; 10 background: skyblue; 11 height: 100vh; 12 width: 100px; 13} 14#right { 15 width: 100%; 16 position: absolute; 17 left:100px; 18} 19.A { 20 position: fixed; 21 background: khaki; 22 color: red; 23 width: 33%; 24 25} 26.B { 27 position: relative; 28 background: palegreen; 29 width: 66%; 30 left: 33%; 31} 32.B p { 33 height: 50px; 34} 35</style>

投稿2018/10/19 05:29

colling

総合スコア798

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

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

colling

2018/10/19 05:46 編集

ああw違う。mainに対するか、、。不正解ですね。m(_ _)m
maimaime

2018/10/19 05:46

それです!「position: relative;」にも「left: 33%;」という指定はできるんですね。その他いろいろ、大変勉強になりました。ありがとうございます!
maimaime

2018/10/19 05:47

え?いえいえ、大丈夫です。そちらで正解ですよ。
maimaime

2018/10/19 05:51

あぁ、たしかに、mainに対する幅にはなっていませんでしたね。すみませんせっかく。
colling

2018/10/19 06:01

すいません。日本語の読解がなっていませんでした。ゴメンなさい(笑
colling

2018/10/19 07:12

ちょっと、おさらいさせてー。 mainの幅 =ビューポート(可変)だとすると .A と.Bが、それぞれ、mainの幅に対して33%、66%を期待するならば、#leftの幅はどこへ行くの?
maimaime

2018/10/19 07:18

たーしかに!!w質問がめっちゃくちゃでしたね。申し訳ございません。 Aは、(main幅 ー #leftの100px)✕33% Bは、(main幅 ー #leftの100px)✕66% でした。
colling

2018/10/19 07:46

ああ。じゃぁ↑これを試してみれば?
maimaime

2018/10/19 07:54

ですよね笑。 と思ってお蔭さまでかなり近づきました↓ https://jsfiddle.net/5p970kr8/1/ ただあとは、画面幅を狭めた時に、緑のBだけが狭くなってしまうのが問題です。
colling

2018/10/19 08:49

おお、、。完成を待ってますw
maimaime

2018/10/19 10:03

がんばりますw
guest

0

幅が500pxとわかっているので計算してしまえばいいのでは?

CSS

1.A { 2 width: calc(500px * 0.33); 3} 4 5.B { 6 width: calc(500px * 0.66); 7}

投稿2018/10/19 04:48

x_x

総合スコア13749

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

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

maimaime

2018/10/19 04:55

申し訳ございません。mainは100%のつもりでした。すみません。。
maimaime

2018/10/19 05:02

というか正確に言うと、mainはmax-width指定しているので可変だとお考え頂ければと思います。
x_x

2018/10/19 06:02 編集

同じことだと思いますが。 仮にmain { max-width: 800px; }となっていたなら .A { max-width: calc(800px * 0.33); } とするだけでしょう。
maimaime

2018/10/19 05:54

なるほど!!できました。ありがとうございます。
maimaime

2018/10/19 06:30

すみません、やはりできていませんでした。 「#right」の中で「.A」と「.B」の幅がせめぎあってほしいのですが、画面幅を狭めても「.A」は縮まず「.B」が見えなくなるばかりでした。 https://jsfiddle.net/qjcvtx1p/
x_x

2018/10/19 06:37

提示コードと違うし、widthのcalcもないようですが?
maimaime

2018/10/19 06:49 編集

コードの違いは今回のご回答に沿ったつもりなのでご容赦ください。 widthのcalcというと、こうでしょうか? https://jsfiddle.net/qjcvtx1p/1/ それでもやはり「.A」の幅は変化しないのでは? 画面の幅を狭めても、「.B」が狭くなる(画面からはずれる)ばかりで、「.A」の幅が変化しないということです。
x_x

2018/10/19 06:51

mainを100%に変更したのなら、そちらも100%から計算しないといけないのでは?
maimaime

2018/10/19 06:55 編集

いえ、mainの100%を消しても変わりませんし、またABのcalcを(800px * 0.33)でなく(100% * 0.33)などにしても変わらないようです。ん?100%*0.33は33%か。混乱してきました。笑
maimaime

2018/10/19 06:56

まぁ元の質問について解決したのなら、幅の可変性については別質問立ててくれ、という話ですよね。失礼しました。
x_x

2018/10/19 07:06

まあ、100%にしても正常に動くことは確認済みなので、あとは maimaime さんが慎重に計算するだけです。 それでも.Bをスクロールさせたほうがいいと思ってますし、そちらのほうが楽だと思います。
maimaime

2018/10/19 07:25

でもそれですとスクロールバーが画面の端でなくBの端に出てしまってイマイチな印象です。
maimaime

2018/10/19 07:26

>まあ、100%にしても正常に動くことは確認済み え"っ、正しいコードがお分かりであれば、もう教えて下さっても良いのでは…?汗 ダメでしょうか。
guest

0

https://developer.mozilla.org/ja/docs/Web/CSS/position

こちらのfixedの項目を確認すると理解できるかもしれません。
基本的には祖先要素の状態にかかわらずビューポート(ブラウザのwindow)が基準になりますが、
祖先要素に祖先の一つに transform, perspective, filter の何れかのプロパティが none 以外の場合、その要素が基準になります。

動くコード

投稿2018/10/19 04:32

keisukeh

総合スコア657

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

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

maimaime

2018/10/19 04:41

こんにちは。ありがとうございます。 頂戴した「動くコード」ですと、「.A」が「.B」と一緒にスクロールしてしまうようです。
guest

0

こんちは。
.Aが、z-index:1;となっているので、.Bz-index:1;にしてみてください。

投稿2018/10/19 04:11

colling

総合スコア798

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

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

maimaime

2018/10/19 04:15 編集

こんにちは。お世話になります。 「.A」のz-index指定は重なっていることを見やすくしているだけです。 なので「.B」にそれを指定しても「.A」の幅が変化するわけではないと思います。
colling

2018/10/19 04:29

こんにちは、#leftと#rightが重なっている状態で、#rightがwidth:100%、.Aが33%、.Bが66% もなんかおかしい気がします。.Aは左端に寄せるのが求めている動作でしょうか?
maimaime

2018/10/19 04:39

ありがとうございます。 >#leftと#rightが重なっている状態 「#right」の位置は「margin: 0 0 0 100px;」で「#left」を避けているつもりなので、「重なっている」と仰る意味がよくわかりません。 >#rightがwidth:100%、.Aが33%、.Bが66% もなんかおかしい 『「#right」の「width:100%」』は、『「#left」を避けて余った画面の幅全て』というつもりで書きました。 >.Aは左端に寄せるのが求めている動作でしょうか? 『左側』というのが『「#left」のさらに右』という意味でしたらそうです。
colling

2018/10/19 05:16

なるほど、当初のコードで#right幅400pxでmargin-left:100pxではと思ったのですけど違うのですね。 #main可変#rightも可変ってことですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問