8

ブログで取り組んでいる新しいテーマで流動的なレイアウトを使用しています。私はよくコードについてブログを書き<pre>、投稿内にブロックを含めます。float: leftコンテンツ領域の列にmax-widthは、列が特定の最大幅で停止し、縮小することもできるようになっています。

+ ---------- + + ------ +
| テキスト| | テキスト|
| | | |
| | | |
| | | |
| | | |
| | | |
+ ---------- + + ------ +
    最大収縮

私が欲しいのは、<pre>要素をテキスト列よりも広くして、水平スクロールバーなしで80文字でラップされたコードを収めることができるようにすることです。<pre>しかし、流動性に影響を与えることなく、要素をコンテンツ領域からオーバーフローさせたいと思います。

+ ---------- + + ------ +
| テキスト| | テキスト|
| | | |
+ ---------- +-+ + ------ + ------ +
| コード| | コード|
+ ---------- +-+ + ------ + ------ +
| | | |
+ ---------- + + ------ +
    最大収縮

ただし、そこmax-widthにオーバーハングを挿入すると、流動性がなくなります。ブラウザをその幅を超えて縮小しても<pre>、列の幅は指定されたままになります。max-width

この最低限のシナリオで問題を再現しました。

<div style="float: left; max-width: 460px; border: 1px solid red">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<pre style="max-width: 700px; border: 1px solid blue">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit
}
</pre>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
</div>

次のいずれかを実行すると、流動性が回復することに気付きました。

  1. <pre>(doh ...)を削除します
  2. を削除しますfloat: left

私が現在使用している回避策は、<pre>要素を投稿列の「区切り」に挿入して、投稿セグメントとセグメントの幅<pre>が相互に排他的に管理されるようにすることです。

+ ---------- + + ------ +
| テキスト| | テキスト|
+ ---------- + + ------ +
+ ------------- + + ------------- +
| コード| | コード|
+ ------------- + + ------------- +
+ ---------- + + ------ +
+ ---------- + + ------ +
    最大収縮

しかし、これ<div>により、意味的に元の状態を維持したいポストマークアップに追加の終了要素と開始要素を挿入する必要があります。

float: left確かに、ボックスモデルがコンテンツが溢れているフロートでどのように機能するかを完全に理解していないため、コンテナ上とその<pre>内部の組み合わせがコンテナの機能を損なう理由がわかりませんmax-width

Firefox / Chrome / Safari/Operaでも同じ問題が発生しています。IE6(クレイジーなもの)はいつも幸せそうです。

これも癖/標準モードに依存していないようです。

アップデート

max-width要素にが含まれている場合は無視されるように見えることを確認するために、さらにテストを行いましたfloat: left。W3Cボックスモデルの章をちらっと見ましたが、この動作についての明確な言及はすぐにはわかりませんでした。ポインタはありますか?

4

4 に答える 4

5

要素に設定margin-right: -240px; float: left;して、<pre>占有する水平方向のスペースをできるだけ少なくし、同時に親<div>要素を でオーバーフローさせることができ240pxます。<p>要素が両側の浮動要素をクリアすることを忘れないでください( clear: both)。以下の完全な例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <title>Solution</title>
    </head>
    <body>
        <div style="float: left; background-color: cyan; max-width: 460px;">
            <p style="background-color: magenta; clear: both;">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit.
            </p>
            <pre style="float: left; max-width: 700px; 
                background-color: yellow; margin-right: -240px;">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit
}
            </pre>
            <p style="background-color: magenta; clear: both;">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit.
            </p>
        </div>
    </body>
</html>
于 2010-04-25T13:11:38.977 に答える
1

これであなたが探していることを実行できるはずですが、その場で機能させるには少し調整する必要があるかもしれません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>Test</title>
        <style type="text/css" media="screen">
            body
            {
                margin: 0;
                padding: 0;
            }
            #wrapper
            {
                float: left;
                width: 100%;
            }
            #content
            {
                float: left;
                width: 100%;
                max-width: 500px;

                margin: 0;
                padding: 0;

                font-family: "Trebuchet MS", sans-serif;
                font-size: 12px;
            }
            #content-pad
            {
                margin: 50px;
                padding: 50px 0 40px 50px;
                background-color: #CCC;
            }

            p, pre
            {
                margin: 0 50px 10px 0;
                line-height: 1.6em;
            }

            pre
            {
                padding: 20px;
                width: 560px;

                background-color: #333;
                color: #FFF;
            }
        </style>
    </head>
    <body>
        <div id="wrapper">
            <div id="content">
                <div id="content-pad">
                    <p>Fusce euismod nunc vitae orci vestibulum adipiscing. Nam id quam libero, sed convallis elit. Etiam interdum, urna et imperdiet euismod, nisi erat commodo elit, sed convallis magna est quis sem. Fusce tempor aliquet est, et ornare eros vulputate et. Vivamus arcu augue, pretium vel fermentum in, gravida sed elit. Vestibulum ut ligula ac quam hendrerit ullamcorper. Phasellus id justo augue. Integer a eros ante. Vivamus sapien mi, placerat a viverra pharetra, dignissim sit amet ipsum. Fusce nunc nunc, tempus ut aliquet sit amet, consectetur sed quam. Cras ligula enim, bibendum eget luctus a, convallis sit amet nisl. Nullam in quam in lectus faucibus lobortis vel pulvinar ante.</p>
                    <pre>Here is some code!
We're going to make sure that it has a full eighty characters to play in.
12345678901234567890123456789012345678901234567890123456789012345678901234567890</pre>
                    <p>Nullam in sapien vitae dui tincidunt elementum. Curabitur condimentum vulputate sem ornare pharetra. Fusce in dolor eget neque viverra sagittis a a orci. Vivamus blandit leo eget orci viverra quis hendrerit velit tempus. Donec in erat risus. Nullam scelerisque faucibus ante, ultricies tristique dolor laoreet sit amet. Duis sit amet tortor dolor, vel interdum ipsum. Sed sed nibh vel ipsum commodo cursus. Proin fermentum nunc in velit tincidunt imperdiet sit amet nec neque. Suspendisse neque ante, luctus sit amet pulvinar eu, congue laoreet magna. Aenean sit amet porttitor quam. Mauris hendrerit vulputate tempus. Curabitur mauris magna, laoreet congue rutrum condimentum, condimentum in sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
                </div>
            </div>
        </div>

        <!-- this next element just maintains the margin properly -->
        <div style="clear:both; height: 0; overflow: hidden;"></div>
    </body>
</html>
于 2010-04-25T13:32:22.937 に答える
0

CSS:

pre {
    display: inline-block;
}

Chrome と FireFox で動作するため、少なくとも Opera、Safari、IE8 でも動作すると思われます。

これにより IE6 が壊れる場合は、このセレクターを使用してブラウザーからルールを非表示にすることができます。

div > pre {
    display: inline-block;
}

あなたの例では(余分な文字が追加されています):

<div style="float: left; max-width: 460px; border: 1px solid red">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<pre style="max-width: 700px; border: 1px solid blue; display: inline-block;">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit dfsf sdf sdf sdf sdf
}
</pre>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
</div>
于 2010-04-19T18:30:52.210 に答える
0

これはうまくいくかもしれません

pre {
  position:relative;
  float:left;
  z-index: 1;
}

相対的な位置は、ドキュメント フローからプレを削除することなく、プレを列の寸法から「ポップ アウト」させます。フロートはプレの幅を調整して、そのすべてのコンテンツを含める必要があります。

于 2010-04-19T23:09:25.450 に答える