0

私の数学は衝撃的で、できません。私の人生では、この計算を機能させることができません。ユーザーが任意の数のグリッド列 (デフォルトでは 12 個)、これらの列の間のガター、列の周囲の最大幅、およびその合計幅内のマージンを指定できる CSS グリッド システムを作成しています。期待される結果は、各列幅のパーセンテージ幅と、すべての列の左マージンのパーセンテージです。

以下のデフォルトを使用すると、最大幅は 1200px になり、左右の内側の余白は 20 になり、グリッドの最大許容スペースの内側の幅は 1160 になります。それは理にかなっていますか?

ちなみに私が使っているのはSASSです。コード内のコメントを見て、現在機能しているものと機能していないものを確認してください。

jsFiddle のコードは次のとおりです: http://jsfiddle.net/mrmartineau/fMeBk/

$gridColumnCount      : 12;   // Total column count
$gridGutterWidth      : 40;   // [in pixels]
$gridColumnPadding    : 30;   // [in pixels]
$gridMaxWidth         : 1200; // [in pixels]
$gridMargin           : 20;   // [in pixels] Space outside the grid

@function gridColumnWidth() {
    @return $gridMaxWidth / $gridColumnCount;
}
// Grid calculations
@function gridColumnWidthCalc($colNumber) {
    // Is correct
    @if $gridGutterWidth == 0 {
        @return percentage($colNumber / $gridColumnCount);
    }
    // Is incorrect
    @else $gridMargin > 0 {
        @return percentage( (($colNumber / $gridColumnCount) - gutterCalc(false) ) );
    }
}

@mixin columns($columnSpan: 1) {
    width: gridColumnWidthCalc($columnSpan);
}
@function gutterCalc($showUnit: true) {
    @if $showUnit == true {
        @return percentage( $gridGutterWidth / ( $gridMaxWidth - ($gridMargin * 2) ) );
    } @else {
        @return $gridGutterWidth / ( $gridMaxWidth - ($gridMargin * 2) ) * 100;
    }
}

@mixin gridColumn() {
    @if $gridGutterWidth > 0 {
        margin-left: gutterCalc();
    }
    @if $gridColumnPadding > 0 {
        padding: $gridColumnPadding + px;
    }
    float: left;
    min-height: 30px;
    position: relative;
    clear: none;
    &:first-child {
        margin-left: 0;
    }
    background-color: pink;
    border: 1px solid red;
}
@for $i from 1 to $gridColumnCount + 1 {
    .span#{$i}  { @include columns($i); }
}

.container {
    padding-left: $gridMargin + px;
    padding-right: $gridMargin + px;
    max-width: $gridMaxWidth + px;
}

.col {
    @include gridColumn();
}


​
4

3 に答える 3

8

さて、コメントのないコードを理解するのに 1 時間かかりました。

まず第一に、グリッド単位としての「列」と実際の要素としての「列」の間にはあいまいさがあります。以下では、後者を「ブロック」と呼んでいます。

行の最初のブロックのガターを正しくオーバーライドしています。したがって、ガターの総数は、行内のブロックの数よりも 1 つ少なくなります。

しかし、ブロック幅を計算するときは、ブロックよりガターが少ないことを考慮せずに、すべての列からガターを差し引いています。

したがって、ブロックの幅を比例して減らす必要があります。

作業ソリューション:

// Accepts a number of columns that a block should span.
// Returns a percentage width for that block.
@mixin columns($columnSpan: 1) {
    $number-of-blocks-in-container: $gridColumnCount / $columnSpan;
    $total-width-of-all-gutters:    gutterCalc(false) * ($number-of-blocks-in-container - 1);
    $total-width-of-all-blocks:     1 - $total-width-of-all-gutters;
    $width-of-a-single-block:       $total-width-of-all-blocks / $number-of-blocks-in-container;

    width:                          percentage( $width-of-a-single-block );
}

今、あなたの車輪が転がっています!実際の動作をご覧ください: http://jsfiddle.net/fMeBk/46/ブラウザーはパーセンテージ値をわずかな誤差で切り上げるため、グリッドの配置がピクセル単位で完全ではない可能性があることに注意してください。ところで、この丸め誤差の視覚効果を最小限に抑えるには、行の最後のブロックを右揃えにする必要があります。

おい、あなたのコードアーキテクチャは非常に間違っており、あなたのアプローチには多くの欠点があります. 必要に応じて名前を付けます。

Susy さん、もう一度試してみてください。これは SASS の素晴らしい作品であり、SASS のテクニックを学ぶための優れた情報源でもあります。そのソース コードは十分にコメントされており、GitHub で入手できます。

Susy に欠けているグリッド フレームワークの機能は何ですか?

スージーはあなたのやりたいことができると断言します。タスクを説明するだけで、Susy を活用したエレガントなソリューションを考え出そうとします。

PS 実験を思いとどまらせようとしているわけではありません。練習は完璧を作る!実験必要であり、あなたは素晴らしい仕事をしています。私が伝えようとしているのは、間違った場所に行かないように、良い例に従い、良い慣行を採用する必要があるということです.

PPS 私の評価を返してください。私はあなたを助けるために多くの個人的な時間を費やしましたが、あなたは私の答えを差し引いてしまいました. :(

于 2012-11-26T22:13:57.327 に答える
0

少し前に、単純な SASS パーセンテージ ベースのグリッド ジェネレーターをまとめました。あなたが探している数学はここにあります:

https://github.com/jordancooperman/simple_grid/blob/master/assets/css/scss/partials/_grid.scss

プロジェクトに含まれているマークアップを使用している場合にグリッドが表示されるように、そこにある css の一部は表示のみを目的としています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-12-19T16:02:42.943 に答える
0

あなたは特定の質問を述べていませんでした.それはStackOverflowのルールに反しています.

また、フレームワークの構造に関する説明がないと、各関数と mixin で何を達成しようとしているのかを正確に理解するのは困難です。

どのように支援すればよいでしょうか?

とにかく、あなたのアプローチは2つの理由で間違っています:

  1. あなたは車輪を再発明しようとしています。すでに数十のグリッド フレームワークがあります。
  2. 非セマンティックなアプローチを使用しています。HTML でスタイル固有のクラスを適用してスタイリングしています。代わりに、クラスはセマンティック (つまり、ブロックの外観ではなく機能を記述する) である必要があり、スタイリングは CSS でそれらのクラスに適用する必要があります。SASS を使えば、とても簡単です。

解決策: Susyを使用します。これは素晴らしいソフトウェアであり、その作者である Eric Meyer は StackOverflow で非常に反応が良いです。

Susy を使用すると、コードは次のようになります。

HTML:

<div id="container">
        <div id="gallery">
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
        <div id="promos">
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
        <div id="footer">
            <div id="bottom-menu"></div>
            <div id="partners"></div>
            <div id="social-buttons"></div>
        </div>
        <div>
            <div class="col span12"></div>
        </div>
</div>

サス:

//////////
// Imports
//////////

@import susy


//////////
// Defining variables
//////////

// Main grid properties
$total-columns  : 12      // Number of columns
$container-style: fluid   // The grid should stretch
$max-width      : 1200px  // But not wider than this

// Proportions between column width and gutter between columns
$column-width   : 85%     
$gutter-width   : 100% - $column-width

// Setting margins around the grid
$grid-padding   : 1em     // This will remain absolute
$container-width: 100%    // If you want relative margins, change this instead


//////////
// Applying containers and columns
//////////

// Setting containers in all immediate children of #container
#container > *
  +container /* ← Actual Susy magic! :D */
  max-width: $max-width

// Setting columns
#gallery > *
  +span-columns(1)
  &:last-child             // The last column should be marked with "omega"
    +span-columns(1 omega) // to compensate browsers' calculation errors

#promos > *
  +span-columns(2)
  &:last-child
    +span-columns(2 omega)

// #footer
#bottom-menu
  +span-columns(6)

#partners
  +span-columns(4)

#social-buttons
  +span-columns(2 omega)

申し訳ありませんが、私はこのコードをテストしていません。エラーが含まれている可能性がありますが、それでもアイデアを見ることができます。

Susy では、レスポンシブ グリッドを簡単に作成することもできます。そして、Susy が Compass のデフォルトのグリッド エンジンになると言われています。

UPD: この質問の横にある質問固有の回答を参照してください。

于 2012-11-26T14:24:46.260 に答える