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

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

ただいまの
回答率

89.99%

【コード、画像有】cssの「fixed」を使用することで、レイアウトが崩れる原因を教えていただけませんか。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,541

sanset

score 178

サイト内に、スクロールによって追従するサイドメニューを作りたいと思います。(PC専用)

その際に、スクロール位置によってcssの「position:fixed」を追加しサイドメニューを固定したいと思うのですが、
fixedを使用することでよくわからないレイアウト崩れが起きてしまいました。画像とコードで状況をお伝えしますので、よろしければご一緒に考えて頂ければ幸いです。

【現在の状況】

まずは背景色で簡単に位置分けをしております。左がサイドメニューです。

<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<style type="text/css">

.main{
    width:800px;
    margin:0 auto;
}

.clearfix:after{
    content:"";
    display:block;
    clear:both;
}

.main > div{
    float:left;
    box-sizing:border-box;
}

.content{
    width:80%;
    background-color:#CCC;
    height:2000px;
}

.side{
    width:20%;
    height:500px;
}

.side-in{
    background-color:#EEE;
}

.fixed{
    position:fixed;
}

</style>
<body>

<div class="main clearfix">
    <div class="side">
        <div class=""> <!-- ここにfixedを入れる -->
            <div class="side-in">
                こちらがサイドメニューになります
            </div>
        </div>
    </div>
    <div class="content">
        ここはメインコンテンツ
    </div>
</div>

</body>
</html>

イメージ説明

薄いグレーになっている部分がサイドメニューの領域で、「こちらがサイドメニューになります」という文章を入れています。

この状態で、.side-inの親要素に.fixedを追加を追加すると、

イメージ説明

このようになぜか大元の.sideを横幅をはみ出してしまいます。
word-break: break-allなどを利用してもこの状況は改善されませんでした。

.fixedを追加させても、「こちらがサイドメニューになります」を.sideの領域の中で折り返しを行いたいのですが、その場合はどのような記述を行えばいいのでしょうか。

実験はfirefox,chromeで確認しています。コードはコピーで画像のような状況を再現できます。

どなたかご教示お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

<div class="side">
ここで幅指定をしてそのあと

<div class="fixed"> <!-- ここにfixedを入れる -->
ここでfixed(スクロールも無視した固定)をしているので

その内側だけが固定されています。固定されている領域は文字列とその周囲で、サイドメニュー自体は固定されていません。
試しに色を付けてみるとわかりやすいと思います。

.side{
    width:20%;
    height:500px;
    background-color:#ff0000;
}


一つ上のタグではなく画面に依存したサイズになっていることがわかると思います。
これでは折り返しません。


解消するには、サイドのクラス指定で一緒にfixedを指定して(もしくはsideにfixedを含める)

<div class="side fixed">


そのままだとサイドメニューが画面の大きさに依存してしまうので絶対値で幅を固定して

.side{
    width:160px;
    height:500px;
    background-color:#ff0000;
}


コンテンツが一番左に来てしまうので左にマージンを空けて

.content{
    width:80%;//(ここも横幅固定でOK)
    background-color:#CCC;
    height:2000px;
    margin-left:20%;
}


あとところどころ調整すればしっかりと動くと思います。

ただこれをしてしまうと、小さい画面で閲覧しようとすると固定されたサイドメニューが邪魔をしてメインコンテンツが見れなくなることも。
フレームを使って分割して、左右とも自由にサイズ変更できるようにしたり、左右のスクロールのみ許容する(javascriptが必要?)などするとより良いページになると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/01 11:26

    詳しいコードでの解説までくださり、ありがとうございます。
    無事解決いたしました。

    キャンセル

+1

.side-inがfixedつまり親要素に関係なく絶対配置となったときに、いわば親要素の外に出たような状態になります。
fixedを指定した要素自体に幅を指定する必要があります。
もしsideの幅が可変ならば、JavaScriptなどを使用する必要があるかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/01 11:26

    回答ありがとうございます。
    横幅を指定したところ、無事解決いたしました。sideは可変ではないので問題ありませんでした。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • HTMLに関する質問
  • 【コード、画像有】cssの「fixed」を使用することで、レイアウトが崩れる原因を教えていただけませんか。