编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。
我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策略缺乏深刻的理解。
在我和我们团队的观念中,编写可维护的前端代码非常重要。尽管我们有一些使用了多年的客户端,但要记住你永远不会是唯一一个工作于应用程序的人。仅仅因为你的一次性元素和配置对你有意义,并不意味着它们对下一个可能继承应用程序的人有意义。
为了防止这篇文章太长,我今天将主要讨论CSS代码。JavaScript代码是另一个完全不同的棘手问题。
这篇文章的目的不在于规则手册,而在于你正在编写CSS时的指南。希望能帮助大家找到自己的流程,而这篇文章的目标是让你的CSS一致,简单,易于使用。
下面是8个保持CSS有条理和易于长期维护的秘诀。
例如:编写display:block;时要注意,因为很多元素默认有这个样式。
另一个例子是在元素上定义字体大小,它将继承你正在定义的正文字体大小。
目标是双重的:
这里有一个常见问题是CSS没有清理干净,此时,为了简洁起见,可以完全删除。
不要将CSS元素视为每个单独页面上的特定表单或元素,如果你可以定义可重用的CSS实用程序和组件以供自己使用,则可以减少很多复杂性。
编写旨在重用的类的作用:
我们将’utilities’定义为一个CSS类,实际上它只用来做一件特定的事情,而不是封装整个元素。
你会看到这个策略经常用于流行的CSS框架,如Bootstrap和Foundation。
在这些流行的框架中你所看到的一些例子是:
.hide{display:none; } .text-center{text-align:center; }
例如,使用.hide,就不必每次想要在页面上隐藏元素时就得编写一个新的类——你只需要在你的元素上加上.hide类,它会使元素display: none; 。
我们写了一些实用程序文件,这些文件在应用程序之间共享,使用一些常用的实用程序可以减少为每个元素编写特定样式的需求。
一个很好的例子是我们如何使用margin和padding实用程序。下面是padding实用程序的一个简单例子:
.padding-0{padding:0; } .padding-xxs {padding:5px; } .padding-xs {padding:10px; } .padding-sm {padding:20px; } .padding-md {padding:30px; } .padding-lg {padding:40px; } .padding-xl {padding:50px; } .padding-xxl {padding:60px; }
通过结合使用这些工具,我们可以与我们间距的像素数保持一致,并且可以快速标记页面,而不必编写非常多的CSS。
实用程序背后的理念是,你认为你可能会不止一次地使用它们。如果它是一次性样式,或者如果你认为组合样式会经常使用,那么可能它作为CSS类将可以更好地工作。
假设有一些复选框的表单。在这个特定的情况下,你需要复选框内联(并排)。
所以你试图像这样写样式:
.user-form li a {color:red; }
.link--black{color:black; }
此处.link–black链接将被CSS特殊性所覆盖,并且将无法压倒.my-form li a样式。
现在你可能想要确保列表元素中的所有锚标记是红色的,但是你不知道未来的元素会怎么样以及可能会对设计做出什么样的更改。
你可能会问,“好的亲,那么你怎么解决上面的问题呢?”
通过上面的例子,你应该明白锚标签的颜色应该是一个远离默认链接颜色的变体。
所以,在这种情况下,我会100%确定一个额外的工具类来处理红色链接。下面是实践中可能的处理例子:
a { color:blue; &:hover { color:black; } } .link--red{color:red; }
我在这里作出的假设是:某一天,此红色的链接将在应用程序的其他地方被使用。我不想把它嵌入到用户表单中,因为那样我就不得不在未来编写另外一个样式来说明需要红色链接的情况。
另外,因为我将自己的悬停定义在自己的锚点上,所以红色链接将会变成黑色悬停,而不必定义任何其他样式。
能够真正防止过度嵌套的一个策略是名为BEM(Block Element Modifier)的命名策略。
使用BEM的一个很好的例子就是当你有一个真正具体的样式的组件时,如果使用实用程序会太麻烦和复杂的话。
这个例子看起来像这样:
// HTML snippet <div class=”profile”> <img src=”person.jpg” class=”profile__photo”/> </div> // BEM CSS .profile { background-color: white; border: 1px solid #ccc; } .profile__photo { border-radius: 50%; border: 1px solid #000; }
在一个类上放上!important定义会使得覆盖代码变成一件令人头痛的事情,特别是当你试图处理媒体查询时。
这是我在处理Foundation的某个版本遇到的一个令人头痛的问题,因为他们决定对可见类打上!important。
这对于移动设备也是一个痛苦的根源。例如,如果你希望手机屏幕显示某些内容,则必须使用另一个!important类来重写.hide类以显示它。
我一直找不到使用!important的有效借口,除了在别人错误使用!important定义的情况下。
比如说在客户端项目中创建自己的网格CSS框架,可能就是一个重新发明轮子的例子。
根据我的经验,除非你想知道它是如何工作的,否则自己写这些东西其实并没有多大的好处。有许许多多的边缘情况可以让你自己动手编写代码,所以为什么不使用别人已经写好的免费又能工作良好的代码呢?
也就是说,自己动手创建可能是一个很好的学习经验——但这很可能不属于生产应用程序的过程。
好的,那么JavaScript插件呢?
在谈论JavaScript或jQuery插件时,我要说的是,对于任何你使用的具有很好集成选项的真正常见组件来说,情况也是如此。其中的一些例子是照片轮播的JavaScript转盘,或日期选择器。
这里的边缘案例是使用一些带有封装组件逻辑的JavaScript框架的插件(React,Ember,Angular等)。如果你想要做的事情相对简单,有时可能将这些插件放到组件中会更麻烦。
例如,我会使用立即可用的Foundation或Bootstrap模块,如果我正工作于依赖jQuery的项目,但是会在React中构建我自己的模块(只是因为编写组件以便通过引入jQuery插入到React组件中会更容易)。
最后,我要向你建议的最重要的事情是,你得关注你为前端编写的代码,掌握它,并持之以恒地改进它(统计提高自己!)。
我相信这是长期可维护的应用程序与难以处理的应用程序之间最大的区别因素之一。
通过遵循编写CSS的八个技巧,你将为自己和未来继承你的代码的开发人员节省时间和精力。
你遵循什么准则来组织和精简你的CSS?欢迎留言,共同进步。
英文原文:8 CSS Strategies for Writing Maintainable, Streamlined Front-End Code