概要:这一章将介绍Compass如何使Web设计中最基础的部分——布局变得简单。

本章内容

  ● 网格布局的基本原理以及何时使用网格布局

  ● 使用Compass时的CSS网格布局框架选项

  ● 使用排版辅助器处理垂直韵律问题   

1. 网格布局介绍

  网格布局框架可以帮你在Web页面中高效地使用留白,对行列间的内容,以及行列间的间隙提供统一尺寸。留白就是你的布局中内容之间的间隙,通过在不同类型的信息间制造视觉隔离,帮助你更好地浏览内容,或者让你的注意力集中到更重要的元素上。

1.1 不使用CSS网格布局或者不使用网格辅助设计

  统一的留白除了有美学上的考虑,还能帮你更好地浏览和阅读内容。CSS网格布局框架建立了一个各种统一尺寸的规范,避免你陷入在布局中失去焦点的危险。

1.2 网格布局系统或框架及其工作原理

  利用网格布局,我们能够轻松的以一种看上去很舒服的方式排布图片。

1.3 使用Sass和Compass进行网格布局

  网格布局的核心原理很简单,无非就是把内容和容器通过简单的数学计算进行均分,然后分配。Compass和(和Sass)帮你处理这些计算,把你从通过类名来指定网格宽度的繁杂工作中解放出来。使用Sass中的变量,你可以轻松地配置网格样式,仅仅修改几个变量就能尝试另外一种设定。

2. 开始使用网格布局

2.1 术语

  尽管每种CSS网格布局框架都有一套它们自己的关于网格元素的命名,但是有些概念却是所有框架共享的。如下表所示:

术语名 定  义 是否涉及HTML标签
内容度量的垂直单位
容器 构成一个网格布局的HTML元素
网格布局中列与列之间的统一留白

● 列

  是网格布局框架最核心的部分。

● 容器

  在CSS网格布局中,你在一个容器内构造一个基于列的布局。一个网格布局既可以只有一个容器也可以有多个容器。有时候或许会构造不同列宽和列数的容器。在CSS网格框架中,一个容器一般来说就是一个封装元素,多数时候是一个DIV给它指定一个用来实现网格布局的CSS选择器。

● 槽

  就像房顶上的槽用来收纳雨水然后将其从房顶引流到排水沟一样,槽帮助我们的眼睛有效地注意到内容块之间的边界。就像列一样,槽也是有统一宽度的。不同的网格布局会使用不同的算法来满足列式布局的需要,但是全部是基于列数列宽槽宽的。

2.2 是否使用网格布局,要语义还是要实用

  批评人士抱怨说:使用CSS类名来指定网格布局是把展现和内容耦合了。在这个语义阵营的人坚称,标签应该只是关于内容和数据的,不应该包含任何关于展现的信息。而实用主义者则认为能影响语义的是标签而不是类名。幸好,Compass提供了两种选择,在不修改原有类名的情况下,既可以通过添加类名又可以使用混合器来实现网格布局。

2.3 固定的网格布局还是流动的网格布局

  由于网络用户的屏幕尺寸不一,设计人员有两种选择:要么选择一种对于大多数用户合理的固定布局大小(并且限制这种布局内的内容不溢出),要么实现一种灵活的流动布局,让内容自适应用户的屏幕,甚至当浏览器窗口大小改变时也会自适应。

  尽管流动布局听上去很诱人,但是动态内容的特性让流动布局变得非常难以实现和维护。

3. 使用Blueprint

  Blueprint把一些通用的对网格布局、段落和表格进行样式修饰的CSS技术打包到一个框架中,然后可以在各个项目中通用这个框架。你可以完全使用Blueprint,也可以选择Blueprint中你喜欢的模块进行自定义。

3.1 使用原生CSS的Blueprint

  首先下载并且解压缩Blueprint的CSS以及支持类的文件到你的项目中,并且在你文档的头部加以引用。如下代码所示:

<link rel = "stylesheet" href = "css/blueprint/screen.css">
<link rel = "stylesheet" href = "css/blueprint/print.css">
<!-- [ if lt IE 8 ]>
<link rel = "stylesheet" href = "css/blueprint/ie.css">
<! [ endif ] -->

可以开始创建自己的网格布局系统了。先看一个基本的布局,如下代码所示:

<section class = "container">
<header class = "main span-24"> Header </header>
<div class = "content span-20"> Content </div>
<aside id = "sidebar" class = "span-4 last"> The last column </aside>
<footer class = "main span-24"> Footer </footer>
</section>

  上面的代码中,首先在吧整个网格布局包起来的元素上添加了一个container类名。通过给header和footer元素设置span-24的类名来让它们占满网格布局的整个宽度。

 3.2 使用Compass应用Blueprint

  首先创建一个新的Compass项目。

compass create simple --using blueprint/basic

directory simple/
directory simple/images/
directory simple/sass/
directory simple/sass/partials/
directory simple/stylesheets/
create simple/config.rb
create simple/sass/screen.scss
create simple/sass/partials/_base.scss
create simple/sass/print.scss
create simple/sass/ie.scss
create simple/images/grid.png
create simple/stylesheets/ie.css
create simple/stylesheets/print.css
create simple/stylesheets/screen.css
...

  Compass首先创建了一个主样式文件screen.scss,并引入了Blueprint。接下来,Compass创建了一个_base局部文件,其中包含了网格布局的所有计算。Compass有很多种使用Blueprint的方法。

  首先,Blueprint基本模式的默认screen.scss代码如下:

// 这里引入一个全局的重置到任何引入这个样式表的地方
@import "blueprint/reset"; // 需要配置blueprint的话,编辑partials/_base.sass文件。
@import "partials/base"; // 引入所有默认的blueprint模块,以便我们能够使用这些模块内的混合器。
@import "blueprint"; // 引入非默认的脚手架模块。
@import "blueprint/scaffolding"; // 根据你的配置生成blueprint框架。
@include blueprint; @include blueprint-scaffolding;

  在生成的screen.scss文件中,添加了blueprint的reset模块,从局部文件中引入了网格设定,引入了Compass中强大的Blueprint混合器。接下来准备生成网格布局并添加一些Blueprint额外的特性,比如说与表格修饰相关的。利用强大的Compass的Blueprint生成网格布局:

@mixin blueprint-grid {
...
// Use these classes (or mixins) to set the width of a column.
@for $n from 1 to $blueprint-grid-columns {
.span-#{$n} {
@extend .column;
width : span($n); } } //生成span-xx类
.span-#{$blueprint-grid-columns}{
@extend .column;
width : span($blueprint-grid-columns);
margin :; } //最后一列的类不需要槽
...

3.3 使用Compass应用无需类名的Blueprint

  如果不喜欢Blueprint类名修饰的方式,而更倾向于在其他的选择器中混合进网格样式,可以选用blueprint/semantic:

compass create simple --using blueprint/semantic

  如果比较一下两种类型生成的文件,你会发现只多了一个文件,此外在screen.scss底部多了一些额外的引入。

// 把这些局部文件合并到screen样式文件中
@import "partials/page";
@import "partials/form";
@import "partials/two_col";

  使用这种类型,Compass就不会再生成那些span-xx类了。你只需要使用@column混合器。Compass在two_col的局部文件中提供了一个很好的例子,代码如下:

#container {
@include container; }
#header , #footer {
@include column ($blueprint-grid-columns) ; }
#sidebar {
// One third of the grid columns , rounding down. With 24 cols ,
// this is 8.
$sidebar-columns : floor($blueprint-grid-columns / 3 );
@include column ($sidebar-columns); }
#content {
// Two thirds of the grid columns , rounding up.
// With 24 cols , this is 16.
$content-columns : ceil(2*$blueprint-grid-columns / 3);
// true means it's the last column in the row
@include column ($content-columns , true) ; } }

  这个清单中的内容虽然很短,但却足以充分演示让网格布局更快的Compass技术。为了设置整体的网格,你需要一个容器。例子中,把相应的行为整合进了#container选择器。你的头尾元素也以相同的方式通过一个混合器设置成了全宽。代码中最神奇的部分是Compass基于侧边栏和主内容分别占1/3、2/3,计算除了侧边栏和主内容应该占据的单元列的个数。

  通过floor和ceil方法,你可以进行一些基本的舍入以确保恰当的分配。如果你需要再次改变你的_base.scss局部文件中网格布局的列数,这些代码根本不需要修改也能正常工作。

4 在Compass中使用960网格布局

  另一个著名的CSS网格框架是Nathan Smith的960网格系统。这个框架的优点在于灵活性。它与Blueprint CSS框架大部分原理都是相同的,除了以下几点:

  ● 960网格系统中的槽在单元列的两边都有,这就意味着无论是第一个列还是最后一列在它们的外边框上都有一个槽。

  ● 960网格系统可以指定容器的范围,这样在同一个页面中就可以有不同的列数和列宽。

4.1 一个基本的960布局

  首先把960的相关文件引入到页面中:

<link rel = "stylesheet" href = "css/reset.css">
<link rel = "stylesheet" href = "css/text.css">
<link rel = "stylesheet" href = "css/960.css">

  960网格系统中标签的写法与Blueprint示例非常相似。只是container变成了container_12,span-x类变成了grid_x。960中有一个omega类,它的作用跟Blueprint中last类很相似,但是这个只用在你强制网格布局中的内容新起一行的时候。

4.2 在Compass中使用960网格布局 

  对于没有绑定在Compass内的960网格系统,使用前需要先安装Compass插件。

gem install compass-960-plugin

  通过Ruby的Gems安装完之后就可以创建一个960网格系统的Compass项目:

compass create -r ninesixty twelve_col --using 960
directory twelve_col/
directory twelve_col/sass/
directory twelve_col/stylesheets/
create twelve_col/config.rb
create twelve_col/sass/grid.scss
create twelve_col/sass/text.scss
create twelve_col/stylesheets/grid/css
create twelve_col/stylesheets/text.css

  默认情况下,这个插件创建两个样式表,其中之一是伴随960的网格设置和基本段落模块。一般的做法是把它们转换成局部文件,在一个screen.scss样式文件中引用它们以减少网络请求负载。

  

Sass与Compress实战:第三章的更多相关文章

  1. Sass与Compress实战:第二章

    1.使用变量 Sass使用$符号来标识变量,比如$highlight-color. 1.1声明变量 Sass声明变量和CSS声明属性很像: $highlight-color : #abcdef; 这意 ...

  2. Sass与Compress实战:第一章

    1.消除冗余代码的方式: ▶通过变量来复用属性值 例如,一段冗余的CSS代码: h1#brand { color : #1875e7 } #sidebar { background-color : # ...

  3. Rxjava2实战--第三章 创建操作符

    Rxjava2实战--第三章 创建操作符 Rxjava的创建操作符 操作符 用途 just() 将一个或多个对象转换成发射这个或者这些对象的一个Observable from() 将一个Iterabl ...

  4. Sass与Compress实战:第七章

    概要:将介绍Compass如何让你从本地开发原型轻松转移到生产环境的网址或Web应用中. 本章内容: ● 生成资源URL的最佳实践 ● 撰写无需Web服务器的样式表 ● 在浏览器中进行设计的技巧 ● ...

  5. Sass与Compress实战:第六章

    概要:介绍Compass如何让你从本地开发原型轻松转移到正产环境的网址或Web应用中. 本章内容: ● CSS精灵的历史和基本原则 ● Compass混合器让精灵自动化 ● 自定义精灵图片和CSS输出 ...

  6. Sass与Compress实战:第五章

    概要:第5章展示了Compass如何使你免去编写跨浏览器的CSS3的痛苦. 本章内容: ● 用Compass的CSS3模块创建跨浏览器的CSS3样式表 ● 在低版本IE中支持一些CSS3的特性 ● C ...

  7. Sass与Compress实战:第四章

    概要:这一章将深挖Compass的工具箱,看看Compass的混合器如何帮助你省去编写重复样式表的辛苦工作. 本章内容: ● 使用Compass重置浏览器默认样式表 ● 改进样式表排版的Compass ...

  8. Sass与Compress实战:第八章

    概要:帮助你实现样式表的最佳性能 本章内容: ● 样式表拼接 ● 样式表和资源压缩 ● 减少和并行图片请求的策略 ● 选择器性能和优化策略 1. 测量客户端性能 性能优化的起点和终点都是测量.在第一次 ...

  9. .NET Core3.1 Dotnetty实战第三章

    一.概要 本章主要内容就是讲解如何在dotnetty的框架中进行网络通讯以及编解码对象.数据包分包拆包的相关知识点. 后续会专门开一篇避坑的文章,主要会描述在使用dotnetty的框架时会遇到的哪些问 ...

随机推荐

  1. Nginx stream(TCP/UDP)负载均衡

    Nginx-1.11.6编译安装 nginx编译安装,(平台:ubuntu 14.04); sudo apt-get install zlib1g-dev sudo apt-get install l ...

  2. Largest prime factor

    problem 3:Largest prime factor 题意:求600851475143的最大的质因数 代码如下: #ifndef PRO3_H_INCLUDED #define PRO3_H_ ...

  3. Python快捷键

    IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列. ALT+P  上一个历史输入内容. ALT+N 下一个历史输入内容. IDLE中按F5可以运行代码.

  4. size_t

    size_t在C语言中就有了.它是一种"整型"类型,里面保存的是一个整数,就像int, long那样.这种整数用来记录一个大小(size).size_t的全称应该是size typ ...

  5. FTP上传下载工具(FlashFXP) v5.5.0 中文版

    软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...

  6. HDU 4403 A very hard Aoshu problem

    暴力$dfs$. 先看数据范围,字符串最长只有$15$,也就是说枚举每个字符后面是否放置“$+$”号的复杂度为${2^{15}}$. 每次枚举到一种情况,看哪些位置能放“$=$”号,每个位置都试一下, ...

  7. 字符串---分割成数组(str_split ),算出一个字符串中出现最多的字符, 学校中最多的姓名

    split 分割separate分开 little 小的 echo '<meta http-equiv="Content-type" content="text/h ...

  8. Java中 +=是什么意思 什么情况下用

    x+=1与x=x+1一样的效果执行一次x=x+1,就等于给x重新赋了值,这个值就是x+1例如:int x=1;x+=1;最后x的值是2x+=1一般在循环下使用,能发挥它的最大的作用.例如:while( ...

  9. B/S和C/S【转载Jane的博客 http://blog.sina.com.cn/liaojane】

    什么是C/S和B/S结构?         C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.In ...

  10. 阅读国外大神对this的分析,自己的总结

    大神的分析地址:http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/#comment- ...