当下,构建交互式应用程序的主流技术是 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 诞生的目的问题,以及 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 框架。
Electron 首先被我们排除。虽然微软用它做出了 VSCode 这样成熟的跨平台应用程序,但也投入了巨大的成本,并且一般开发者可没有这么雄厚的财力。
但最关键的是,VSCode 其实是用 Web 技术做出来的,Electron 只是帮助它做成了跨平台应用而已。
看看我们还有什么其他选择:
随着近年来 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,因为它引入了另一种新的、陌生的语言 Dart,以及额外的虚拟机负担。
Flutter 真正的问题在于与现有生态系统的兼容性,因为人们倾向于更喜欢重用已建立的资源和维护成熟的应用程序。编程语言也是出于同样的原因。
为了解决 Flutter 的一些问题,有些优秀开发者们尝试开发了 Flutter 的 JavaScript 版本,虽然后来失败了。因为 Flutter 本身正在迅速迭代,以至于两者无法融洽。不过这部分的工作导致诞生了 Kraken 框架,它允许编码人员编写 HTML,并使用 Flutter 引擎进行跨平台渲染。
等等...发生了什么?在非 Web 框架中再次编写 HTML?
不!再也不想写 HTML 了!
尽管如此,我们不得不承认,HTML+CSS 是表示 UI 的一个很好的组合,因为:
但是在实践中,UI 的工程有时是没有意义且不必要的。假设我们已经有了设计师提供的高保真设计原型,编码人员需要做的是:
第一部分总是让人头疼的源头:涉及大量的细节、耗时、需要与设计师进行讨论反复沟通,沟通成本很高,如果设计更新,代码也需要更新,也许还需要另一场“昂贵”的讨论。
更不用说,这种工作通常被视为费时费力没技术含量工作,也因此就有了大家听到的前端程序员通常被其他非前端程序员所鄙视。
一些聪明的开发者想出了使用编译器技术或更具体地说是转换器技术来实现设计到代码的解决方案,将整个高保真设计转换为机器生成的 HTML+CSS 代码。这个就是所谓的 Design to Code。
但它是为产品经理和设计师量身定制的,而不是为开发人员。这种内在问题包括但不限于:
总之,从开发者的角度来看,Design to Code 不是一个好的技术解决方案。
现在让我们看看什么是 Design as Code。
在 VGG 所倡导的 Design as Code 开发流程中,用户可以在某种程度上抛弃 HTML+CSS。
因为设计稿完全替代了 HTML+CSS 的角色,设计就是代码。请记住 VGG 的第一性原则:通过消除冗余的开发工作来弥合设计与开发两方之间的巨大鸿沟。
很明显的优势:图形用户界面的设计和开发只需要进行一次,因为两者实际上是一体的。因此两者的摩擦、讨论会减少,这让双方都更高效。
对于开发人员来说,他们能够直接在设计文件上编写业务逻辑,然后由 VGG 将其运行为一个交互式图形应用程序。这可以节省大量重复的工作,不仅提高了开发人员的工作效率,也为整个团队增加了工作效率。
Design as Code 的想法很简单,但它实现起来非常困难,比如会遇到来自编译器技术、编程接口抽象和图形渲染方面的工程挑战。
因此,为了实现 VGG 的 Design as Code 开发流程
VGG 天生就有着对开发生态很好的兼容性。相比于低代码,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框架。
在今天的数字时代,网页设计和开发已经成为创造令人印象深刻在线体验的关键。为了满足这一需求,Bootstrap 应运而生,它是一款以移动为先的 CSS 框架,不仅能帮助你构建外观优雅的响应式网页界面,还大大简化了开发过程。
Bootstrap 的核心在于其强大的栅格系统,这一系统使得开发者可以为各种屏幕尺寸创建灵活的布局。更重要的是,Bootstrap 提供了大量现成的组件,比如导航栏、卡片和模态框,这些都让开发变得更加迅速和高效。
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>
);
}
Tailwind CSS 以其独树一帜的“工具优先”设计理念,在前端开发社区中引起了广泛关注。它与传统的 CSS 框架不同,不提供预设样式的组件,而是通过提供大量的低级实用类(utility classes),让开发者能够构建出完全定制的设计。这种方法提供了前所未有的灵活性和可扩展性,使得开发者可以精准控制网页的每一个细节。
Tailwind CSS 的独特特点
如何集成 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>
);
}
Foundation 是一款开源的、响应式的前端框架,它极大地简化了创建在任何设备上都能完美运行的响应式网站、应用程序和电子邮件的过程。由于其出色的灵活性和易用性,Foundation 已被包括 Facebook、eBay、Mozilla、Adobe 乃至 Disney 在内的许多公司采用于他们的项目中。
Foundation 提供了一个强大而灵活的响应式栅格系统,并且包括了许多方便的选项、模态框(modals)、排版(typography)、导航组件以及表单元素,设计师可以快速将这些元素集成到他们的产品中。此外,Foundation 的模块化架构意味着你可以根据需要,使用它的部分或全部功能。
Foundation 的独特特性
如何在项目中集成 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 提供的样式和组件优势。
Bulma 是一个轻量级的 CSS 框架,以其简单性、响应性和定制选项著称。它与其他 UI 框架的不同之处在于,Bulma 是基于 Flexbox 构建的,Flexbox 是一种 CSS 布局模型,能够根据容器的宽度调整页面元素的宽度,这使得创建网格等任务变得非常简单,并且是框架轻量化的原因之一。
Bulma 的主要特点
如何在项目中集成 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,专注于实现更好的用户体验和界面设计。
UIKit 是一个开源的框架,专门用于构建 Web 应用程序的用户界面。它与其他 UI 框架在结构和设计哲学上有所不同。不同于其他遵循传统 BEM 方法论的框架,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 框架:
通过这种综合评估方法,你可以更全面地理解每个框架如何适应你的项目需求,从而做出明智的选择。记住,最适合项目的框架不一定是最流行或最新的,而是最能满足你项目特定需求的那一个。分享你的概念验证经验和框架选择理由,不仅能帮助团队成员理解决策过程,也能为面临相似选择的其他开发者提供参考。
天这篇文章主要分享 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技巧,希望对你有所帮助,如果你觉得有用的话,请记得点赞我关注我。
*请认真填写需求信息,我们会在24小时内与您取得联系。