我认为我前往新西兰参加 Webstock 的旅行值得举办一个特别的研讨会。为了纪念他们独特的国鸟,我创建了一个简单的单页网站 新西兰奇异鸟。该网站最初是一个简单的 Photoshop 文档,在研讨会期间,我们将它变成了一个完整的网站。以下是我们在该过程中涵盖的所有内容。

该设计主要以“笔记本电脑优先”为导向。并非针对小屏幕或大屏幕设计,但设计非常简单,因此使其流畅并适应不同的屏幕尺寸并不难。在 Photoshop 文件中最初选择的画布大小没有什么神圣的。
使用的字体是 Proxima Nova。我碰巧拥有它,因此我可以在本地使用它,但在网络上,我们通过 Typekit 使用它。它具有多种粗细和样式,这非常棒,但在网络上加载所有这些样式会非常沉重且缓慢。相反,我们只选择了 Thin、Regular Italic 和 Semibold,其大小为 77K。
在我们的 SCSS 中,我们记下了我们可用的粗细,因此我们确保对此进行具体说明,并且不会冒浏览器伪粗体或伪斜体的风险。
body {
font-family: "proxima-nova", sans-serif;
/*
Thin: 100
Regular Italic: 400
Semibold: 600
*/
}
在套件设置中,我们告诉 TypeKit 在我们的本地开发域以及最终网站所在的域上提供此套件是可以的。
说到本地开发,我们的开发包括在 Sublime Text(现在是 v3)中编辑代码。
我们使用 CodeKit 监视我们的项目文件夹,它为我们处理预处理、图像压缩以及 JavaScript 最小化/连接。
我们使用 MAMP 创建了一个本地域名来使用。这使我们能够使用 PHP,我们利用它来使用 include()
以较小的模块化块工作。我们编写的每一部分代码,无论是 CSS、HTML 还是 JS,都以较小的模块化块存在。拥有一个“真实”的域名而不是 file:// URL 意味着
- 我们可以包含来自根目录的资源。例如
src="/js/file.js"
,我认为这是一个很好的约定,因为它可以非常清楚地表明该文件的确切位置。 - 我们可以告诉像 Typekit 这样的服务我们的本地开发域名,以便可以在那里提供字体。
- 我们可以执行诸如发出 Ajax 请求之类的操作,由于浏览器的安全限制,除非在“真实”域名上,否则您无法执行这些操作。
我们的排版规则非常简单。UA 样式表中的排版规则非常好,我们只需根据需要进行一些调整即可。例如,标题的 line-height
与基本 line-height
不同。
所有字体大小,实际上甚至网站上的所有边距和填充都以 EM 为单位设置。这意味着所有大小/间距都与 body 上的 font-size
直接相关,我们会在不同的断点处调整它。
我们许多标题的不同部分都比标题的其余部分更粗,颜色也不同。但这仅仅是一种视觉效果,而不是为了强调。因此,<b>
标签非常完美,它仅用于样式设置,而不是用于强调。
我们在 各处使用 box-sizing,因为它始终是最好的选择。在我们的例子中,我们使用浮动来创建一个简单的网格。当我们基于 em 的填充来自基于百分比的流体列的内部时,数学运算会容易得多。
因为我们出于各种目的使用了浮动,这意味着需要清除这些浮动以保证布局的完整性。我们的浏览器目标(IE 9+)是这样的,我们可以使用非常简单的 clearfix。
.clearfix:after {
content: "";
display: block;
clear: both;
}
与其在需要它的 HTML 中使用该类名,不如改为创建一个占位符选择器
%clearfix {
&:after {
content: "";
display: block;
clear: both;
}
}
然后,每当我们需要清除特定元素上的浮动时,我们只需扩展该占位符即可
.page-wrap {
@extend %clearfix;
}
这使得最终选择器非常高效。只需一个用逗号分隔的需要清除的所有内容的列表。
我们将该占位符选择器放入名为 _bits.scss 的文件中。文件名开头的下划线只是一个约定,表示“此文件是一个部分,将在其他地方包含,而不是单独编译”。
我对该文件的约定是放置一些不会编译成任何内容但可以在其他地方使用的“片段”。例如变量
$green: #51cd4b; /* Don't get fancy, get memorable. */
断点 @mixin 具有不同的互斥断点以及 视网膜测试
@mixin bp($point) {
@if $point == 'baby' {
@media (max-width: 600px) { @content; }
}
@if $point == 'mama' {
@media (min-width: 601px) and (max-width: 1100px) { @content; }
}
@if $point == 'papa' {
@media (min-width: 1101px) { @content; }
}
@if $point == 'retina' {
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { @content }
}
}
这使得使用媒体查询变得超级简单和逻辑。请注意“三只小熊”风格的命名约定。这比特定设备的名称要好得多,因为这些名称会随着时间的推移而变得毫无意义。
使用此 bp() 混合器时,您正在更改的属性/值在已编写代码中彼此相邻,而不是在某个遥远的块中。例如不同宽度的网格
.module {
float: right;
@include bp(mama) {
width: 31%;
margin-left: 3.5%;
&:nth-child(3n) {
margin-left: 0;
}
}
@include bp(papa) {
width: 48%;
margin-left: 4%;
&:nth-child(2n+1) {
margin-left: 0;
}
}
}
占位符选择器非常适合重复的代码段
%texture-light {
background: url(../images/subtle_dots.png);
@include bp(retina) {
background: url(../images/[email protected]);
background-size: 27px 15px; /* Size of non-2x version */
}
}
使用 @mixin 来处理类似的事情可能很诱人,但在多次使用时,占位符/@extend 的效率略高。
“纹理”是 微妙的点,我在 Photoshop 中将其反转以创建页脚的深色版本。
奇异鸟图形是矢量形状。这非常适合 SVG。我们从库存照片中获取它,并在 Adobe Illustrator 中将其裁剪到合适的大小,该软件可以将其原生保存为 SVG。我们可以将其链接为 或放置为另一个元素的
background-image
,但以这种方式执行此操作不会为您提供 DOM 访问权限和通过 CSS 设置样式的功能。相反,我们使用 PHP include()
将 SVG 直接包含到 HTML 中。
<svg class="logo" viewBox="0 0 522.342 410.83">
<path id="bird" d="..." />
</svg>
注意路径上的 ID?我们可以在 CSS 中直接定位该形状并使用特殊的 SVG CSS 来影响它。在这里,我们正在设置颜色(使用我们的 Sass 变量)并应用悬停颜色更改(使用 Sass 颜色函数)
#bird {
fill: $green;
}
#bird:hover {
fill: darken($green, 10%);
}
我们的目标浏览器都支持 SVG,但如果我们需要进行适当的回退,Modernizr 非常适合此目的。最有效的方法是在页面上放置两个元素。
<svg></svg>
<div class="logo-fallback"></div>
如果支持 SVG,Modernizr 会在元素上提供一个类名。
.logo-fallback { display: none; }
.svg .logo-fallback { background-image: url(logo.png); }
如果支持 SVG,该资源(在大多数情况下)将不会加载。
我们使用纯 CSS3 内容(如 border-radius、text-shadow 和渐变)创建了页脚中的按钮。Compass 是 Sass 的一个很棒的插件,用于处理这些类型的事情。我们 不需要 border-radius 的前缀,但我们确实需要渐变的前缀,并且手动编写该 @mixin 会非常困难。
加载 Compass(在 CodeKit 中非常容易),我们可以使用它的 background() @mixin 来创建渐变
.button {
@include background(
linear-gradient(#89f784, #068925)
);
}
它编译成我称之为“机器人呕吐物”的内容——CSS 最好是手动编写起来既繁琐又容易出错。如果您让 Compass 为您提供渐变的 SVG 版本以更好地支持 IE 9,那么情况会变得更加糟糕。
@import "compass/css3";
$experimental-support-for-svg: true;
在按钮的 :active 状态下,我们删除底部边框并将其向下移动边框的宽度,以实现伪 3D 效果。我们使用 translateY() 进行移动,因为它是一个 设计移动选择,而不是位置问题。
流畅和自适应布局是响应式设计的一部分。加载正确的内容是另一部分。我们使用页脚中的地图来说明这一点。在我们的“婴儿”屏幕尺寸下,我们加载了一个静态链接地图,这更适合移动设备。在我们的“妈妈”尺寸或更大尺寸下,我们加载了一个嵌入式 Google 地图。更多信息来自 Brad Frost。
当我们的媒体查询匹配时,我们使用 jQuery 通过 Ajax 加载不同的内容。我们使用 Enquire.js 来测试这一点并为我们提供所需的回调函数。
该项目 在 GitHub 上。以及 此处演示。
可能值得深入研究一下它的浏览器支持。也许这会是一个不错的屏幕录制。
最后但并非最不重要的一点:真正的奇异鸟确实遇到了麻烦,并且 您可以提供帮助。
感谢您提供此概述,Chris。其中有一些有用的想法可以改进我的 SCSS 使用!
哇,我以前不知道
@extend
甚至存在。我使用 SASS 越多,它就变得越好。@extend 的工作原理是否类似于 @inlcude?
有点像。
@extend 使您能够将先前声明的样式包含到新的声明中。@include 用于混合器,@extend 用于样式块。
例如
.red {color: red;)
.red-bordered {
@extend .red;
border: 1px solid black
}
编译后,.red-bordered 将变为
.red-bordered {
color: red; /* 此样式是从 .red 样式块中扩展的 */
border: 1px solid black
}
因为 .red 块中包含的声明已“扩展”到其中。
但它会变得更好——如 Chris 的示例网站所示,您可以创建“占位符”样式——这些是声明块,在编译后不会出现在您的样式表中的任何位置(只需在声明块前面使用 % 符号),而是设计用于扩展其他样式——只需将占位符扩展到样式块中,您就会获得所有样式。
例如
%red {color: red} /* 此样式不会编译到您的样式表中 */
red-bordered {
@extend %red;
border: 1px solid black
}
也将编译为
red-bordered {
color: red;
border: 1px solid black
}
SASS/Compass 的另一个巨大的省时工具!
注意:您不能从媒体查询外部扩展到媒体查询中。因此,如果样式是在当前媒体查询外部声明的,则您不能在媒体查询中将其用作扩展。
更多信息请访问:https://sass-lang.com.cn/docs/yardoc/file.SASS_REFERENCE.html
(顺便说一句,我知道这些类名很糟糕,永远不应该在生产环境中使用)。
感谢您提供这些信息,Chris——我是少数几个现场见证此研讨会的人之一。我可以诚实地说,这是我花在学习网页设计上的 3.5 个小时中最棒的时光。很棒的工具,对新手和专业人士都非常易于使用(我处于两者之间!)
您可能需要查看一下移动“版本”,无法阅读所有文本(没有悬停),并且静态地图图像也不存在 :P
除此之外,很棒的阅读内容和很棒的单页网站!
iOS 会激活悬停点击,所以它可以正常工作,尽管它不是很容易被发现。 http://cl.ly/Myox 不确定其他移动浏览器是如何处理的 - 我预测效果不会很好。
文本量有点多,建议直接全部显示。欢迎提交代码请求。
我试着点击了,但没用。
啊,是的……我的错!我没有尝试点击图片,点击图片确实有效。但是点击文本在 iOS 上无效(在 iPhone 4S 和 iPad3 上测试过),而在 Galaxy SIII 上有效。
感谢分享,Chris!
这真的让我意识到自己还有多少东西需要学习。
在调整大小的时候,猕猴桃的简单动画是一个极好的点睛之笔!
你是否有关于此具体信息的资料?例如,在什么情况下会下载这两个资源?
一些相关的测试: http://timkadlec.com/2012/02/media-query-asset-downloading-tests/
唯一让我觉得奇怪的是,最宽布局和第二宽布局似乎交换了位置。在最宽的情况下不应该有三列布局,在略小一点的断点处应该是两列布局吗?
感谢这份概述,@chris。
我非常喜欢你的断点 mixin,但是当以移动优先的方式构建模块时,如何轻松地收集所有分散的 Papa bear 断点样式,以用于不支持媒体查询的 IE 样式表?
很棒。
如果我有时间改进所有这些东西就好了……
但工作就是工作…… ;(((
抱歉做一个喷子/带来无用的琐事
“Kiwi”这个词是毛利语,因此(毛利语字母表中没有“s”),kiwi(鸟)的复数形式是kiwi。“Kiwi’s”指的是人:P
顺便说一句,很喜欢 Webstock。
感谢你的教程。你为什么将 .module 设置为相对定位?
干杯
这可能是我最终切换回使用 em 进行大小调整的原因。
你好
你使用相对定位模块有什么特别的原因吗?
喜欢这个设计原则;但我很好奇你使用什么功能来添加观测点的映射功能。我现在正在为一个网站添加一个非常类似的功能……我正在实现一个非常好的插件,但发现它有点乏味。你能告诉我这是你自己的代码还是 WP,或者是什么吗?
谢谢 Chris,这是一个很棒的课程 - 我之前听说过你使用的一些工具,但现在我觉得我可以立即开始使用它们了。这些笔记对于解释我自己的涂鸦会非常有用。