整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端苦HTML+CSS久已

当下,构建交互式应用程序的主流技术是 Web 技术,其中包括 HTML、CSS 与 JavaScript。

在过去的 10 年,Web 技术生态发生了翻天覆地的变化,包括层出不穷的开发框架,诸如 React、Vue、Svelte,也包括日新月异的前端工程化工具,比如 Webpack、esbuild、Vite 等等。

但归根结底,他们都逃不开 HTML、CSS、JavaScript 三剑客的范畴。

Web 技术生态成熟、稳定,然而却存在一个致命的问题:使用 Web 技术去构建跨平台应用程序并不是一件简单的事情。

这也是为什么许多平台特定的框架(platform-specific frameworks)与跨平台框架(cross-platform frameworks)依然受到欢迎的原因。

比如其中最著名的跨平台框架 Flutter,它部分基于浏览器引擎的技术,实现了「编写一次,全平台运行」的目标。而且这些框架,也基本不使用 HTML、CSS 这些 Web 技术。这是为什么呢?

苦 HTML+CSS 久已

因为 HTML 诞生的目的问题,以及 HTML 与 CSS 的开发体验问题。

HTML 即超文本标记语言,最初是三十年前为了制作可链接的文档而发明的,而不是为了做应用程序。它更多是一种标记而不是一种语言。大多数人甚至都不将编写 HTML 视为编程,因为它根本不是一种编程语言。

直到出现 HTML5 (通常被称为 H5)、CSS3 和 ES5 版本之后的 JavaScript,人们才逐渐开始用这些技术制作 Web 应用程序。在那之前,HTML 只是用于完成他最开始的目的。

但做成 Web 应用的可行性,最大还是来自于 JavaScript 性能的提升。

上面是 Lin Clark 介绍 JavaScript 性能历史的一张图。从2008年开始,JavaScript 性能就开始飞速提升。这对于应用程序的最终用户来说有巨大的好处,因为做出来的应用程序终于不卡了,甚至可以对性能有所期待了。

但是,对于开发者来说,仍然逃不开编写 HTML+CSS。

就算使用一些前沿的前端框架,如 React、Vue、Angular 等,我们仍然需要编写类似 HTML 的代码,并仔细调整 CSS 或者 CSS 预处理器(如 SCSS、Saas)的样式表。

这缓慢、枯燥、而且乏味。

太多的人力、时间被浪费在实现图形用户界面的细节上,使用一些并不是一开始就为了 UI 而设计的技术。这导致开发者经常要来回调整样式、处理浏览器兼容性问题、应用奇怪的 CSS 技巧、避开性能陷阱等等。

另外,还需要在过度发展的 NPM 生态系统中,使用那些复杂的前端工程工具来进行应用程序的构建。这个过程效率也非常低下,开发体验非常痛苦。更不要说 Web 应用在跨平台需求中会遇到更多的陷阱,比如平台兼容性、体积大小、性能问题,等等。

此刻,我们质疑,坚持使用 HTML 和 CSS 的理由到底是什么?

其他非 Web 框架

然后我们再回过头来看看其他的非 Web 框架。

Electron 首先被我们排除。虽然微软用它做出了 VSCode 这样成熟的跨平台应用程序,但也投入了巨大的成本,并且一般开发者可没有这么雄厚的财力。

但最关键的是,VSCode 其实是用 Web 技术做出来的,Electron 只是帮助它做成了跨平台应用而已。

看看我们还有什么其他选择:

  • 有一些是自计算机黄金时代开始就存在的特定平台的框架,例如 Windows 的 MFC,macOS 的 Cocoa,以及 UNIX/Linux 的 GTK。其他一些则是更现代的移动端框架,如专门为 iOS、Android 或其他移动操作系统专门服务的开发框架。
  • 而在跨平台框架中,值得注意的是广泛采用的 Qt 框架。但它主要用于桌面软件开发。这里的跨平台主要是指跨越不同的桌面操作系统,如 Windows/Linux/macOS,但这几年 Qt 也逐渐在往移动端与 Web 端在努力,虽然没有取得什么成就。
  • 第三种就是这几年开始流行的全新跨端方案,如 Flutter,它是一个以移动端为主的跨平台框架,但在 Web 端和桌面端也有所作为。

随着近年来 Web 应用的比例不断增加,桌面端应用逐渐式微。但正是因为 Web 应用在跨端上的致命问题,这些非 Web 框架仍有一席之地,并且看上去也具有不可替代性。

当然,其中的某些年代过于久远的开发框架,开发人员的体验甚至比编写 HTML 更糟糕,因为他们可能被迫编写类似于这样的命令式和面向对象的代码。

var count = 0
let stack = new VStack
let text = new Text("Count: \(count)")
stack.add_child(text)
let button = new Button("Increment")
button.set_onclick(||
    count += 1
    text.set_text("Count: \(count)")
)
stack.add_child(button)

不是编写声明式且响应式的代码,就像程序员一直梦寐以求的这样:

struct AppState {
    count: i32
}


VStack {
    Text("count: \(state.count)")
    Button("Increment") {
        state.count += 1
    }
}

这就是为什么 Flutter 看起来像是开发应用程序的灵丹妙药:

  • Flutter 是声明式且响应式的。
  • Flutter 真正实现了跨平台,可以制作所有桌面、移动和 Web 应用程序。

不过也还是有开发者不喜欢 Flutter,因为它引入了另一种新的、陌生的语言 Dart,以及额外的虚拟机负担。

Flutter 真正的问题在于与现有生态系统的兼容性,因为人们倾向于更喜欢重用已建立的资源和维护成熟的应用程序。编程语言也是出于同样的原因。

为了解决 Flutter 的一些问题,有些优秀开发者们尝试开发了 Flutter 的 JavaScript 版本,虽然后来失败了。因为 Flutter 本身正在迅速迭代,以至于两者无法融洽。不过这部分的工作导致诞生了 Kraken 框架,它允许编码人员编写 HTML,并使用 Flutter 引擎进行跨平台渲染。

等等...发生了什么?在非 Web 框架中再次编写 HTML?

Design to Code

不!再也不想写 HTML 了!

尽管如此,我们不得不承认,HTML+CSS 是表示 UI 的一个很好的组合,因为:

  • HTML 负责内容的结构,CSS 负责内容的样式。
  • 结构和样式是解耦的,这对工程来说是有好处的。

但是在实践中,UI 的工程有时是没有意义且不必要的。假设我们已经有了设计师提供的高保真设计原型,编码人员需要做的是:

  1. 使用代码重新实现设计原型,这在 99% 的情况下是 HTML+CSS 的事情。
  2. 为刚刚重新实现的 UI 添加业务逻辑。

第一部分总是让人头疼的源头:涉及大量的细节、耗时、需要与设计师进行讨论反复沟通,沟通成本很高,如果设计更新,代码也需要更新,也许还需要另一场“昂贵”的讨论。

更不用说,这种工作通常被视为费时费力没技术含量工作,也因此就有了大家听到的前端程序员通常被其他非前端程序员所鄙视。

一些聪明的开发者想出了使用编译器技术或更具体地说是转换器技术来实现设计到代码的解决方案,将整个高保真设计转换为机器生成的 HTML+CSS 代码。这个就是所谓的 Design to Code。

但它是为产品经理和设计师量身定制的,而不是为开发人员。这种内在问题包括但不限于:

  • 生成的代码可读性差,不符合项目中现有的编码风格。
  • 生成代码的不易集成。如果它依赖于另一个第三方库怎么办?如果生成的代码更新了,整个大片的变化在版本控制系统中体现是否合理?
  • 像 Sketch 或 Figma 这样的设计工具,总是可以设计出比 HTML+CSS 可以实现的更高级的视觉效果。他们甚至可以精确控制每一个像素。而很多时候,生成的代码可能无法产生与设计原型完全相同的 UI,绝对需要一些补丁。但如果生成的代码更新了,补丁就无法再应用了怎么办?

总之,从开发者的角度来看,Design to Code 不是一个好的技术解决方案。

现在让我们看看什么是 Design as Code。

Design as Code

在 VGG 所倡导的 Design as Code 开发流程中,用户可以在某种程度上抛弃 HTML+CSS。

因为设计稿完全替代了 HTML+CSS 的角色,设计就是代码。请记住 VGG 的第一性原则:通过消除冗余的开发工作来弥合设计与开发两方之间的巨大鸿沟。

很明显的优势:图形用户界面的设计和开发只需要进行一次,因为两者实际上是一体的。因此两者的摩擦、讨论会减少,这让双方都更高效。

对于开发人员来说,他们能够直接在设计文件上编写业务逻辑,然后由 VGG 将其运行为一个交互式图形应用程序。这可以节省大量重复的工作,不仅提高了开发人员的工作效率,也为整个团队增加了工作效率。

Design as Code 的想法很简单,但它实现起来非常困难,比如会遇到来自编译器技术、编程接口抽象和图形渲染方面的工程挑战。

因此,为了实现 VGG 的 Design as Code 开发流程

  • VGG 定义了下一代矢量图形规范 VGG Specs (https://docs.verygoodgraphics.com/specs/overview)
  • 实现了 VGG runtime 开源引擎 (https://github.com/verygoodgraphics/vgg_runtime)
  • 提供各种 VGG 容器,实现了对各种平台和框架的嵌入式支持。

VGG 天生就有着对开发生态很好的兼容性。相比于低代码,VGG 是一套真正为开发者设计的工具。小结:

  • VGG 主打 Design as Code,直接使用设计稿代替 HTML+CSS 去实现用户界面。
  • VGG 将设计稿变成了跨平台的应用,为开发者节约了更多的时间与成本。

基于以上两点,VGG 以及它主打的 Design as Code 可以为现代交互式应用开发带来巨大的好处。在最终用户对用户界面的实际使用效果没有明显感知差异的前提下,大大提升了应用开发者的开发体验,甚至可以让设计师、产品经理来承担一部分的界面开发工作:无非是把现有的设计工具当作一个 UI Builder 来使用罢了。

下面引用来自 VGG Github 首页的一张图,来更好地说明 Design as Code 的概念与 VGG 的有机组成:

展望

在这篇文章中,我们讨论了 Web 技术、特定平台的框架、跨平台框架、Design to Code 解决方案以及基于 VGG 开源引擎的 Design as Code 开发流程。

我们提出了 Design as Code 的概念,介绍了 VGG 作为一个全新的开发交互式图形应用程序的框架。但 VGG 仍然年轻,因为还有许多技术挑战需要克服,VGG 运行时引擎现已开源,欢迎大家一起参与 VGG 开源社区共建。

关于 VGG 的更多细节将在后续的文章中讨论。如果您感兴趣,可以继续阅读官方博客和文档
https://blog.verygoodgraphics.com/

2024年选择适合项目的CSS框架至关重要。这将为构建新的用户界面(UI)组件所需的总体努力定下基调。目前,最重要的是更快地发布新功能,以保持客户的满意度。因此,你需要一个易于使用的CSS框架,它能够提供现成的UI元素。

下面,我们来看看2024年值得尝试的最佳CSS框架。

1、Bootstrap

在今天的数字时代,网页设计和开发已经成为创造令人印象深刻在线体验的关键。为了满足这一需求,Bootstrap 应运而生,它是一款以移动为先的 CSS 框架,不仅能帮助你构建外观优雅的响应式网页界面,还大大简化了开发过程。

Bootstrap 的核心在于其强大的栅格系统,这一系统使得开发者可以为各种屏幕尺寸创建灵活的布局。更重要的是,Bootstrap 提供了大量现成的组件,比如导航栏、卡片和模态框,这些都让开发变得更加迅速和高效。

Bootstrap 的独特之处

  • 响应式栅格系统:这是 Bootstrap 的核心特性之一,允许网页内容根据不同的屏幕尺寸自动调整布局,从而在手机、平板和桌面上都能提供良好的用户体验。
  • 丰富的预制组件:Bootstrap 提供了大量的预制组件,如导航栏、卡片、模态框等,使得开发者可以轻松实现复杂的UI设计。
  • 快速样式调整的实用类:通过实用类,Bootstrap 使得页面的样式调整变得快速简单,无需编写大量的自定义CSS。
  • 增强功能的JavaScript插件:Bootstrap 还提供了一系列JavaScript插件,进一步扩展了网页的交互性和动态效果。
  • 活跃的社区和丰富的文档:Bootstrap 拥有一个活跃的开发者社区和详尽的文档,为使用者提供了强大的支持。

如何将 Bootstrap 与现代框架结合使用

如果你在使用 React 开发项目,可以轻松地将 React Bootstrap 库安装到你的项目中,通过这种方式,你可以在保持 React 的组件化开发模式的同时,享受 Bootstrap 提供的样式和组件优势。

import ButtonGroup from 'react-bootstrap/ButtonGroup';
import Dropdown from 'react-bootstrap/Dropdown';
import DropdownButton from 'react-bootstrap/DropdownButton';
import './bootstrap.css';

export function Bootstrap() {
  return (
    <div className="button">
      {['Primary', 'success', 'danger'].map((variant) => (
        <DropdownButton
          as={ButtonGroup}
          key={variant}
          id={dropdown-variants-${variant}}
          variant={variant.toLowerCase()}
          title={variant}
          <Dropdown.Item eventKey="1">Action</Dropdown.Item>
          <Dropdown.Item eventKey="2">Another action</Dropdown.Item>
          <Dropdown.Item eventKey="3" active>
            Active Item
          </Dropdown.Item>
          <Dropdown.Divider />
          <Dropdown.Item eventKey="4">Separated link</Dropdown.Item>
        </DropdownButton>
      ))}
      <br />
      <Dropdown>
        <Dropdown.Toggle variant="success" id="dropdown-basic">
          Dropdown Button
        </Dropdown.Toggle>
        <Dropdown.Menu>
          <Dropdown.Item href="#/action-1">Action</Dropdown.Item>
          <Dropdown.Item href="#/action-2">Another action</Dropdown.Item>
          <Dropdown.Item href="#/action-3">Something else</Dropdown.Item>
        </Dropdown.Menu>
      </Dropdown>
    </div>
  );
}

2、Tailwind CSS

Tailwind CSS 以其独树一帜的“工具优先”设计理念,在前端开发社区中引起了广泛关注。它与传统的 CSS 框架不同,不提供预设样式的组件,而是通过提供大量的低级实用类(utility classes),让开发者能够构建出完全定制的设计。这种方法提供了前所未有的灵活性和可扩展性,使得开发者可以精准控制网页的每一个细节。

Tailwind CSS 的独特特点

  • 工具优先的设计方式:Tailwind 的核心思想是通过实用类直接在 HTML 中应用样式,极大地提高了开发效率和灵活性。
  • 高度可定制:通过配置文件,开发者可以自定义 Tailwind 的主题、颜色、间距等,以适应项目的具体需求。
  • 没有预构建的组件:与其它框架不同,Tailwind 不提供预构建的组件。这意味着所有的样式都是由开发者从头开始构建的,确保了设计的独特性。
  • 响应式设计:Tailwind 提供了响应式设计的支持,通过断点(breakpoints)可以轻松实现不同屏幕尺寸下的样式适配。
  • 与 PurgeCSS 的集成:通过集成 PurgeCSS,Tailwind 能够在生产环境下自动移除未使用的 CSS,优化项目的加载速度。
  • JIT(即时编译)模式:Tailwind 的 JIT 模式使得开发过程中的样式更改能够即时反映,进一步提升开发效率。

如何集成 Tailwind CSS

集成 Tailwind CSS 到项目中并非一蹴而就,首先需要设置 Tailwind 编译器。通过在项目的配置文件中指定要处理的内容和自定义主题,然后通过插件来扩展功能,你可以开始使用 Tailwind 提供的实用类来编写 CSS。

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js}"],
  theme: {
    extend: {},
  },
  plugins: [],
}

以下是相关的使用示例

export function Tailwind() {
  const ContactTextArea = ({
    row,
    placeholder,
    name,
    defaultValue,
  }: {
    row: number;
    placeholder: string;
    name: string;
    defaultValue: string;
  }) => {
    return (
      <>
        <div className="mb-6">
          <textarea
            rows={row}
            placeholder={placeholder}
            name={name}
            className="w-full resize-none rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
            defaultValue={defaultValue}
          />
        </div>
      </>
    );
  };

const ContactInputBox = ({
    type,
    placeholder,
    name,
  }: {
    type: string;
    placeholder: string;
    name: string;
  }) => {
    return (
      <>
        <div className="mb-6">
          <input
            type={type}
            placeholder={placeholder}
            name={name}
            className="w-full rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
          />
        </div>
      </>
    );
  };
  return (
    <section className="relative z-10 overflow-hidden bg-white py-20 dark:bg-dark lg:py-[120px]">
      <div className="w-full px-4 lg:w-1/2 xl:w-5/12">
        <div className="relative rounded-lg bg-white p-8 shadow-lg dark:bg-dark-2 sm:p-12">
          <form>
            <ContactInputBox type="text" name="name" placeholder="Your Name" />
            <ContactInputBox
              type="text"
              name="email"
              placeholder="Your Email"
            />
            <ContactInputBox
              type="text"
              name="phone"
              placeholder="Your Phone"
            />
            <ContactTextArea
              row={6}
              placeholder="Your Message"
              name="details"
              defaultValue=""
            />
            <div>
              <button
                type="submit"
                className="w-full rounded border border-primary bg-primary p-3 text-white transition hover:bg-opacity-90"
                Send Message
              </button>
            </div>
          </form>
          <div />
        </div>
      </div>
    </section>
  );
}

3、Foundation

Foundation 是一款开源的、响应式的前端框架,它极大地简化了创建在任何设备上都能完美运行的响应式网站、应用程序和电子邮件的过程。由于其出色的灵活性和易用性,Foundation 已被包括 Facebook、eBay、Mozilla、Adobe 乃至 Disney 在内的许多公司采用于他们的项目中。

Foundation 提供了一个强大而灵活的响应式栅格系统,并且包括了许多方便的选项、模态框(modals)、排版(typography)、导航组件以及表单元素,设计师可以快速将这些元素集成到他们的产品中。此外,Foundation 的模块化架构意味着你可以根据需要,使用它的部分或全部功能。

Foundation 的独特特性

  • 灵活的响应式栅格系统:Foundation 的栅格系统提供了丰富的布局选项,使得创建响应式设计变得简单高效。
  • 模块化架构:这允许开发者自定义所需的功能,确保了框架的灵活性和扩展性。
  • Sass 预处理器:Foundation 使用 Sass 预处理器进行样式的编写,进一步增强了样式定义的灵活性和可维护性。
  • 内建组件和响应式导航:框架提供了一系列预建的组件和响应式导航,加速了开发流程并提高了用户体验。
  • Flexbox 和块级网格支持:这些现代布局技术的支持使得创建复杂的布局结构变得更为简单。
  • 可访问性特性:Foundation 在设计时考虑了可访问性,帮助开发者创建符合 WCAG 标准的网站。

如何在项目中集成 Foundation

通过如下示例代码,可以看到如何在 React 项目中使用 Foundation:

import { Menu, MenuItem } from 'react-foundation';

export function Foundation() {
  return (
   <Menu style={{ marginLeft: '34px' }}>
     <MenuItem>
       <a href="/">Home</a>
     </MenuItem>
     <MenuItem>
       <a href="/">Blog</a>
     </MenuItem>
     <MenuItem>
       <a href="/">About</a>
     </MenuItem>
     <MenuItem>
      <a href="/">Contact</a>
     </MenuItem>
   </Menu>
  );
}

这个例子展示了如何使用 Foundation 的 Menu 和 MenuItem 组件来创建一个简单的导航菜单。这种集成方式使得在保持 React 组件化开发模式的同时,还能享受 Foundation 提供的样式和组件优势。

4. Bulma

Bulma 是一个轻量级的 CSS 框架,以其简单性、响应性和定制选项著称。它与其他 UI 框架的不同之处在于,Bulma 是基于 Flexbox 构建的,Flexbox 是一种 CSS 布局模型,能够根据容器的宽度调整页面元素的宽度,这使得创建网格等任务变得非常简单,并且是框架轻量化的原因之一。

Bulma 的主要特点

  • 基于 Flexbox 的现代 CSS 框架:利用 Flexbox,Bulma 为开发者提供了一种更灵活、简洁的方式来创建布局,无需复杂的布局计算。
  • 易用且直观的语法:Bulma 的类名清晰直观,使得即使是 CSS 新手也能快速上手。
  • 无 JavaScript 依赖:Bulma 完全由 CSS 构成,这意味着你可以在不添加任何 JavaScript 的情况下使用它,减少了前端项目的复杂度。
  • 内建的响应式设计修饰符:Bulma 提供了一系列修饰符用于创建响应式设计,使得适应不同屏幕尺寸的布局变得简单。
  • 组件化:如导航栏、模态框、标签页等,Bulma 提供了丰富的组件库,方便开发者快速实现常见的 UI 功能。
  • 通过 Sass 可扩展:Bulma 允许通过 Sass 进行定制,开发者可以根据项目需求调整颜色、间距等参数。

如何在项目中集成 Bulma

将 Bulma 集成到项目中相当简单,只需导入 Bulma 的 CSS 文件即可开始使用它提供的各种样式和组件。以下是一个使用 Bulma 创建分页导航的示例:

import 'bulma/css/bulma.min.css';

export function Bulma() {
  return (
    <div>
      <nav className="pagination" role="navigation" aria-label="pagination">
        <a href="/" className="pagination-previous">
          Previous
        </a>
        <a href="/" className="pagination-next">
          Next Page
        </a>
        <ul className="pagination-list">
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 1">
              1
            </a>
          </li>
          <li>
            <span className="pagination-ellipsis">…</span>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 45">
              45
            </a>
          </li>
          <li>
            <a
              href="/"
              className="pagination-link is-current"
              aria-label="Page 46"
              aria-current="page"
              46
            </a>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 47">
              47
            </a>
          </li>
          <li>
            <span className="pagination-ellipsis">…</span>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 86">
              86
            </a>
          </li>
        </ul>
      </nav>
    </div>
  );
}

这个例子展示了如何利用 Bulma 的分页组件来创建一个简洁美观的分页导航。通过使用 Bulma,开发者可以节省大量的时间来设计和编写 CSS,专注于实现更好的用户体验和界面设计。

5. UIKit

UIKit 是一个开源的框架,专门用于构建 Web 应用程序的用户界面。它与其他 UI 框架在结构和设计哲学上有所不同。不同于其他遵循传统 BEM 方法论的框架,UIKit 采用了基于组件的结构。这种方式为组件的灵活性和可重用性提供了更大的空间,可以显著减少构建复杂用户界面所需的代码量。

UIKit 的主要特性

  • 模块化和轻量级框架:UIKit 的设计注重于提供一个轻量级的解决方案,便于快速开发和部署。
  • 响应式栅格系统:UIKit 提供了一个灵活的栅格系统,使得在不同设备上的布局变得简单和一致。
  • 预设计的组件:UIKit 包含了大量预设计的组件,如导航栏、滑块、模态框等,简化了开发流程。
  • 基于 Flexbox 的布局:UIKit 利用 Flexbox 布局,提供了一种更灵活的方式来创建复杂的布局结构。
  • 动画和过渡效果:UIKit 包含了丰富的动画和过渡效果,可以轻松地为界面添加视觉吸引力。
  • 可定制和可主题化:UIKit 提供了广泛的定制选项,使得开发者可以根据自己的需求调整样式和功能。

如何在项目中集成 UIKit

将 UIKit 集成到项目中非常直接,仅需导入 UIKit 的 CSS 文件即可开始使用其提供的样式和组件。以下是一个使用 UIKit 创建按钮的示例:

import 'uikit/dist/css/uikit.min.css';

export function Uikit() {
  return (
    <div className="uk-flex uk-flex-center uk-margin-top">
      <button
        type="button"
        className="uk-button uk-button-default uk-margin-left"
        onClick={() => alert('Cancel clicked!')}
      >
        Cancel
      </button>
    </div>
  );
}

这个例子演示了如何利用 UIKit 的按钮(Button)组件来创建一个简单的按钮,并使用 Flexbox 实现居中布局。通过 UIKit,开发者可以享受到高度灵活和易用的界面构建体验,同时也能保持代码的整洁和模块化。

总结

选择合适的 CSS 框架对于项目的成功至关重要。每个框架都有其独特的特点、优势和可能的限制,因此了解如何根据项目的具体需求挑选合适的框架是一项重要的技能。除了我们讨论的 Bootstrap、Tailwind CSS、Foundation、Bulma 和 UIKit 外,市面上还有许多其他的 CSS 框架,每个都有可能成为你项目的理想选择。

创建概念验证

创建概念验证(Proof-of-Concept,PoC)是评估 CSS 框架是否适合你项目的一个极好方法。通过这种方式,你可以实际操作并体验每个框架的学习曲线、灵活性、易用性以及它们如何适应你的项目需求。以下是一些建议,帮助你通过创建概念验证来选择正确的 CSS 框架:

  • 明确项目需求:在开始之前,清晰地定义你的项目需求,包括预期的功能、设计美学、响应式设计的要求等。
  • 研究框架的特性:深入了解每个框架的核心特性、设计理念和社区支持情况。
  • 评估学习曲线:尝试了解开始使用框架并达到一定熟练度所需的时间和努力,确保团队能够快速上手。
  • 考虑扩展性和维护性:选择那些提供良好文档、定期更新和社区支持的框架,以确保项目的长期可维护性。
  • 实践中测试:为每个框架创建小型的概念验证项目,实际操作它们来构建一些简单的布局或组件。这将帮助你直观地感受到使用框架的便利性和可能的挑战。
  • 性能考量:测试每个框架生成的 CSS 的大小和加载时间,确保它们不会对最终用户的体验产生负面影响。
  • 社区和资源:考虑框架的社区活跃度和可用资源。一个活跃的社区和丰富的学习资源可以在你遇到问题时提供帮助。

通过这种综合评估方法,你可以更全面地理解每个框架如何适应你的项目需求,从而做出明智的选择。记住,最适合项目的框架不一定是最流行或最新的,而是最能满足你项目特定需求的那一个。分享你的概念验证经验和框架选择理由,不仅能帮助团队成员理解决策过程,也能为面临相似选择的其他开发者提供参考。

天这篇文章主要分享 10 个鲜为人知的 CSS 技巧,这些技巧将成为你提高网页设计技能的秘密武器。

现在,我们就一起来看看这些CSS 技巧。

01. 网站平滑滚动

在<html>元素中添加scroll-behavior: smooth,以实现整个页面的平滑滚动。

html{
    scroll-behavior: smooth;
  }

02.链接的属性选择器

此选择器的目标是具有以“https”开头的 href 属性的链接。

a[href^="https"]{
    color: blue;
  }

03.〜合并兄弟姐妹

选择 <h2> 后面的所有兄弟元素 <p> 元素。

h2 ~ p{
    color: blue;
  }

04. :not() 伪类

该选择器将样式应用于不具有“特殊”类的列表项。

li:not(.special){
        font-stlye: italic;
    }

05. 用于响应式排版的视口单位

使用视口单位(vw、vh、vmin、vmax)可以使字体大小响应视口大小。

h1{
    font-size: 5vw;
  }

06. :empty 表示空元素

此选择器定位空的 <p> 元素并隐藏它们。

p:empty{
    display: none;
  }

07.自定义属性(变量)

您可以更轻松地定义和使用自定义属性

主题和维护。

:root{
    --main-color: #3498db;
  }


  h1{
    color: var(--main-color);
  }

08.图像控制的Object-fit属性

object-fit 控制如何调整替换元素(如 <img>)的内容大小。

img{
    width: 100px; 
    height: 100px;
    object-fit: cover;
  }

09. 简化布局的网格

CSS 网格提供了一种以更简单的方式创建布局的强大方法。

.container{
    display: grid;
    grid-tempalte-columns: 1fr 2fr 1fr;
 }

10. :focus-in 伪类

如果该元素包含任何具有 :focus 的子元素,则 :focus-within 会选择该元素。

form:focus-within{
    box-shadow: 0 0 5px rgba(0, 0, 0, 0, 0.2);
 }

总结

以上就是我想与你分享的10个CSS技巧,希望对你有所帮助,如果你觉得有用的话,请记得点赞我关注我。