2

私はスージーを使用しています。

content-first アプローチの活用に失敗し、window-px-widths-first を使用することにしました

最初はグリッドに対してコンテンツ ファーストのアプローチを試みましたが、すぐにサイトがさまざまなデバイスで予期しない動作をすることに気付きました。タブレットレイアウトなどが必要な場所にモバイルレイアウトが表示されます。特定の画面幅(px値)に一致するように、Susy設定のem値を調整することになりました。コードが醜くなり、実際にはコンテンツファーストのアプローチを使用していないことに気付きました。

これは、この不完全なアプローチを使用して作成したサイトのホームページの静的なスナップショットと、そのコードスナップショットです。

そこで、コンテンツ優先のアプローチを完全に破棄し、最初に px 値を使用することにしました。

コードを書く前に、グリッドの要件を策定しました

まず、さまざまなデバイスを画面サイズでグループ化しました。次に、これらのデバイス グループに最も適したブレークポイントの px 値を考え出しました。

Break-    Layout   Number of            Common
points     name     columns             usage
(px)               (sample)

    0  ┬
       │
       │     S        1       Smartphones-portrait, old phones
       │
   400 ┼
       │     M        2       Smartphones-landscape
   600 ┼
       │     L        3       Tablets-portrait
   800 ┼
       │     XL       4       Tablets-landscape, netbooks
  1000 ┼
       │    XXL       5       Laptops, desktop computers
  1200 ┼
       ↓

次の前提/要件があると思います。

  1. Window-px-widths-first アプローチ (上記で説明)。

  2. $container-style は流動的です。画面の幅が 2 つのブレークポイントの間のどこかにある場合、コンテナーの幅は、より大きなブレークポイントに一致するように自動的に調整されます。レイアウト内の列数は変更されず、下のブレークポイントに対応します。

  3. 最後のブレークポイントはコンテナの最大幅です。サイトはそれ以上伸びることはなく、代わりにガターが追加されます。

  4. モバイルファースト。「S」レイアウトから始めて、画面が広くなるにつれて他のレイアウトでオーバーライドします。

よく考えた後、私のアプローチは次のコードに進化しました

(このコードは合成例です。実際のコードから抜粋し、いくつかの適応を行ったので、何かが欠けていたり、矛盾している可能性があります。)

<div id="header-wrapper">
  <header id="header">
    ...
  </header>
</div>

<div id="main-wrapper">
  <div id="main">

    <article id="content">...</article>
    <aside id="sidebar">...</aside>

  </div>
</div>

<div id="footer-wrapper">
  <footer id="footer">
    ...
  </footer>
</div>
/////////////
// Variables
/////////////

$development: true // This enables susy-grid-backgrounds and outlines

// Breakpoints
$bp-s-m:    400px
$bp-m-l:    600px
$bp-l-xl:   800px
$bp-xl-xxl: 1000px
$max-width: 1200px

// Columns
$cols-s:   1
$cols-m:   2
$cols-l:   3
$cols-xl:  4
$cols-xxl: 5

// Layouts
// $layout-s is not necessary due to a mobile-first approach
$layout-m:    $bp-s-m     $cols-m
$layout-l:    $bp-m-l     $cols-l
$layout-xl:   $bp-l-xl    $cols-xl
$layout-xxl:  $bp-xl-xxl  $cols-xxl

// Default grid settings
$total-columns:   $cols-s
$column-width:    85%
$gutter-width:    100% - $column-width
$grid-padding:    1em
$container-width: 100%
$container-style: fluid
+border-box-sizing


/////////////
// Mixins
/////////////

// A couple of mixins to open the developer's third eye
=dev-outline
  @if $development
    outline: 1px solid red
=dev-grid-bg
  +dev-outline
  @if $development
    +susy-grid-background

// A custom container declaration
=standard-container
  +container // ← An actual line of Susy code, yay! :D
             //  This whole post is actualy an attempt to make use of it.
  max-width: $max-width
  +dev-grid-bg

  +at-breakpoint($layout-m)
    +set-container-width
    +dev-grid-bg

  +at-breakpoint($layout-l)
    +set-container-width
    +dev-grid-bg

  +at-breakpoint($layout-xl)
    +set-container-width
    +dev-grid-bg

  +at-breakpoint($layout-xxl)
    +set-container-width
    +dev-grid-bg


/////////////
// Backgrounds
/////////////

// The wrapper divs are necessary for screen-wide backgrounds
html
  background: url('../images/main-background.png') // also repeat, color, this kind of stuff

#header-wrapper
  background: url('../images/header-background.png') 

#footer-wrapper
  background: url('../images/footer-background.png')


/////////////
// Containers
/////////////

// Actually declared in separate SASS files
#header, #main, #footer
  +my-container


/////////////
// Columns
/////////////

// An example of declaring columns
$cols-sidebar: 1
#sidebar-first
  +dev-outline
  +at-breakpoint($layout-l)
    +span-columns($cols-sidebar, $cols-l)

  +at-breakpoint($layout-xl)
    +span-columns($cols-sidebar, $cols-xl)

  +at-breakpoint($layout-xxl)
    +span-columns($cols-sidebar, $cols-xxl)
#content
  +dev-outline
  +at-breakpoint($layout-l)
    +span-columns($cols-l - $cols-sidebar omega, $cols-l)

  +at-breakpoint($layout-xl)
    +span-columns($cols-xl - $cols-sidebar omega, $cols-xl)

  +at-breakpoint($layout-xxl)
    +span-columns($cols-xxl - $cols-sidebar omega, $cols-xxl)

これは、このアプローチを使用して作成したサイトのホームページの静的なスナップショットと、そのコードのスナップショットです

質問

  1. window-px-widths-first アプローチに従うのは私の意図的な決定であり、次の質問に与えられます。content-first に対するあなたの議論に感謝しますが、私が間違っていると言うことにとどまらず、window-px-widths-first に固有の次の質問に答えてください。

  2. 私のアプローチは、Susy で window-px-widths-first を実行するエレガントな方法ですか、それとも醜いコードですか?

  3. コードをより優雅にするにはどうすればよいですか?

    すべてのコンテナーとすべての列に対して繰り返さなければならない多数のブレークポイント宣言が好きではありません。に複数のレイアウトを指定するという、あまり文書化されていない可能性を使用することしか考えられませんでした+container+set-container-widthしかし、すべてのメディア クエリ内で実行する唯一のコードではない限り、そのアイデアでさえオプションではありません。:(

  4. Susy で window-px-widths-first を使用する (および上記の要件を満たす) 推奨される方法は何ですか?

  5. あなたが見つけた私のコードの欠点を明らかにしてください。私はSASSの初心者ですが、同じことをより効率的に行う方法を提案できると確信しています。

4

1 に答える 1

6

悪くはありませんが、クリーンアップできることがいくつかあります。

まずは設定。単一の列に Susy を使用しても意味がないため、小さなグリッドを完全に削除し、手動で作成して (パディングのみ)、よりクリーンなコードにすることができます。複数の列を追加すると、現在の設定はあまり意味がありません。85% で 2 列、ガターは 15% ですか? これにより、最大 185% の幅になります。Susy は実際には数値自体よりも数値間の比率に関心があるため、これは機能しますが、少し醜いです。たとえば85pxand15pxまたは8.5emandに変更し1.5emます。とにかくコンテナをオーバーライドしているので、何も変わらないはずです-もう少し賢明です。

私が行うもう1つの主な変更は、とにかく幅が100%流動的なオーバーライドであるため、すべてのset-column-width呼び出しを削除することです。毎回 100% の幅を設定するだけです。なぜわざわざ?それが邪魔にならないように、ブレークポイントを介した単純なループで dev-background 呼び出しを自動化できると思います。

$layouts: $layout-m $layout-l $layout-xl $layout-xxl
@each $layout in $layouts
  +at-breakpoint($layout)
    +dev-grid-bg

さまざまなブレークポイントで列スパンを変更するためのショートカットを作成することは、あなたの側でも私たちの側でも困難であり、実際に各サイズで行っている唯一の変更でない限り、かなりの量の出力の肥大化を追加します. あなたが現在持っているものは良さそうです。

于 2012-11-19T20:56:31.737 に答える