當下,構建交互式應用程序的主流技術是 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小時內與您取得聯系。