2016-02-04 4 views
14

私は水平方向にスクロールしたいブートストラップコンテナにとcodeというタグをいくつか入れています。これは通常、スッキリフッターを実現するために私のページのbodyにflexboxを追加するまで正常に動作します。この後、codeは、ページが狭い場合(モバイル閲覧の場合など)、水平方向にスクロールしなくなりました。水平プレ/コードスクロールとのFlexboxの互換性

ここで(ウィンドウを狭めるようcode水平スクロールバーが消えることに注意してください)私のコードです:

html, body { 
 
    height: 100%; 
 
} 
 
body { 
 
    min-height: 100%; 
 
    display: flex; 
 
    flex-direction: column; 
 
} 
 
code { 
 
    max-height: 200px; 
 
    background-color: #eeeeee; 
 
    word-break: normal !important; 
 
    word-wrap: normal !important; 
 
    white-space: pre !important; 
 
} 
 
.flexer { 
 
    flex: 1; 
 
} 
 
footer { 
 
    background-color: #CCC; 
 
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/> 
 
<div class="container"> 
 
    <div class="row"> 
 
     <div class="col-md-12 docs"> 
 
      <p>Some sample code</p> 
 
      <pre><code>Loading mirror speeds from cached hostfilebase: mirrors.arpnetworks.com * centosplus: mirrors.arpnetworks.com* extras:mirrors.arpnetworks.com*rpmforge: mirror.hmc.eduupdates: mirrors.arpnetworks.comExcluding Packages in global exclude list</code></pre> 
 
     </div> 
 
    </div> 
 
</div> 
 
<div class="flexer"></div> 
 
<footer> 
 
    <div class="container"> 
 
     <div class="row"> 
 
      <div class="col-sm-12 text-center"> 
 
      footer 
 
      </div> 
 
     </div> 
 
    </div> 
 
</footer>

http://jsfiddle.net/nturor46/1/

粘着性のためのフレキシボックスを使用するには、どのように任意のアイデアは、スクロールしながらフッターを維持するpre/code

+1

今後、質問自体にコードを含めてください。そうしないとJSFiddleへのリンクを含めることはルールに反します。 – TylerH

+0

@TylerH、それは私が私の答えからそれを削除した同じ理由でスニペットを含んでいない可能性があります:それは動作しません。コードはフィドルのデモで動作しますが、SOの断片で破損し、問題(または私が提案する解決法)を再現しません。 –

+0

@Michael_BこのコードはJSFiddleと同じようにStack Snippetで同じように動作し、問題を再現します。どのブラウザを使用していますか?いずれにしても、コードは依然として問題にある必要があります。スタックスニペットでそれを持つのはちょうど余分です。 – TylerH

答えて

5

シンプル

.container { width:100%; } 

は正しくウェブサイトのサイズを変更します。しかし、Chromeでは実際にはスクロールバーを使用できません。これは、BODY以外のすべてのコンテナのサイズがオーバーフローしたために発生します。 したがって、我々は正しく前のノードを認識するようにブラウザに指示奨め:

.container { 
    max-width: 100%; 
} 
pre { 
    position: relative; 
} 

これは正しく、再びマウスイベントを処理するためにChromeを告げるとレイアウト

を修正pre -nodeのマージン下の点に注意してください。あなたのレイアウトが奇妙に見えるオーバーフロー - 国で失われます。 max-widthは、それがブートストラップで作られた固定幅ステートメントを上書きしないことを確認するために、最終的なバージョンで使用された

PS:現在のChromeでテストし、Firefoxのhttp://jsfiddle.net/nturor46/32/

+0

あなたの '.container {width:100%; } 'Chrome&FFで、うまく動作します。スクロールバーにアクセスできます。私は 'max-width'と' position:relative'の必要性を見ません。あなたの答えの最初の2行がすべて必要であるように見えます。 –

+1

@Michael_B彼のフィドルを編集してもう一度やり直すだけで問題は見えません。 Chromeは明らかに作業バージョンをキャッシュします。フィドルを更新し、ハードリフレッシュを行い、スクロールバーを使用しようとすると、なぜ彼が 'position:relative'を追加したのかがわかります。あるいは、あなたは[this one](http://jsfiddle.net/nturor46/38/)を見ることができます。 – DoctorDestructo

+0

@DoctorDestructo、ありがとう。 –

1

以下のように、prevタグとその内容をdivで囲みます。

<div class="code">{your code goes here}</div> 

CSS:

.code{ 
    width:92vw; /*you can change this in media query to specific device width for better results*/ 
    overflow-x:auto; 
} 

Working jsfiddle link

+0

'width:92vw'を使うと、' code'ボックスのサイズが、ページが拡大縮小されたときに他のコンテンツと一致しないので、うまくいきません。 –

+0

サイドバー付きのフィドルです。私はページがサイズ変更されたときにサイドバーに流出しないように、ちょうど正しいサイズの 'code'ボックスを得る方法がわかりません。 http://jsfiddle.net/jhalterman/nturor46/9/ –

2

ここで何が起こるには、Chromeの最も確実バグです。

あなたのフィドルで遊んだ後、他のブラウザで見ると、これはChrome固有の問題だと判断できます。そして興味深いもの。

何らかの理由で、<div class="col-md-12 docs">は、それが(pと一緒にpreの高さ)が必要ですが、preタグ内に水平スクロールバーを考慮していない大きさに成長します。

ここに問題を示す画像があります。赤い背景の部分がコンテナです。

Chrome bug

preが一番下に広い1ピクセルの境界線を持っているので、結果はあなたが実際にスクロールバーを使用するための1pxのギャップを残します。あなたはそれを自分で試すことができます。スクロールバーの一番上の1px行を取得しようとします。

flexプロパティを削除しても問題は解決しますが、これは受け付けません。

ここでは、親の一番下に0.1pxのパディングを追加すると問題が解決すると思っていたが、そうはならなかった。私はその後、クラスchromefixdivpreタグをラップしようとしたし、次のCSS

.chromefix{ 
    overflow: hidden; 
} 

を追加しましたしかし、それはコンテナが約50%をスクロールバーで育ったにも奇妙な状況を作成し

enter image description here

私は2つを組み合わせてみましたが、違いはありませんでした。

ここから、preタグとそのプロパティを調べ始めました。 Bootstrapのデフォルトではoverflow: autoです。だから私が試みたのは、追加することだった

pre{ 
    overflow-x: scroll !important; 
} 

そして、出来た!

だから、overflow-x: scroll !imporantpreに追加すればいいですよ!ここには​​があります。

希望します。

脇の下として。 max-height: 200pxpreにも移動したいと思います。 codeに適用しても機能しません。

+1

"働くフィドル"は動作しません –

+0

'.container'に' width:100% 'を追加すると動作します。 O.P.が[コメント](http://stackoverflow.com/a/35196624/2759272)でサイドバーを追加しようとしているので、 'display:flex'を' .row'に追加したいかもしれません。 – DoctorDestructo

+0

@JörnBerkefeldどのブラウザをお使いですか?それは私のために働いています –

2

これらのブートストラップスタイルは、自然なCSSに大きな打撃を与えます。

問題は、columnのフレックスコンテナとブートストラップのルールの間に矛盾があるようです。コンテンツボックスが画面をオーバーフローすると、基本的に水平スクロールバーがpre/codeコンテンツボックスからブラウザウィンドウに移動します。これらの調整で

は、ご希望のレイアウトが動作しているようです:

  • .containerは(あなたのコードでは、この役割はbody要素によって演奏される)主要フレックスコンテナをDIV
  • 移動footer要素作ります下
  • オーバーライドブートストラップmarginpaddingにフッターを固執するには、この新しいコンテナ
  • 使用flex auto marginsへそしてwidthどこ必要

HTML

<div class="container"> 

    <div class="row"> 
     <div class="col-md-12 docs"> 
      <p>Some sample code</p> 
      <pre><code>Loading mirror speeds from ... cached hostfilebase</code></pre> 
     </div> 
    </div> 

    <footer> 
     <div class="container"> 
      <div class="row"> 
       <div class="col-sm-12 text-center"> 
        footer 
       </div> 
      </div> 
     </div> 
    </footer> 

</div> 

CSS ChromeとFirefoxで動作確認済み

html, body { height: 100%; } 

body > .container { 
    display: flex; 
    flex-direction: column; 
    height: 100%; 
    width: 100%;      /* override bootstrap styles */ 
    padding: 0;      /* override bootstrap styles */ 
} 

body > .container > .row { 
    margin: 0;      /* override bootstrap styles */ 
    display: flex;     /* nested flex container */ 
    justify-content: center;   /* center content box on page */ 
} 

body > .container > .row > .docs { 
    width: 75%;      /* adjust width of the content box here */ 
} 

code { 
    max-height: 200px; 
    background-color: #eeeeee; 
    word-break: normal !important; 
    word-wrap: normal !important; 
    white-space: pre !important; 
} 

footer { 
    margin-top: auto;    /* stick footer to bottom of container */ 
    background-color: #CCC; 
} 

Revised Fiddle

+0

これは(ブートストラップ)のデザインを上書きします –

+0

@JörnBerkefeld、私の友人、あなたの答えはブートストラップにも優先します。デフォルトでは、divは 'width:100%'ではないでしょうか? (あなたのことは良い答えではありません。) –

+0

実際にはブートストラップのルールを上書きしません。なぜならこれらのレイヤーに対してmax-widthもpositionも定義されていないからです。私はこれが奇妙なブラウザのように見えることに同意すると思います。私のアプローチは、ブラウザに "デフォルトにすべき"ことを思い出させます;-) –

2

問題が<pre>の幅であるように思われます。

画面の幅が768px以下になると、.containerには特定の幅が適用されないため、問題が発生しています。

画面の幅が768pxより大きい場合は、次のクラスからbootstrap.cssが表示されます。

@media (min-width: 1200px) 
.container { 
    width: 1170px; 
} 
@media (min-width: 992px) 
.container { 
    width: 970px; 
} 
@media (min-width: 768px) 
.container { 
    width: 750px; 
} 

幅が768px下回る一度あなたが見ることができます与えられた具体的な幅がないので。

この問題に対処するには、このようなCSSを記述する必要があります。

@media (min-width: 480px) { 
.container { 
     width: calc(100% - 40px); 
    } 
} 

は基本的には、画面の幅が768px下回ると.containerのための幅を指定する必要があります。一度すると、問題が修正されます。

+0

私はこれを変更しようとするのではなく、現在の動作を拡張するだけなので、私はこの答えが好きです。しかし、実際には狭い幅でも失敗しますが、それ以上の幅を追加することで問題を解決できると確信しています。それはまた、Chromeのバグ[ここ](http://stackoverflow.com/a/35397304/2759272)と[ここ](http://stackoverflow.com/a/35305829/2759272)(またfixable)に苦しんでいます。 – DoctorDestructo

+0

@DoctorDestructoメディアクエリーを編集するだけで、狭い幅の問題を修正できます。私は480px以下の可能性を扱っていませんでした。なぜなら、あなたはそのような状況に直面するでしょうか? –

+1

私は確かに私のブラウザウィンドウを480px以下に狭めることができます。 – DoctorDestructo