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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

HTML

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

CSS

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

7509閲覧

サイドバーを固定し、サイドバーの横の領域のみスクロールできるようにしたい。

R-Fujimoto

総合スコア13

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

HTML

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

CSS

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/05/27 07:57

前提

ボタンを押すことでサイドバーを表示し、サイドバーにあるボタンを押すことでサイドバーの横に文字コンテンツを表示させるデザインを実装しています。
下記はデモです。
demo(CodeSandBox)

demo

  • open textボタンを押すと、サイドバーの横に文字コンテンツが表示されます。
  • close textボタンを押すと、文字コンテンツが非表示になります。
  • close side barボタンを押すと、サイドバーが非表示になります。また、サイドバー横の薄暗い部分をクリックしても、サイドバーが非表示になります。

CSSはemotionを利用しています。

発生している問題

現状はサイドバーの高さより、文字コンテンツ領域の方が高いので、スクロールするとサイドバーの高さが途切れます。

下記はその状態を示す画像です。

スクロール前
初期
スクロールすると、サイドバーが途切れて下地の薄黒い色が見えます。
![引用イメージ説明

実現したいこと

スクロールした際の挙動を下記の通りにしたいです。

  • サイドバー → スクロールされず、サイドバーの要素が欠けることなく常に表示されている
  • 文字コンテンツ領域 → スクロールされる

該当のソースコード

SideBar.js

jsx

1const SideBar = ({ setSide }) => { 2 const [content, setContent] = useState(false); 3 4 return ( 5 <Fragment> 6 <div onClick={() => setSide(false)} css={sideBarBack} /> 7 <div css={sideBarWrap}> 8 <div css={sideBarStyle}> 9 <h2>Side Bar</h2> 10 <button onClick={() => setContent(true)}>open text</button> 11 <br /> 12 <button onClick={() => setContent(false)}>close text</button> 13 <br /> 14 <button onClick={() => setSide(false)}>close side bar</button> 15 </div> 16 {content && ( 17 <div css={contentStyle}> 18 <h2>This is text content</h2> 19 <p>長文の文字</p> 20 </div> 21 )} 22 </div> 23 </Fragment> 24 ); 25}; 26 27const sideBarBack = css` 28 position: fixed; 29 top: 0; 30 left: 0; 31 background: black; 32 opacity: 0.8; 33 width: 100vw; 34 height: 100vh; 35`; 36 37const sideBarWrap = css` 38 position: absolute; 39 top: 0; 40 left: 0; 41 min-height: 100vh; 42 display: flex; 43`; 44 45const sideBarStyle = css` 46 position: sticky; 47 height: 100vh; 48 padding: 1rem; 49 background: tomato; 50 white-space: nowrap; 51 button { 52 font-size: 16px; 53 margin-bottom: 16px; 54 background: white; 55 cursor: pointer; 56 } 57`; 58 59const contentStyle = css` 60 background: steelblue; 61 padding: 2rem 1rem; 62 height: 100%; 63`;

試したこと

「サイドバー 固定」でググると、固定したい要素にposition: sticky;を記述するとよい、という旨のページをいくつか読んだのでサイドバーに設定しましたが、効果がありませんでした。

また、「position sticky 効かない」でググると、下記のページを見つけました。

上記ページそれぞれの解決策を試しましたが、改善されませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CodeSandboxを編集してみました。
https://codesandbox.io/s/happy-sutherland-xwz7n

実現したいことにおいてposition: stickyは必要ないかと思いました。
変更点は、contentStylemax-height: 100vhを設定し、コンテンツがその高さを超える場合はスクロールしたいので、overflow: scrollを指定しました。

js

1const contentStyle = css` 2 background: steelblue; 3 padding: 2rem 1rem; 4 max-height: 100vh; 5 overflow: scroll; 6`;

これでsideBarStyleと同じく高さが100vhになりましたが、問題はbox-sizingで指定するボックスサイズの算出方法です。
http://www.htmq.com/css3/box-sizing.shtml

デフォルトだとpaddingがheightに含まれないので、contentStylesideBarStyleでは最終的な高さが異なる上に、paddingの分だけ100vhからはみ出てしまいます。なので、paddingもheightに含まれるようにbox-sizingborder-boxを指定します。ここれでは便宜上、親要素のスタイルであるsideBarWrapの中に含めましたが、グローバルなスタイルで指定するのが一般的だと思います。

js

1const sideBarWrap = css` 2 position: absolute; 3 top: 0; 4 left: 0; 5 min-height: 100vh; 6 display: flex; 7 * { 8 box-sizing: border-box; 9 } 10`;

投稿2020/05/27 13:16

markey

総合スコア355

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問