Boilerform:后续

Avatar of Andy Bell
Andy Bell 发表

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200美元免费额度!

当 Chris 撰写他的 Boilerform 想法时,我其实已经开始思考一个新项目了。我刚刚决定结束我的 前端样板 项目,并想要一些新的东西来思考。Chris 的想法立即引起了我的共鸣,所以我像一只兴奋的小狗一样热情地参与了评论。这种兴奋让我着手构建 Boilerform 的初始版本,你可以在 这里查看。

我最初兴奋的原因是我对表单有一种“罪恶的快乐”。在不同的工作中,我曾以非常高的强度处理过表单,并从中学习了很多关于表单的知识。这包括构建动态表单生成器到为 Harley-Davidson® 网站平台提供高级垃圾邮件防护。每个不同的项目都让我看到了流程的前端和后端。这些项目中的每一个也都在逐渐磨损我对于快速、懒惰地实现表单的容忍度,因为我看到了这种做法在规模化后的灾难性后果。

但是,嘿,我们不是坏人。表单确实很糟糕。尽管现在好了一些:每个浏览器对表单的处理方式略有不同。例如,查看来自各种浏览器和操作系统的这些选择菜单。没有一个看起来是一样的。

这些只是不一致的冰山一角。

由于这些不一致性,很容易理解为什么开发人员会放弃深入挖掘,或者只是快速使用 Bootstrap 并完成它。此外,根据我的经验,小型表单(例如联系表单)的设计通常会被留到项目后期,这时大部分积极的势头已经过去了。我甚至犯过在网站发布前一天才构建联系表单的错误。😬

显然,有机会让使用表单的过程(至少在前端)变得更好,我无法抗拒改进它的诱惑!

规划

我坐下来思考在使用表单时有哪些痛点,以及作为表单用户哪些东西让我感到恼火。我决定,作为一名开发人员,我讨厌为表单设置样式。作为用户,糟糕的表单字段会让我感到恼火。

后者的一个例子是电子邮件字段。现在,如果你尝试在 iOS 设备上填写电子邮件字段,你会遇到浏览器将第一个字母大写这个恼人的特性,因为它将其视为句子。要停止这种行为,只需在你的字段中添加autocapitalize="none"即可。我知道这不是一个普遍的知识,因为我很少看到它被使用,但它是一个快速且能对用户产生积极影响的解决方案。

我希望将这些小技巧直接融入 Boilerform,以帮助开发人员让用户的体验更轻松。创建前端样板或框架不仅仅是关于样式和美观。它还关乎与他人分享你积累的经验,以整体改善行业环境。

规范

我需要考虑在初始发布时,我希望 Boilerform 作为最小可行产品实现哪些功能。我提出了以下规则

  • 它必须与大多数前端兼容
  • 它必须有良好的文档
  • 它必须轻量级
  • 任何人都应该能够将 CDN 链接放到他们的<head>中,并使其正常工作
  • 任何人也应该能够扩展源代码以用于自己的项目
  • 它不应该过于武断

为了实现这些目标,我需要做出一些技术决策。我决定选择一个低门槛的设置。具体如下:

  • Sass 驱动的 CSS
  • BEM
  • 纯 HTML
  • 一个基本的编译设置

我还将注意力集中在示例上。CodePen 是自然之选,因为它们可以很好地嵌入。用户还可以复制它们并自己尝试。

最后一个决定是推出一个 模式库,将组件分解成小块。这在几个方面帮助了我。主要体现在组织方面——但它也帮助我以一种零散的方式构建 Boilerform,因为我是在晚上利用空闲时间进行开发的。

我有了计划和技术栈,于是开始动手。

保持简单

像这样的项目很容易失控,因此,为 Boilerform 制定一些关于它是什么以及它不是什么的要点非常有用。

Boilerform 将是什么

  • 它将始终是一个样板,帮助你为项目开个好头
  • 它将提供关于 HTML、CSS 和 JavaScript 的高级帮助,以简化开发人员和用户的体验
  • 它将力求超级轻量级,因此不会成为沉重的负担
  • 它将提供可配置选项,使其灵活且易于融入大多数 Web 项目

Boilerform 将不会是什么

  • 它不会是表单的灵丹妙药——它仍然需要一些工作
  • 它不会像 Bootstrap 或 Foundation 那样是一个完整的框架,因为它始终是一个起点
  • 它的 CSS 和 JavaScript 不会过于武断
  • 它永远不会针对某个特定的框架或 Web 技术

细节

我知道你们都喜欢深入了解事物的工作原理,所以让我带你们快速浏览一下!

CSS 命名空间

我首先解决的是命名空间问题。我处理过很多不同的网站和设置,它们在 CSS 方面都存在一个共同点:冲突。考虑到这一点,我编写了一个 @mixin,将所有 CSS 包裹在一个.boilerform命名空间中。

// Source Sass
.c-button {
  @include namespace() {
    background: gray;
  }
}

// This compiles to this with Sass: 
.boilerform .c-button { background: gray; }

这个 mixin 目前很简单,但它给了我们扩展的灵活性。如果我们想以后选择是否使用命名空间,我们只需要更新这个 mixin。我喜欢这种模块化。

现在,它为我们提供了安全性。没有任何东西从 Boilerform 中泄漏出来,希望任何泄漏进来都会被命名空间重置和规则处理。

带前缀的 BEM

我喜欢 BEM。几年来,它一直是我 CSS 和标记的核心。我喜欢 BEM 的一点是它可以帮助你构建小型、封装的组件。这对于像 Boilerform 这样的项目来说非常完美。

由于命名空间的存在,我可能可以安全地定位裸元素,但 BEM 不仅仅是为所有东西添加类。它赋予我和其他人自由,让我们可以编写任何我们想要的标记结构。对于其他人来说,也很容易理解代码,并了解 HTML 和 CSS 中哪些内容是相关的。

我为这个设置添加的另一件事是组件前缀。我们没有使用.input-field组件,而是使用了.c-input-field组件。我希望这样的小细节可以帮助新贡献者立即识别出什么是组件。

为糟糕的输入添加酷炫的样式

如上所述,选择菜单的样式很难设置。单选按钮和复选框也是如此。

我一直使用的一个技巧是将样式抽象到其他更友好的 HTML 元素。例如,对于<select>元素,我将它们包装在一个.c-select-field组件中,并使用兄弟元素添加一致的下拉箭头。

对于复选框和单选按钮,我会视觉上隐藏主输入,并使用相邻的<label>元素来显示状态变化。使用这种方法可以大大简化对这些控件的操作。重要的是,我们也保留了可访问性和原生事件。

简化表单:基础属性

我在上面关于电子邮件字段和大小写的示例中提到了这一点,但这并不是唯一添加的有用属性。

  • 搜索字段具有autocorrect="off"属性,以防止浏览器尝试更正拼写。我强烈建议您将此属性添加到用户输入其姓名的输入字段中。
  • 数字字段设置了minmaxstep属性,以帮助进行验证。对于键盘用户来说,这也是一个很棒的功能。
  • 所有字段都具有空的nameid属性,希望能够加快连接过程。

我当然希望能够扩展这些功能,因为像这样的微调对于用户体验非常棒。

未来展望:期待您的参与

Boilerform 目前处于良好的状态,但它具有巨大的潜力。我对于其持续开发的一些想法包括:

  • 引入多个 JavaScript 库集成,例如 React、Vue 和 Angular。
  • 模式库中创建一些基本表单布局。
  • 创建用于样式化恼人元素(如占位符)的 Sass 混合。
  • 改进可配置性。
  • 添加新的元素,例如范围输入
  • 创建多语言文档。

如您所见,这是一个很大的工作量,因此如果我们能够让一些贡献者加入项目,为我们的社区创造真正有用的东西,那就太棒了。吸引具有不同专业领域和背景的贡献者将帮助我们使其尽可能多地对人们有用,从最终用户到后端开发人员。

让我们一起创造一些伟大的东西。🙂

查看项目网站GitHub 存储库