我最近听 Chris Eppstein 做了一个演讲 (幻灯片) 关于创建更好的样式表以及如何使用 SASS 来实现。 其中有一些令人惊讶的部分,其中之一就是关于“选择性排版”。 想法是,您不应为像 p
、ul
、ol
、h1
、h2
等排版元素设置全局样式,而是将这些样式作为类应用,例如 .text
。
想法是,网站上有很多地方您需要从干净的 slate 开始,而不必担心全局样式的影响。 典型的例子是列表,当将它们用于导航等事物时,您可能不希望它们与文章中的边距/填充/列表样式相同。
此外,您可能需要在需要时应用不同的排版样式集。 因此,您不需要使用以下全局样式
p { }
ul { }
ol { }
h1 { }
h2 { }
/* etc */
您会将其范围缩放到类(在此使用 SCSS)
.text-article {
p { }
ul { }
ol { }
h1 { }
h2 { }
/* etc */
}
.text-module {
p { }
ul { }
ol { }
h1 { }
h2 { }
/* etc */
}
在网站的博客文章区域,您可以获取文章排版,而在侧边栏模块中,您可以获取该模块的排版。
<section class="main-content">
<article class="text-article">
...
</article>
</section>
<aside>
<div class="module text-module">
Texty module
</div>
<div class="module">
Module in which typography isn't needed
</div>
</aside>
Anthony Short 也有同样的感觉.
当然,这是否有效取决于网站。 网站的类型以及它所处的发展阶段。 我认为这在具有更“模块化”架构且没有大量遗留内容的网站上效果更好。 我有兴趣在一个新的项目中尝试它。
很棒的文章! 我将在下一个项目中尝试使用 LESS。 我在不知不觉中使用过这种 CSS 排版风格,但没有 LESS,上一次从空白 slate 开始一个项目的时候。
我喜欢这个。
我非常喜欢这个!
嗯…… 您是在覆盖您自己的全局样式还是浏览器样式,两者有什么区别呢?
我在一个当前的项目中尝试过这个概念,但这篇文章基本上验证了我对此的想法。 干得漂亮。
很棒的文章,我经常在我的网站上尝试这样做,当我只需要担心它会影响一个部分而不是整个网站时,它会让我的工作更容易一些。
我来充当一下“魔鬼的代言人”,说如果您的基本样式在 DOM 中过于冲突,那么您的基本样式实际上过于具有规定性。
如果您尝试在 CSS 中尽可能少地使用类和特定 ID,那么您往往会倾向于使用样式模式,这会为网站带来极大的灵活性。
我曾经这样做过,效果很好。
将您的内容排版与网站的其他部分分开非常棒; 您可以更改内容的显示方式,而不会破坏网站的其他部分。
我不喜欢在我的 HTML 中添加更多类。 这和我们过去对网格所做的事情一样。 现在每个使用 SASS 的人都应该熟悉将网格列与 CSS 混合的概念。
那么为什么不利用 SASS 的强大功能,在一个地方定义排版,并在我们现有的 CSS 中加入风格呢?
+1
我一直使用“ .flow”类来指定任意标题、段落和列表的流动内容。
这确实比不断与级联作斗争要聪明得多。
我真的很喜欢这个概念,它非常适合具有不同内容的特定项目。 例如,可能是一个博客,您希望为每个类别赋予特定的风格。
非常棒 - 可能必须在我的下一个项目中尝试一下。
我不太熟悉 SASS,但这不是我们正试图摆脱的 CSS 类型吗?
您的示例创建了数十个具有后代选择器的 CSS 规则,因此在大多数元素中,浏览器每次都必须搜索其所有父元素。
@Scott 您实际上没有创建任何额外的规则。 您仍然使用级联,只是更好地控制它。 担心单个元素选择器与 2 级深度的后代选择器之间的性能问题可能不值得。
Scott 的观点很有道理。 我认为这篇文章中描述的技术对 SASS 编写者来说是自然的,我已经做了一段时间了,好吧,只要你不堆叠得太深,这就可以了,你必须稍微小心一些……
根据我的经验,这样做很诱人
嵌套的 a 元素的最终选择器将是
这已经相当大了,如果它被包裹在文章中,作为侧边栏的一部分,而 SASS 和这篇文章可能会误导你这样做,会怎么样。
并不是说这个技术不好,但请记住,嵌套得太深会导致你得到巨大的选择器,即使只是为了 kb,也要三思而后行。
很有趣。 正如有些人所说,我认为我也开始倾向于这种结构。
我即将开始一个新的个人项目,我将在其中尝试使用这种方法。 我很期待!
我使用了这种技术大约 2 个月,我非常喜欢! 它对于其他全局模块(例如表单)也很有用。
有时您需要将新的模块放在
.text-article {}
内,为此我使用重置类.text-article_reset {}
。我做了一个小例子: http://jsfiddle.net/ruslan_savenok/DQGDZ/embedded/result/
http://jsfiddle.net/ruslan_savenok/gH44L/
我曾经想过用这种方式来处理我的样式,但我总是觉得它太“不同”了。 现在我感到很傻,因为我没有用这种方式来做。
我认为这可能是我 Web 开发习惯的永久改变。
使用排版起来似乎很有趣,我希望在我的下一个主题中使用它。
我以前想过这个,这是一个很棒的方法,可以拥有不同的风格而不覆盖之前的属性,不过我有一个问题,在您的示例中,您创建了范围化的排版样式,但浏览器默认样式呢,它们仍然存在,使列表拥有默认样式,当我们想要创建一个导航时,这些样式仍然会造成麻烦,或者链接会拥有下边框,是否最好将所有默认的排版样式重置为普通文本样式,例如,只从 html 或 body 继承 font-size 和 line-height,而不继承其他任何内容?
这是我目前使用的方法,虽然我从未想过要给它起个名字。 我工作的公司几乎完全在 Joomla 中进行开发,它天生就是模块化的,所以效果很好。
这是一个很好的整洁方法,我最近越来越常看到它。 只对使用字体的元素加载字体要求是否会提高性能?
我大部分时间也是这样做的! 太棒了!
天啊! 这太棒了! 我已经在一个项目中投入了 6 个多月的时间,使用 Twitter Bootstrap 作为基础。 随着项目的增长(敏捷开发),我发现自己不得不与级联作斗争,因为我们添加了新的部分:移动、iframe、Facebook 应用、WordPress、独立 HTML 等。
在继续开发的过程中,我一定会沿着这些思路思考。 而且我肯定会在新项目中使用这种方法!
谢谢!
酷,谢谢。 很少有顶级元素在整个项目中保留其样式,我总是发现自己覆盖我设置的主样式(老实说,这些样式通常只与网站的内容区域相关)。
使用排版看起来很有趣。我之前也想过用这种方式来做我的样式,但后来我一直觉得它太“不同”了。现在我觉得没有这样做真是太傻了。
我认为这可能是我 Web 开发习惯的永久改变。
考虑到 HTML5 的使用,我认为应该为旧浏览器提及 html5.js。HTML5 标签在 IE<=8 中可能会出现问题。
我喜欢这个 :D
很棒的想法,我们都应该看到它。使用 LESS 很容易做到。
我曾参与过以这两种方式(将基本样式应用于所有元素或仅应用于特定类容器内的元素)处理网站的项目。
虽然不同的聪明人会用不同的方式工作,但我强烈认为,最好拥有良好的通用样式,然后根据需要覆盖它们。这就是 CSS 的工作方式。
设置良好的默认值可以避免很多麻烦,无论您(或您的客户)还没有创建多少情况和模块。
在某些时候,有人可能会忘记应用 "text-module" 或 "c" 或 "whatever" 类,然后排版就会出错,有人就必须更改*HTML*。这很糟糕。特别是如果您谈论的是一个可能没有很好的模板系统(例如 Drupal)的系统,那么这可能会比您想要的更复杂。
在某些时候,HTML 不会像您现在期望的那样。这很好,这是不断发展的网络。即使它保持干净和语义化,它也需要在以后做一些不同的事情。CSS 很适合这种情况,因为您可以定义默认样式,让您在大多数情况下完成工作。
对于使用 SASS 或 LESS 的朋友,我有一个更强烈的建议:创建一个包含所有重置样式的重置混合。然后,在全局导航等需要清除所有默认值的地方,您可以添加重置混合并从头开始。
我非常喜欢这个概念。这是一种简单的方法,可以更好地控制您网站的不同元素。
很棒的文章!谢谢!
我已经使用这种技术一段时间了(我想是 5 个项目),效果很好!特别是在需要在少数地方对内容进行标准化样式的项目中。
我的实现略有不同。我的方法是识别排版中的常见内容并全局对其进行样式设置。只有在那之后,我才会对严格针对“标准”文本的样式进行范围限定。这样一来,我认为我得到的样式更通用,并且兼具两全其美。
我不明白.. 我们不是一直都在这样做吗,只是将全局选择器样式保留在里面?
我遵循 @snook 使用 SMACSS 的方法,其中模块的设计使您可以将其放置在任何地方。但我看不出为什么不定义全局样式.. 将其留给(各种各样且不一致的)浏览器吗???