LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Oat UI:CSS 写到崩溃,这个轻量级 UI 库,让我重新爱上原生 HTML

admin
2026年3月26日 13:45 本文热度 51

大家平时在写一些简单的网页,或者搞个小的开源项目 Demo 时,最头疼的是什么?

我相信很多人都会说是:写 CSS 样式。

最近我在 GitHub 上发现了一个开源项目 Oat UI

这是一个超级轻量级的前端 UI 库,目前已经在 GitHub 上收获了 4.5k+ Star。它的理念很简单:你只需要写原生的 HTML,页面就能自动美化,不需要什么复杂的工程化配置。

Oat UI 是什么?

Oat UI 是一个无类 CSS 框架,超轻量级的语义化 HTML + CSS + JS UI 组件库。

什么意思呢?传统的 UI 库(如 Bootstrap、Element UI)通常需要你在 HTML 标签上添加各种类名,比如 class="btn btn-primary"

而 Oat UI 完全不需要。它通过 CSS 的标签选择器,直接对原生 HTML 元素进行美化。

你写的 <button><table><form>,只要引入了 Oat UI,就会自动拥有统一、美观的样式。

不需要任何第三方库,纯原生实现,直接引入 CDN 文件,也不需要其它的构建工具。

来看下示例效果

这是一个没有任何 class 的表单示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Oat UI 演示</title>
</head>
<style>
    body
 {
        width
: 800px;
        margin
: 0 auto;
    }
</style>
<body>
    <h1>用户注册</h1>
    <p>这是一个没有任何 class 的表单示例。</p>
    <form>
        <div>
            <label for="username">用户名</label>
            <input type="text" id="username" placeholder="请输入用户名">
        </div>
        
        <div>
            <label for="email">邮箱</label>
            <input type="email" id="email" placeholder="请输入邮箱">
        </div>
        
        <div>
            <label for="password">密码</label>
            <input type="password" id="password" placeholder="请输入密码">
        </div>
        
        <div>
            <label for="role">角色</label>
            <select id="role">
                <option>开发者</option>
                <option>设计师</option>
                <option>产品经理</option>
            </select>
        </div>
        
        <button type="submit">立即注册</button>
    </form>
    <hr>
    <h2>数据报表</h2>
    <table>
        <thead>
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>职业</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>张三</td>
                <td>28</td>
                <td>前端工程师</td>
            </tr>
            <tr>
                <td>李四</td>
                <td>32</td>
                <td>后端架构师</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

上面代码的效果是这样:

界面看起来可以说是非常的古老。

那 Oat UI 怎么使用呢?你只需要在 HTML 的 <head> 标签中引入它的 CSS 和 JS 文件:

<link rel="stylesheet" href="https://unpkg.com/@knadh/oat/oat.min.css">
<script src="https://unpkg.com/@knadh/oat/oat.min.js" defer></script>

这样就可以了,其它的不用改,再看看效果图:

可以说是非常的方便。

Oat UI 的作者 Kailash Nadh 创建这个项目的初衷,就是因为受够了 JavaScript 生态系统中过度设计的臃肿和依赖地狱。

这整个 ui 库只有 6KB 的 CSS + 2.2KB 的 JS(压缩后),轻得像一片燕麦,这也是它名字的由来。

Oat UI 虽然轻量,但组件种类非常齐全:

类别
组件
布局
Grid 网格、Card 卡片、Sidebar 侧边栏
表单
Button 按钮、Switch 开关、Form 表单元素
导航
Tabs 标签页、Breadcrumb 面包屑、Pagination 分页
反馈
Alert 警告框、Toast 通知、Progress 进度条、Spinner 加载
数据展示
Table 表格、Badge 徽章、Avatar 头像
交互
Accordion 折叠面板、Dropdown 下拉菜单、Tooltip 提示、Dialog 对话框

快速上手指南

方法一:CDN 引入(推荐,最快)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Oat UI 示例</title>
    
    <!-- 引入 Oat UI CSS -->

    <link rel="stylesheet" href="https://unpkg.com/@knadh/oat/oat.min.css">
</head>
<body>
    <!-- 在这里写你的页面内容 -->

    
    <!-- 引入 Oat UI JS -->

    <script src="https://unpkg.com/@knadh/oat/oat.min.js" defer></script>
</body>
</html>

方法二:npm 安装

npm install @knadh/oat

然后在你的项目中导入:

// 方式一:导入全部
import
 '@knadh/oat/oat.min.css';
import
 '@knadh/oat/oat.min.js';

// 方式二:按需导入(如果你使用构建工具)

import
 '@knadh/oat/css/oat.min.css';
import
 '@knadh/oat/js/oat.min.js';

详细代码示例

1. 按钮组件

<!-- 基础按钮 -->
<button>默认按钮</button>
<button data-variant="secondary">次要按钮</button>
<button data-variant="danger">危险操作</button>

<!-- 样式变体 -->

<button class="outline">轮廓按钮</button>
<button data-variant="danger" class="outline">危险轮廓</button>
<button class="ghost">幽灵按钮</button>
<button disabled>禁用状态</button>

<!-- 尺寸 -->

<button class="small">小按钮</button>
<button>中按钮</button>
<button class="large">大按钮</button>

<!-- 按钮组 -->

<menu class="buttons">
    <li><button class="outline"></button></li>
    <li><button class="outline"></button></li>
    <li><button class="outline"></button></li>
</menu>

2. 表单组件

<form>
    <!-- 文本输入 -->

    <label data-field>
        用户名
        <input type="text" placeholder="请输入用户名" />
    </label>

    <!-- 邮箱输入 -->

    <label data-field>
        邮箱
        <input type="email" placeholder="you@example.com" />
    </label>

    <!-- 密码输入 -->

    <label data-field>
        密码
        <input type="password" placeholder="请输入密码" aria-describedby="pwd-hint" />
        <small id="pwd-hint">密码至少8位</small>
    </label>

    <!-- 下拉选择 -->

    <div data-field>
        <label>角色</label>
        <select>
            <option value="">请选择</option>
            <option value="admin">管理员</option>
            <option value="user">普通用户</option>
        </select>
    </div>

    <!-- 多行文本 -->

    <label data-field>
        简介
        <textarea placeholder="请输入简介..."></textarea>
    </label>

    <!-- 单选 -->

    <fieldset class="hstack">
        <legend>性别</legend>
        <label><input type="radio" name="gender"> 男</label>
        <label><input type="radio" name="gender"> 女</label>
    </fieldset>

    <!-- 多选 -->

    <label data-field>
        <input type="checkbox" /> 同意用户协议
    </label>

    <!-- 开关 -->

    <label>
        <input type="checkbox" role="switch" /> 接收推送通知
    </label>

    <!-- 提交按钮 -->

    <button type="submit">提交</button>
</form>

3. 卡片组件

<article class="card">
    <header>
        <h3>文章标题</h3>
        <p>这是一段描述文字</p>
    </header>
    <p>卡片的主要内容区域,可以包含任意 HTML 元素。</p>
    <footer class="hstack">
        <button class="outline">取消</button>
        <button>确定</button>
    </footer>
</article>

4. 警告框(Alert)

<div role="alert" data-variant="success">
    <strong>✅ 成功!</strong> 您的操作已成功完成。
</div>

<div role="alert" data-variant="warning">
    <strong>⚠️ 警告!</strong> 请在继续之前检查所有信息。
</div>

<div role="alert" data-variant="error">
    <strong>❌ 错误!</strong> 发生了未知错误,请重试。
</div>

<div role="alert">
    <strong>💡 提示</strong> 这是一条普通的消息通知。
</div>

5. 表格组件

<div class="table">
    <table>
        <thead>
            <tr>
                <th>姓名</th>
                <th>邮箱</th>
                <th>角色</th>
                <th>状态</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>张三</td>
                <td>zhangsan@example.com</td>
                <td>管理员</td>
                <td><span class="badge success">活跃</span></td>
            </tr>
            <tr>
                <td>李四</td>
                <td>lisi@example.com</td>
                <td>编辑</td>
                <td><span class="badge">活跃</span></td>
            </tr>
            <tr>
                <td>王五</td>
                <td>wangwu@example.com</td>
                <td>访客</td>
                <td><span class="badge secondary">待审核</span></td>
            </tr>
        </tbody>
    </table>
</div>

6. 标签页(Tabs)

<ot-tabs>
    <div role="tablist">
        <button role="tab" aria-selected="true">账户</button>
        <button role="tab">安全</button>
        <button role="tab">通知</button>
    </div>
    
    <div role="tabpanel">
        <h3>账户设置</h3>
        <p>在这里管理您的账户信息...</p>
    </div>
    
    <div role="tabpanel" hidden>
        <h3>安全设置</h3>
        <p>修改密码和安全设置...</p>
    </div>
    
    <div role="tabpanel" hidden>
        <h3>通知设置</h3>
        <p>配置您的通知偏好...</p>
    </div>
</ot-tabs>

7. 对话框(Dialog)

<!-- 打开对话框的按钮 -->
<button commandfor="my-dialog" command="show-modal">打开对话框</button>

<!-- 对话框 -->

<dialog id="my-dialog" closedby="any">
    <form method="dialog">
        <header>
            <h3>编辑资料</h3>
            <p>修改您的个人信息</p>
        </header>
        <div class="vstack">
            <label>姓名 <input name="name" required></label>
            <label>邮箱 <input name="email" type="email"></label>
        </div>
        <footer>
            <button type="button" commandfor="my-dialog" command="close" class="outline">取消</button>
            <button type="submit" value="save">保存</button>
        </footer>
    </form>
</dialog>

<script>
    // 处理对话框返回值

    const
 dialog = document.querySelector("#my-dialog");
    dialog.addEventListener('close', (e) => {
        if
 (dialog.returnValue === 'save') {
            console
.log('用户点击了保存');
        }
    });
</script>

8. Toast 通知

<button onclick="showSuccess()">显示成功通知</button>
<button onclick="showError()">显示错误通知</button>

<script>
    // 成功通知

    function
 showSuccess() {
        ot.toast('操作已完成', '成功', { variant: 'success' });
    }
    
    // 错误通知

    function
 showError() {
        ot.toast('发生了错误', '失败', { variant: 'danger', placement: 'top-center' });
    }
    
    // 自定义通知配置

    ot.toast('新消息', '通知中心', { 
        variant
: 'warning',           // success | danger | warning
        placement
: 'bottom-right',     // top-left | top-center | top-right | bottom-left | bottom-center | bottom-right
        duration
: 5000                 // 显示时间(毫秒),0 为永久
    });
</script>

9. 进度条和加载指示器

<!-- 进度条 -->
<progress value="60" max="100"></progress>
<progress value="30" max="100"></progress>
<progress value="90" max="100"></progress>

<!-- 加载指示器 -->

<div class="hstack" style="gap: 2rem;">
    <div aria-busy="true" data-spinner="small"></div>
    <div aria-busy="true"></div>
    <div aria-busy="true" data-spinner="large"></div>
</div>

<!-- 带遮罩的加载状态 -->

<article class="card" aria-busy="true" data-spinner="large overlay">
    <header>
        <h3>卡片标题</h3>
        <p>卡片描述</p>
    </header>
    <p>内容区域会被遮罩</p>
</article>

10. 网格布局

<div class="container">
    <div class="row">
        <div class="col-4">col-4</div>
        <div class="col-4">col-4</div>
        <div class="col-4">col-4</div>
    </div>
    
    <div class="row">
        <div class="col-6">col-6</div>
        <div class="col-6">col-6</div>
    </div>
    
    <div class="row">
        <div class="col-3">col-3</div>
        <div class="col-6">col-6</div>
        <div class="col-3">col-3</div>
    </div>
    
    <!-- 带偏移的布局 -->

    <div class="row">
        <div class="col-4 offset-2">col-4 offset-2</div>
        <div class="col-4">col-4</div>
    </div>
</div>

适合哪些场景?

虽然 Oat UI 很好用,但它不是万能的。如果你要开发复杂的交互应用,还是得请出 Vue/React。

但以下场景,Oat UI 绝对是首选:

内部工具后台:给公司写个简单的数据查询页,没必要搭脚手架,一个 HTML 文件搞定。
产品原型/MVP:当你有个点子,想花 1 小时弄个 Demo 给老板或客户看时,不要在 CSS 上浪费时间。
学习与教学:刚入门后端开发,不想学前端框架,只想让页面"能看"的时候。

如何定制主题?

如果你想调整 Oat UI 的样式,只需要覆盖 CSS 变量即可:

:root {
    --primary
: #3498db;           /* 主色调 */
    --background
: #ffffff;         /* 背景色 */
    --text
: #2c3e50;              /* 文字颜色 */
}

暗色主题会根据系统偏好自动切换,你也可以手动控制。

写在最后

在如今前端工程化日益复杂的今天,Oat UI 让我们回到了 Web 开发的初心:HTML 才是网页的骨架。

当你只是想快速做一个产品的时候,这种轻量方案,往往比复杂的框架更加高效。

GitHub地址:https://github.com/knadh/oat


阅读原文:https://mp.weixin.qq.com/s/7EIewlsLuWzqklWBj5mrAw

该文章在 2026/3/26 18:30:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved