设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

AM介绍——CSS的属性模块

2014-9-10 10:08| 发布者: joejoe0332| 查看: 3021| 评论: 0|原作者: 开源中国匿名会员, daxiang|来自: 开源中国社区

摘要: 几个月前,我读了一篇文章article by Harry Roberts ,在文章里Harry Roberts 介绍了关于CSS一个有趣的概念。 他认为在css属性中使用,可以帮助开发人员快速理解这些属性的功能。 他给出了下面的示例,证明使用可以 ...


属性模块(Attribute Modules)

  属性模块,或者叫 AM,它的核心是如何为你的样式定义命名空间。让我们从一个简单的例子开始,一个网格,首先用类的方式描述:

1
2
3
4
5
6
7
8
<div class="row">
    <div class="column-12">Full</div>
</div>
<div class="row">
    <div class="column-4">Thirds</div>
    <div class="column-4">Thirds</div>
    <div class="column-4">Thirds</div>
</div>
1
2
3
4
5
6
7
8
.row { /* max-width, clearfixes */ }
.column-1 /* 1/12th width, floated */ }
.column-2 /* 1/6th width, floated */ }
.column-3 /* 1/4th width, floated */ }
.column-4 /* 1/3rd width, floated */ }
.column-5 /* 5/12th width, floated */ }
/* etc */
.column-12 /* 100% width, floated */ }


  好了,然后我们用属性模块方式来做。我们有两个模块,行(rows) 和 列(columns) 。行,现在还没有变化,列有 12 列。

1
2
3
4
5
6
7
8
<div am-Row>
    <div am-Column="12">Full</div>
</div>
<div am-Row>
    <div am-Column="4">Thirds</div>
    <div am-Column="4">Thirds</div>
    <div am-Column="4">Thirds</div>
</div>
1
2
3
4
5
6
7
8
[am-Row] { /* max-width, clearfixes */ }
[am-Column~="1"] { /* 1/12th width, floated */ }
[am-Column~="2"] { /* 1/6th width, floated */ }
[am-Column~="3"] { /* 1/4th width, floated */ }
[am-Column~="4"] { /* 1/3rd width, floated */ }
[am-Column~="5"] { /* 5/12th width, floated */ }
/* etc */
[am-Column~="12"] { /* 100% width, floated */ }


  首先你肯定会注意到了它们的 am前缀(am-prefix)。这是 AM 核心的一部分,它确保了属性模块不会和现有属性冲突。你也可以用任意你喜欢的 ‐ 我试过用 ui- ,css- 还有其它一些,不过这个例子里面我们约定用 am-。如果 HTML 校验对你的或者你项目来说很重要,那你就选个 data-,意思也是一样的。


  第二个你会注意到应该就是那些值了,什么 "1","4" 还是 "12" 的,看起来非常糟糕 的类名 ‐ 它们太普通所以有太高的冲突几率了。不过因为我们已经定义了我们的命名空间,它只在我们规定的地方起作用,所以我们可以随便用那些我么你觉得最简明最有意义的字符。


灵活的属性

  到目前为止,差别相当细微。不过因为每个模块都有它自己的命名空间,让我们拿我们的值做个不一样的尝试:

1
2
3
4
5
6
7
8
<div am-Row>
    <div am-Column>Full</div>
</div>
<div am-Row>
    <div am-Column="1/3">Thirds</div>
    <div am-Column="1/3">Thirds</div>
    <div am-Column="1/3">Thirds</div>
</div>
1
2
3
4
5
6
7
8
[am-Row] { /* max-width, clearfixes */ }
[am-Column] { /* 100% width, floated */ }
[am-Column~="1/12"] { /* 1/12th width */ }
[am-Column~="1/6"] { /* 1/6th width */ }
[am-Column~="1/4"] { /* 1/4th width */ }
[am-Column~="1/3"] { /* 1/3rd width */ }
[am-Column~="5/12"] { /* 5/12ths width */ }
/* etc */


  现在我们可以用命名来让我们的作用域看起来更有意义了 ‐ 一个宽是 1/3 标记让我们立刻能想起我们需要有 4 列,因为我们用的是一个 12-列 的网格。我们还为所有的列定义了一个默认样式 ‐ 也就是属性 column ,没有值的列将会被视为全宽的列。此外,我们还可以把一些重复的逻辑 (事实上列是左对齐的)移到了这个属性规则里面。


格式化所有的属性和值

  这是这种方法的核心优点之一。存在一个基础属性,比如 am-Button,可以并且应该定义样式。这个属性的每个扩展则应该继承或者重写这个基础样式。


  在上面的网格例子中,我们正是这样做的:标签 am-Column="1/3" 匹配到了两个属性[am-Column] 和 [am-Column~="1/3"],因此结果就是基础样式 + 改变。它给我们提供了一种方式来实现 所有的列都是columns 而不需要用重复的类或者用 SASS 的 @extend方法。


BEM 的零类(zero-class)模式

  回到我们的 BEM 中的单类模式 vs 多类模式上来,AM 给了我们一个零类模式选项。比如说上面的按钮的例子,标记看起来是这样的:

1
2
3
4
<a am-Button>Normal button</a>
<a am-Button='large'>Large button</a>
<a am-Button='rounded'>Rounded button</a>
<a am-Button='large rounded'>Large rounded button</a>
1
2
3
[am-Button] { /* base button styles */ }
[am-Button~="large"] { /* large button styles */ }
[am-Button~="rounded"] { /* round button styles */ }


  通过创建一个新的属性模块 am-Button,我们可以分离出适用于所有按钮的样式,比如那些大按钮,还有那些圆角按钮。我们不仅可以自由的组合这些变化(比如 am-Button='large rounded'),我们还可以针对这些属性本身做任何的上下文覆盖:

1
header > nav > [am-Button] { backgroundnone; }


  现在不管你选什么样式的按钮,或者你选多少种样式的按钮都不是问题了,关键是,所有的按钮都会适用选择器[am-Button],这样我们就知道我们的覆盖是有效的了。


AMCSS 工程

  我, 本・施瓦兹本・史密西特已经开始为 AM 的规范而努力了。如果你想了解这项技术更多的细节,比如块(blocks),元素(elements),断点(breakpoints) & 更多的话,去看看吧,如果你有问题要问,请戳这里提出问题


  同时我们也发布了文档站点 amcss.github.io ,那有大量的例子。如果你有兴趣贡献回馈,例子,特例或者希望我们给你的 AM 库加链接的话,请移步到我们的 GitHub


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部