RmlUI控件-button

/ 0评 / 0

button是一组常用按钮控件,分别实现了以下分类:

依赖项

使用方法

按钮通过在button元素添加class="btn"进行设置。默认按钮是所有按钮实现的基础。

按钮

所有按钮必须使用button元素。

<button class="btn">默认按钮</button>

按钮列表

<button class="btn">默认按钮</button>
<button class="btn btn-primary">主要按钮</button>
<button class="btn btn-text">文本按钮</button>
<button class="btn btn-link">链接按钮</button>
<button class="btn danger"><i class="icon icon-edit"></i>Danger</button>
<button class="btn btn-primary danger"><i class="icon icon-edit"></i>Danger</button>
<button class="btn btn-text danger">文本按钮</button>
<button class="btn btn-link danger">链接按钮</button>
<button class="btn btn-text danger"><i class="icon icon-edit"></i>文本按钮</button>
<button class="btn btn-link danger"><i class="icon icon-edit"></i>链接按钮</button>
<div style="width: 200px;">
    <button class="btn block" disabled>默认按钮(禁用)</button>
    <button class="btn btn-primary block" disabled>主要按钮(禁用)</button>
    <button class="btn btn-text block" disabled>文本按钮(禁用)</button>
    <button class="btn btn-link block" disabled>链接按钮(禁用)</button>
    <button class="btn block"><i class="icon icon-edit"></i>图标按钮</button>
    <button class="btn btn-primary block"><i class="icon icon-edit"></i>图标按钮</button>
    <button class="btn btn-text block"><i class="icon icon-edit"></i>图标按钮</button>
    <button class="btn btn-link block"><i class="icon icon-edit"></i>图标按钮</button>
    <button class="btn block" disabled><i class="icon icon-edit"></i>图标按钮(禁用)</button>
    <button class="btn btn-primary block" disabled><i class="icon icon-edit"></i>图标按钮(禁用)</button>
    <button class="btn btn-text block" disabled><i class="icon icon-edit"></i>图标按钮(禁用)</button>
    <button class="btn btn-link block" disabled><i class="icon icon-edit"></i>图标按钮(禁用)</button>
    <button class="btn btn-primary block large">大尺寸按钮</button>
    <button class="btn btn-primary block small">小尺寸按钮</button>
</div>

除了可以设置按钮的样式(btn-primary/btn-text/btn-link)外,还可以为每个样式设置以下属性(设置到class属性上):

禁用按钮

被禁用的按钮不能响应鼠标操作。通过设置元素的disabled属性进行设置。

按钮分组

<div class="btn-group">
    <button class="btn">默认按钮</button>
    <button class="btn btn-primary">主要按钮</button>
    <button class="btn btn-primary danger"><i class="icon icon-edit"></i>Danger</button>
</div>
<div class="btn-group large">
    <button class="btn">默认按钮</button>
    <button class="btn btn-primary"><i class="icon icon-edit"></i>主要按钮</button>
    <button class="btn btn-primary danger">Danger</button>
</div>
<div class="btn-group small">
    <button class="btn">默认按钮</button>
    <button class="btn btn-primary">主要按钮</button>
    <button class="btn btn-primary danger"><i class="icon icon-edit"></i>Danger</button>
</div>

在按钮分组中,可以通过large/small来设置整组按钮的尺寸。

效果预览

效果预览

图标说明

在普通浏览器中,ICON图标是通过css的伪类before实现的,但在RML中并没有这个伪类,这里使用的是decorator中的text来实现图标,但由于decorator不能在:hover:active是更新图标颜色,所以我们强制在:hover:active中重新设置了图标的颜色和文本。

以下是示例:

button.btn:hover>.icon-edit {decorator: text("&#xe83e;" rgb(64,150,255));}
button.btn:active>.icon-edit {decorator: text("&#xe83e;" rgb(9,88,217));}
button.btn:hover.danger>.icon-edit {decorator: text("&#xe83e;" rgb(255,120,117));}
button.btn:active.danger>.icon-edit {decorator: text("&#xe83e;" rgb(217,54,62));}

为此,我们实现了一个JS脚本,用于从icon.css读取并分析文本,自动来生成每个图标在按钮中的颜色更新CSS内容。

const fs = require("fs").promises;
const selectors = [
    //=====默认======
    {
    selector: "button.btn:hover",
    color: "rgb(64,150,255)"
    }, {
    selector: "button.btn:active",
    color: "rgb(9,88,217)"
    }, {
    selector: "button.btn:hover.danger",
    color: "rgb(255,120,117)"
    }, {
    selector: "button.btn:active.danger",
    color: "rgb(217,54,62)"
    },
    //======主要======
    {
    selector: "button.btn-primary:hover",
    color: "#ffffff"
    }, {
    selector: "button.btn-primary:active",
    color: "#ffffff"
    }, {
    selector: "button.btn-primary:hover.danger",
    color: "#ffffff"
    }, {
    selector: "button.btn-primary:active.danger",
    color: "#ffffff"
    },
    //======文本======
    {
    selector: "button.btn-text:hover",
    color: "rgba(0,0,0,88%)"
    }, {
    selector: "button.btn-text:active",
    color: "rgba(0,0,0,88%)"
    }, {
    selector: "button.btn-text:hover.danger",
    color: "rgb(255,120,117)"
    }, {
    selector: "button.btn-text:active.danger",
    color: "rgb(255,120,117)"
    },
    //======链接======
    {
    selector: "button.btn-link:hover",
    color: "rgb(105,177,255)"
    }, {
    selector: "button.btn-link:active",
    color: "rgb(9,88,217)"
    }, {
    selector: "button.btn-link:hover.danger",
    color: "rgb(255,77,79)"
    }, {
    selector: "button.btn-link:active.danger",
    color: "rgb(217,54,62)"
    }
];
(async function main() {
    let button_icon = [];
    let content = await fs.readFile("../styles/icon.css", "utf-8");
    let regex = /\s{0}(\.icon-[^\{]+)\s*\{(([\w\W])*?)\}/ig;
    let m;
    while ((m = regex.exec(content)) !== null) {
        let mc = m[2].match(/\"(&#.+;)\"/ig);
        let char = mc[0].replaceAll('"', "");
        for (let i = 0; i < selectors.length; i++) {
            let line = `${selectors[i].selector}>${m[1]}{decorator: text("${char}" ${selectors[i].color});}`;
            button_icon.push(line);
        }
    }
    let css=button_icon.join("\r\n");
    await fs.writeFile("../styles/button-icon.css",css);
    console.log("completed.");
})();