4

我刚刚开始使用 Drupal、Omega 4 主题的响应式设计技术,并且想使用奇异网格系统。我不太了解 CSS(基本原则是的,微妙之处不是),而 SASS 似乎是逃避一些更神秘的特性的好方法(有点像 jQuery 帮助你避免使用 Javscript)。因为我真的是一个初学者,所以我想我会从一个尽可能简单的虚拟页面开始。所以,这里是 HTML:

<html>
  <head>
    <title>Singularity HTML Demo</title>
    <link rel="stylesheet" href="stylesheets/test-grid_1.css">
  </head>
  <body>
    <div id="page">
        <h1>Page tests_1</h1>
        <div id="foo">
            <h2>Foo</h2>
            <p><p>Aliquam nulla metus, laoreet non felis ut, commodo laoreet nulla. </p></p>
        </div>
        <div id="bar">
            <h2>Bar</h2>
            <p>Morbi volutpat justo ante, et laoreet est porttitor id. Nullam rhoncus ipsum leo, sed tincidunt ante consequat in.</p>
            <p>Quisque porttitor tincidunt hendrerit. Nulla et urna nisi. Fusce vulputate aliquet posuere. Cras tempor ante vel turpis scelerisque mollis. In bibendum augue in tincidunt vulputate. Donec accumsan sapien et molestie sodales. Maecenas ut arcu et arcu congue rhoncus. Suspendisse potenti. Nulla vehicula est ut ante semper lobortis. Maecenas sit amet porta mi, nec mattis dui. Curabitur tempus, magna a volutpat auctor, tellus diam pretium sapien, a accumsan augue lectus et est. Quisque sollicitudin metus tincidunt massa fermentum; non varius libero bibendum.</p>
        </div>
        <div id="baz">
            <h2>Baz</h2>
            <div>
                <p>Baz</p>
                <p>Vestibulum quis tristique arcu. Cras nec est aliquet, vehicula dolor sed, fermentum eros. Maecenas et commodo diam. Aenean egestas nulla a dolor aliquet pellentesque. Nunc enim tellus, sagittis sit amet ipsum nec, bibendum dictum nisl. Nam sollicitudin quis orci sed consequat. Nam et imperdiet ipsum, aliquam cursus nulla. Morbi erat magna, rhoncus vel velit vel, sollicitudin imperdiet orci. Quisque posuere at leo in pellentesque. Vestibulum ornare nulla odio, id mollis lorem blandit eget. Donec est sem, adipiscing eu ligula at, blandit lobortis magna. Nam tempus, risus vitae lacinia consectetur, leo orci fringilla arcu, facilisis blandit metus leo eget eros. Donec pellentesque est eget nulla ultricies, nec placerat risus sagittis. Nulla elementum metus nisi, eget sagittis risus commodo vitae. Pellentesque imperdiet porta vestibulum!</p>
            </div>
        </div>
        <div id="qux"><p>Qux</p></div>
        <div id="waldo"><p>Waldo</p></div>
        <div id="garfield"><p>Garfield</p></div>
        <div id="dilbert"><p>Dilbert</p></div>
    </div>

  </body>
</html>

我做了一个 sass 样式表,一开始只是将所有 div 显示在一个列中,一个列在另一个列下,这很有效(不难!)。我想发布一张图片来表达我的意思,但显然我不能!

然后,我尝试添加断点并尝试修改 sass 代码,使其显示在 2 列网格上,每个 div 交替显示在左侧和右侧。这是我使用奇异性的 sass 代码:

@import "singularitygs";
$include-border-box: true;

$break: 500px;
$break2: 800px;
$break3: 1200px;
$include-clearfix: true;

$grids: add-grid(1);
$grids: add-grid(2 at $break);
$grids: add-grid(2 8 2 1 at $break2);
$grids: add-grid(12 at $break3);
$gutters: add-gutter(1/6);

body {
  margin: 0;
  padding: 0;
  @include background-grid;
}

#foo {
    background-color: red;
    color: yellow;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 1);
    }

}

#bar {
    background-color: green;
    color: yellow;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 2);
    }
}

#baz {
    background-color: purple;
    color: whitesmoke;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 1);
    }
}

#qux {
  background: yellow;  
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 2);
    }
}

#waldo {
  background: blue;
    color: whitesmoke;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 1);
    }
}

#garfield {
  background: orange;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(1, 2);
    }
}

#dilbert {
  background: cyan;
    @include grid-span(1, 1);
    @include breakpoint($break) {
        @include grid-span(2, 1);
    }
}

当断点启动时,Waldo Garfield 和 Qux 已经全部移动到了显示屏的顶部——Foo 已经完全不可见并被覆盖。我通过摆弄“清晰:两者/左/右”来获得接近我想要的东西,但它是无可救药的经验性的,我很确定它不可靠。我肯定错过了一些东西,但如果有人能告诉我什么,我将不胜感激!

4

2 回答 2

5

当您在没有额外参数的情况下使用时,它使用隔离输出样式grid-span跨越列。此样式使所有列出现在同一行上。

你有两个选择:

  • 对于应该出现在下一行中的每个元素,您必须告诉该元素这样做:clear: both;. 这种技术称为清除。
  • 切换到浮动输出样式,它会自动为您应用清除。您可以通过以下三种方式中的任何一种来做到这一点:
    • 设置$output: 'float'; 全局变量
    • 为mixin提供$output-style 参数: .grid-span
      @include grid-span(1, 1, $output-style: 'float');
    • 使用快捷方式 mixin : @include float-span(1, 1);.

此外,请考虑以下事项:

  • 您不需要对默认移动视图的列应用跨越。默认情况下,每列已经是 100% 宽。
  • 考虑通过使用不同的部分文件或简单地在装饰样式上方/下方编写布局样式来分离样式表中的装饰和布局。
  • 要应用交替样式,您可以使用nth-child伪选择器。如果您需要旧的 IE 支持,请使用Selectivizr 1.0.3b 和 Respond polyfills

这就是我将如何做到的。演示:http
://sassbin.com/gist/7238506/ 我已将您的 HTML 和 SCSS 转换为 HAML 和 SASS,因为它们非常易读且没有视觉噪音。我还删除了未使用的网格和断点。

$include-border-box: true

$break: 500px
$grids: 2

+breakpoint($break)
  #page > div
    &:nth-child(2n)
      +float-span(1,1)

    &:nth-child(2n+1)
      +float-span(1,2)

    &:last-child
      +float-span(2,1)

请注意,掌握列的对齐方式变得多么容易!

更新 2013-10-31

我真的很想让 Baz 向上移动,使其直接在 Foo 下方开始,同样,Garfield 向上移动,使其直接在 Qux 下方开始。但这甚至可能吗?

如果列高是动态的,那么您就无法优雅地做到这一点。

在这种情况下,我会将奇数段放入一列,将偶数段放入另一列,并跨越这两列。这将在桌面上生成所需的订单,但在移动设备上更改订单。

如果您真的真的需要在移动设备和桌面设备上都有所描述的顺序,那么请考虑修复段落高度或使用 JS 在窗口调整大小时重新排序段落。

更新 2013-11-01

相关问题:https ://github.com/Team-Sass/Singularity/issues/143#issuecomment-27547135

于 2013-10-30T19:08:27.507 回答
2

你在正确的轨道上clear。Clear 用于决定是否应该将元素向下移动到现有的浮动元素之上,这是在 CSS 中创建“行”所需的操作。由于您是 CSS 新手,请查看Mozilla Developer Network 的clear参考资料。

一般来说,我会鼓励你不要将 Sass 视为 jQuery,抽象出所需的 CSS 知识。尽管许多框架使编写 CSS 变得更容易,但您仍然需要了解底层 CSS 的工作原理,以确保获得预期的输出(与大多数情况下没有的 jQuery 相比)。例如,在 Singularity 中,有两种不同的输出样式,您需要知道哪一种最适合您所面临的情况。对于对 CSS 和网格完全陌生的人来说,Float 输出方法一开始可能更容易理解,因为它会自动清除你的浮点数并“穿过你的行”。事实上,甚至还有一种float-spanspan 方法可以让您在使用对称网格时真正轻松地使用这个心智模型.

希望这可以帮助。

于 2013-10-30T19:08:37.143 回答