1

レイアウト要件が非常に厳しい e コマース ページのレイアウトに問題があります。製品説明の横に製品画像を表示し、画像の下に製品に関するオプションの追加情報を表示したいと考えています。幅は全体的なページ レイアウトによって制限されますが、高さは可変です。答えは、「純粋な CSS ではこれを行うことはできません」のようです。

これがモックアップです: デザインのモックアップ

マークされた幅は 372+12+178=562 で、境界線に 8px が残ります。画像と説明の領域には 2 ピクセルの境界線があり、合計 8 ピクセルの水平ピクセルになり、562+8=570 になります。

画像の垂直方向のセンタリングはほとんどソートされていますが、デザインを壊しているのは、オプションの「追加情報」パネルです。このサイトは PHP によって生成されます。この PHP には<div>、製品のデータが利用可能な場合、その追加情報用の がオプションで含まれています。デザインの問題を解決するのに役立つ場合は、「追加情報」要素を常に含めて、空の場合は非表示になるようにスタイルを設定してください。

要件:

  • 商品画像の縦横比は自由です。薄くて背の高いものもあれば、幅が広く短いものもあれば、四角いものもあります。
  • 製品画像は、その領域を水平方向に塗りつぶし、縦横比によって自然にサイズを調整する必要があります。
  • 製品画像は、その領域 (青) の垂直方向の中央に配置する必要があります。追加情報が表示されていない場合、画像は説明領域に沿って垂直方向に中央に配置されます。追加情報が表示されている場合、画像は残りのスペースの垂直方向の中央に配置する必要があります。
  • 追加情報は任意の量のテキストで、製品画像領域の下部に配置できます。したがって、高さを固定することはできません。
  • 商品説明は、任意の量のテキストにすることができます。
  • 「画像と追加情報」列は「説明」列のサイズと垂直方向に一致する必要があり、その逆も同様です。
  • 説明と追加情報ボックスは、CSS グラデーションの背景と境界線を採用しています。これらすべての div は、実際にはそれに応じてサイズを調整する必要があります。ここで説明されているように、「偽の列」を回避することはできませんhttp://www.alistapart.com/articles/fauxcolumns/
  • 要素の配置に Javascript を使用したくない。はい、私たちは皆 jQuery の達人であり、素晴らしいツールだと確信していますが、このレイアウトには必須ではありません。

これまでの私のデザインでは純粋な CSS を使用し、テーブルは使用せず、table-cell スタイルを使用して画像を中央に配置していますが、異なるサイズの画像を使用すると壊れる min-height に関係する混乱があります。jsfiddle: http://jsfiddle.net/GJVbX/

このフィドルは、たとえば、製品説明のテキスト コンテンツを 3 倍にしたり、「幅: 370px; 高さ: 400px;」を追加したりすることで簡単に破られます。それは良い高さではありません。

うまく機能する私のデザインの例:

うまく機能しているライブサイトのスクリーンショット

ただし、それを破る画像サイズを見つけるのは難しくありません。

ライブ サイト ブレークのスクリーンショット

背の高い製品画像によって画像 div が垂直に拡張され、説明列が追いつかないことに注意してください。

私は Freenode の #css IRC チャンネルに参加したことがありますが、これは純粋な CSS を使用して可能であると言われました。センタリング 「display: table-cell」を使用する必要があります。しかし、彼らは非常に役に立ちましたが、議論は複雑すぎて IRC を続けることができませんでした。<table>正確なページレイアウトのために単純に壊れているあらゆる種類の恐ろしいレイアウトメカニズムをもたらすことは理解していますが、主に列を同じ高さに保つ必要があるため、より良い解決策は考えられません.

建設的な批判、代替の解決策、または私の窮状の確認だけでも感謝します:)

編集- 上記の jsfiddle の HTML および CSS コンテンツは、stackoverflow の質問に含まれるこのコンテンツを好む人向けです。これはライブ サイトから抽出され、インデントのために少しクリーンアップされ、ダミーの製品画像 (ライブ サイトで使用されているサムネラー スクリプトによって生成されます) とダミーのテキストが含まれています。

HTML:

<div class="productInfo">
  <div class="productTopWrapper">
    <div class="productImgWrapper"><div class="wraptocenter"><span></span><img src="http://nickfenwick.com/hood.jpg"></div></div><div class="extraInfoWrapper gradientBackground"><div class="extraInfoInner">Extra info goes here.</div>
      </div>
      <div class="productDescription gradientBackground"><div class="productDescriptionInner">
          Product Description goes here.<br/>
          Product Description goes here.<br/>
          Product Description goes here.<br/>
          Product Description goes here.<br/>
          Product Description goes here.<br/>
          Yet the gradient ends too soon because this div doesn't fill its space vertically!
          </div>
      </div>
    </div>
</div>

CSS:

DIV.productInfo {
    max-width: 570px;
    font-family: Verdana,Geneva,'DejaVu Sans',sans-serif;
    font-size: 12px; /* Just for this fiddle */
}
.productInfo .productTopWrapper {
    overflow: hidden;
    margin-bottom: 12px;
    position: relative;
}
.productInfo .productImgWrapper {
    width: 372px;
    min-height: 353px;
    float: left;
    border: 2px solid #cbcbcb;
    text-align: center;
}

/* BEGIN css wrap from http://www.brunildo.org/test/img_center.html */
.wraptocenter {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    width: 372px;
    height: 309px;
}
.wraptocenter * {
    vertical-align: middle;
}
/*\*//*/
.wraptocenter {
    display: block;
}
.wraptocenter span {
    display: inline-block;
    height: 100%;
    width: 1px;
}
/**/
*:first-child+html {} * html .wraptocenter span {
    display: inline-block;
    height: 100%;
}

/* END css wrap */

.productInfo .extraInfoWrapper {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 376px;
}
.productInfo .extraInfoInner {
    padding: 5px;
    border: 2px solid #cbcbcb;
    text-align: center;
}

.productInfo .gradientBackground {
    background: #999; /* for non-css3 browsers */

    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d0d1d3', endColorstr='#fefefe'); /* for IE */
    background: -webkit-gradient(linear, left top, left bottom, from(#d0d1d3), to(#fefefe)); /* for webkit browsers */
    background: -moz-linear-gradient(top, #d0d1d3,  #fefefe); /* for firefox 3.6+ */
    background: -ms-repeating-linear-gradient(top, #d0d1d3,  #fefefe);
    background: repeating-linear-gradient(top, #d0d1d3,  #fefefe);
}.productInfo .productDescription {
    width: 178px;
    min-height: 353px;
    margin-left: 388px;

    border: 2px solid #cbcbcb;
}
.productInfo .productDescriptionInner {
    padding: 5px;
    font-size: 1.2em;
    line-height: 1.2em;
}
4

3 に答える 3

1

残念ながら、サポートする必要のあるIEのバージョンは、CSS3の目玉だけではありません。display: table-cellたとえば、IE7では使用できません。また、IE7およびIE8には、他のブラウザーに存在する無数の他のものが欠落しているか、バグがあります。ただし、IE9はかなりの改善です。

正直なところ、すべてのブラウザーの最新バージョンに制限している場合でも、IRCの人々が主張するものが何であれ、このレイアウトは純粋なCSSでは依然として困難です。フレキシブルボックスやグリッドレイアウトなどの新しいレイアウトマネージャーがどこでも利用できるようになると、それは簡単になりますが、それから数年は離れているのではないかと思います。

とにかく、これがあなたの必要なレイアウトでの私の試みです:

http://jsfiddle.net/amtiskaw/tNywn/

display: table-cell製品画像を垂直方向に中央揃えするために使用するため、IE8以降が必要です。また、境界線は正しく見えますが、extra-infoボックスのコンテンツがproduct-infoボックスのコンテンツと垂直方向に重ならないという癖もあります。

引き伸ばされた境界線とグラデーションは、絶対配置を使用して製品コンテナ要素を垂直に埋めるようにサイズ設定され、負のzインデックスを使用してコンテンツの後ろに配置される追加の要素を使用することによって実現されます。

個人的には、この場合、この種のCSSハッカーではなく、テーブルまたは少しのjQueryを使用してサイズを正しく設定したいと思います。role="presentation"テーブルを使用する場合は、表形式のデータを表現するのではなく、レイアウトの目的で使用されていることをスクリーンリーダーやその他のセマンティックツールに示す属性をテーブルに与えることができます。このパターンはW3Cによって承認されました

于 2012-09-13T02:26:32.330 に答える
1

これは、負のマージンを設定した背の高い高さで行うことができます。(高さから div の最小高さを差し引いたもの、この場合は 353px) 唯一の問題は、ボーダーの下部が親のオーバーフロー (非表示のままにする必要があります) に消えることです。国境があなたにとってどれほど重要か、あるいはそれがあなたが探していたものであるかどうかさえわかりませんが、おそらくそれはあなたを正しい方向に向けるかもしれません?

.productInfo .productDescription {
    width: 178px;
    min-height: 353px;
    margin-left: 388px;
    border: 2px solid #cbcbcb;
    height: 1000px;
    margin-bottom: -647px;
}
于 2012-09-13T00:01:39.897 に答える
0

しばらく前にこの問題が発生したことを覚えており、最終的に JS に頼って解決しました。残念ながら、あなたが持っている制約により、純粋な CSS で動作する例を考え出すことが非常に難しくなっています。私が見ている問題は、画像のサイズが大きくなるとすぐに、含まれている div が特定の幅または高さを持たなくなり、CSS だけでは説明 div を正しい高さに拡張するために必要な計算を行うことができないことです。サイズが変更される要素が直接の親ではない場合、ブラウザーはこれを自動的に行いません。親の子は高さ/幅の変更前の高さのままになります。

はい、テーブルは行の高さを固定することで問題を解決しますが、あなたが言うように、それらは私が可能な限り避けようとする価格で提供されます.

JS / Jquery を使用してこの問題を解決することを検討したことがあると思います。

JQuery の例

$(function()
{
    var height = $('.productImgWrapper').innerHeight();

    $('.productDescription').css('height', height);
});

.innerHeight()パディングは含まれますが、ボーダーやマージンは含まれないことに注意してください。ボーダーを含めるには、 を使用します.outerHeight()

理想的ではないことはわかっていますが、問題を解決する他の方法がわかりません。たぶん、私が解決策を思い付くよりも高い CSS パワーを持っている人がいるでしょう。

于 2012-09-12T07:31:43.590 に答える