深入解析CSS中的自定义属性
CSS 预处理器是一个非常出色的工具,但是它们的变量是静态的,有语法作用域。Native CSS 变量,从另一面来看,它们是一个完全不同类型的变量:因为它们是动态的,他们的作用域是DOM,事实上,这也是困惑该不该称他们为变量,它们实际上是CSS 属性,这也给了他们一个机会,来解决这个功能完全不同的问题。 在这篇文章中,我将讨论一些CSS 自定义属性这个功能,而且不用CSS 预处理器来做。当然我还演示一些新的设计模式,自定义功能的启用。文章最后讨论一下,我认为在未来最有可能的是预处理变量和自定义变量一起使用,两个东西取长补短,珠联璧合。
任何工具,都有他的局限性,有一个炫酷的外观会让人惊喜而忽略了其中的限制,特别是新用户。 Preprocessor variables aren’t live
CSS Code复制内容到剪贴板
$gutter: 1em;
@media (min-width: 30em) { $gutter: 2em; }
.Container { padding: $gutter; } 如果你编译上面的代码,你得到是:
CSS Code复制内容到剪贴板
.Container { padding: 1em; } 如你所见,媒体查询被废弃,变量赋值被忽略。 从理论上讲,虽然sass 负责申明条件变量,但这样做也是一个挑战,枚举所有Permutations—exponentially 会增加CSS的最终大小。 预处理器变量不能级联(层叠) CSS 最终是为HTML的样式,事实证明还有另外一种有用的方法是变量的范围:DOM 元素,但是preprocessors不能运行在浏览器且从未看见标记。 参考一个网站,试图给<html> 的元素添加一个 class user-setting-large-text 他们更倾向于更大的文本大小 。
CSS Code复制内容到剪贴板
$font-size: 1em;
.user-setting-large-text { $font-size: 1.5em; }
body { font-size: $font-size; } 但是,就像上面媒体查询例子,Sass 直接忽略变量赋值, 意味着这种事是不可能的。他输出的:
CSS Code复制内容到剪贴板
body { font-size: 1em; } 预处理器变量不继承 有一种情况,你有Dom元素在颜色风格基础上有什么的变化时候,你可以用在他们的父元素上。
CSS Code复制内容到剪贴板
.alert { background-color: lightyellow; } .alert.info { background-color: lightblue; } .alert.error { background-color: orangered; }
.alert button { border-color: darken(background-color, 25%); } 上面的Sass代码是无效的,但你应该能理解这代码试图要完成什么。 它最后试图使用sass的darken函数用在background-color属性,但button元素继承它的父class元素.alert。如果class info或者error已经添加到alert(或者通过JavaScript设置背景颜色或用户样式),按钮元素希望能够得到这两个颜色。 现在这个虽然不会在sass 运行,因为预处理器不知道DOM结构,但还是希望搞清楚这类型的东西可能有哪些用处。 说一个特定的用例:这也是在继承DOM属性的可访问性运行color 函数的原因。举个栗子,为了确保文本总是可读,且充分与背景颜色形成鲜明对比。通过自定义属性和新的CSS Color函数,这将很快成为可能! 预处理器变量不能相互协作 与第三方分享预处理器变量在不同的工具集成或第三方托管的CND样式与都非常困难(至少不容易)。 本地CSS自定义属性将与任何CSS预处理或者原CSS正好相反。 自定义属性有何不同 CSS自定义属性就像常规的CSS属性一样,他们的操作方式完全相同。 (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |