Layui 基本使用

介绍

由国人开发,16年出厂的框架,其主要提供了很多好看、方便的样式,并且基本拿来即用,和Bootstrap有些相似,但个人认为该框架有个极大的好处就是定义了很多前后端交互的样式接口,如分页表格,只需在前端配置好接口,后端则按照定义好的接口规则返回数据,即可完成页面的展示,极大减少了后端人员的开发成本。

说白了,该框架就是为了方便后端人员开发前端而使用的。
官方文档:https://www.layui.com/doc/

Layui、Easyui和Bootstrap对比

https://www.cnblogs.com/helingjuan/p/9352191.html
个人总结(三个框架依次顺序):美且轻、强但丑、简且稳

环境导入

// 本地导入:
<link rel="stylesheet" href="./layui/css/layui.css" media="all">
// 导入CSS文件
<script src="./layui/layui.js"></script>
// 导入JS文件

// CDN导入:
<link rel="stylesheet" href="https://www.layuicdn.com/layui-v2.5.4/css/layui.css" media="all">
<script src="https://www.layuicdn.com/layui-v2.5.4/layui.js"></script>
<!-- 该CDN引入字体会出现跨域情况,因此一些空间的样式显示会出现异常 -->

注:
若将Layui下载到本地进行导入时,记得在将layui.csslayui.js导入的同时,将其中的字体等也一同导入,以免显示的结果有异常
使用CDN导入时,提供的CDN链接由于配置文件,在导入字体文件等时会出现跨域请求的问题,所以字体等可能无法正常显示,因此不推荐,不过这里还是附上CDN链接:CDN链接

好看的字体图标

参考文档:https://www.layui.com/doc/element/icon.html#table

好用的内置模块

layer弹层

这个是该框架的代表作,常用于一些公告、提示框、轮播相册等场景,举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>弹层使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<div class="layui-btn layui-btn-primary layer-demolist" id="test1">我下面会出现一个弹层</div>
</body>
<script src="./layui/layui.js"></script>
<script>
    layui.use('layer', function () {
        var layer = layui.layer;

        layer.tips('上', '#test1', {  // 表示在id=test1的地方显示弹层
                tips: 3,    // 1/2/3/4分别表示从:上/右/下/左显示弹层
                time: 0,    // 设置为0表示不消失
        });
    });

</script>
</html>
结果图:
弹层示例图
多个弹层示例
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>弹层使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<button id="show" class="layui-btn layui-btn-primary">显示弹层</button>
<button class="layui-btn del">删除弹层1</button>
<button class="layui-btn layui-btn-normal del">删除弹层2</button>
<button class="layui-btn layui-btn-warm del">删除弹层3</button>
<button class="layui-btn layui-btn-danger del">删除弹层4</button>
<br><br><br>

<center>
    <div class="layui-btn layui-btn-primary layer-demolist" id="test1">我上面会出现一个弹层</div>
    <div class="layui-btn layui-btn-primary layer-demolist" id="test2">我右面会出现一个弹层</div>
    <br>
    <div class="layui-btn layui-btn-primary layer-demolist" id="test3">我下面会出现一个弹层</div>
    <div class="layui-btn layui-btn-primary layer-demolist" id="test4">我左面会出现一个弹层</div>
</center>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="./layui/layui.js"></script>
<script>
    layui.use('layer', function () {
        $('#show').click(function () {
            for (i = 1; i <= 4; i++) {
                layui.layer.tips(i, '#test' + i, {  // 表示在id=test1的地方显示弹层
                    tips: i,    // 1/2/3/4分别表示从:上/右/下/左显示弹层
                    // area: ['200px', '20px'], // 设置长高
                    time: 0,    // 设置为0表示不消失
                    tipsMore: true, //支持多个弹层
                    success: function (layero, index) {
                        // console.log(layero, index);
                        layero.addClass(i + "-error");    // 添加一个class
                        layero.children().eq(0).removeAttr("style");
                        layero.children().eq(0).css("line-height", "20px"); // 设置行高
                        // 给当前的标签设置id及样式
                    }
                });
            }
        });

        $('.del').click(function () {
            current = $(this).index();
            $("." + current + '-error').remove();
            // 删除按钮对应弹层,这里没有使用官方提供的close方法
            // 因为close方法是根据弹层的索引来进行删除
            // 但是每点击依次显示弹层,就会多4个弹层,那么其将无法把你希望的弹层都删除
        })
    });

</script>
</html>
结果图:

多个弹层示例

样式参考文档:https://www.layui.com/demo/layer.html
更多使用示例:http://layer.layui.com/

日历控件示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>layDate快速使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>

<div class="layui-inline"> <!-- 注意:这一层元素并不是必须的 -->
    <input type="text" class="layui-input" id="test1">
</div>

<script src="./layui/layui.js"></script>
<script>
    layui.use('laydate', function () {
        var laydate = layui.laydate;

        //执行一个laydate实例
        laydate.render({
            elem: '#test1', //指定元素
            type: 'datetime'
        });
    });
</script>
</body>
</html>
结果图:
日历示例

前后端结合完整示例-Flask+Layui实现分页表格

后端代码
# -*- coding: utf-8 -*-
from flask import Flask, make_response, request

app = Flask(__name__)

@app.route("/aaaaa")
def xxx():
    page = int(request.args["page"])
    limit = int(request.args["limit"])
    aaa = {"code":0,"msg":"","data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0", "sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75},{"id":10010,"username":"user-10","sex":"女","city":"城市-10","sign":"签名-10","experience":1016,"logins":182,"wealth":71294671,"classify":"诗人","score":34},{"id":10011,"username":"user-11","sex":"女","city":"城市-11","sign":"签名-11","experience":492,"logins":107,"wealth":8062783,"classify":"诗人","score":6},{"id":10012,"username":"user-12","sex":"女","city":"城市-12","sign":"签名-12","experience":106,"logins":176,"wealth":42622704,"classify":"词人","score":54},{"id":10013,"username":"user-13","sex":"男","city":"城市-13","sign":"签名-13","experience":1047,"logins":94,"wealth":59508583,"classify":"诗人","score":63},{"id":10014,"username":"user-14","sex":"男","city":"城市-14","sign":"签名-14","experience":873,"logins":116,"wealth":72549912,"classify":"词人","score":8},{"id":10015,"username":"user-15","sex":"女","city":"城市-15","sign":"签名-15","experience":1068,"logins":27,"wealth":52737025,"classify":"作家","score":28},{"id":10016,"username":"user-16","sex":"女","city":"城市-16","sign":"签名-16","experience":862,"logins":168,"wealth":37069775,"classify":"酱油","score":86},{"id":10017,"username":"user-17","sex":"女","city":"城市-17","sign":"签名-17","experience":1060,"logins":187,"wealth":66099525,"classify":"作家","score":69},{"id":10018,"username":"user-18","sex":"女","city":"城市-18","sign":"签名-18","experience":866,"logins":88,"wealth":81722326,"classify":"词人","score":74},{"id":10019,"username":"user-19","sex":"女","city":"城市-19","sign":"签名-19","experience":682,"logins":106,"wealth":68647362,"classify":"词人","score":51},{"id":10020,"username":"user-20","sex":"男","city":"城市-20","sign":"签名-20","experience":770,"logins":24,"wealth":92420248,"classify":"诗人","score":87},{"id":10021,"username":"user-21","sex":"男","city":"城市-21","sign":"签名-21","experience":184,"logins":131,"wealth":71566045,"classify":"词人","score":99},{"id":10022,"username":"user-22","sex":"男","city":"城市-22","sign":"签名-22","experience":739,"logins":152,"wealth":60907929,"classify":"作家","score":18},{"id":10023,"username":"user-23","sex":"女","city":"城市-23","sign":"签名-23","experience":127,"logins":82,"wealth":14765943,"classify":"作家","score":30},{"id":10024,"username":"user-24","sex":"女","city":"城市-24","sign":"签名-24","experience":212,"logins":133,"wealth":59011052,"classify":"词人","score":76},{"id":10025,"username":"user-25","sex":"女","city":"城市-25","sign":"签名-25","experience":938,"logins":182,"wealth":91183097,"classify":"作家","score":69},{"id":10026,"username":"user-26","sex":"男","city":"城市-26","sign":"签名-26","experience":978,"logins":7,"wealth":48008413,"classify":"作家","score":65},{"id":10027,"username":"user-27","sex":"女","city":"城市-27","sign":"签名-27","experience":371,"logins":44,"wealth":64419691,"classify":"诗人","score":60},{"id":10028,"username":"user-28","sex":"女","city":"城市-28","sign":"签名-28","experience":977,"logins":21,"wealth":75935022,"classify":"作家","score":37},{"id":10029,"username":"user-29","sex":"男","city":"城市-29","sign":"签名-29","experience":647,"logins":107,"wealth":97450636,"classify":"酱油","score":27}]}

    aaa["count"] = len(aaa["data"])
    aaa["data"] = aaa["data"][(page-1)*10: (page-1)*10 + limit]
    import json
    rst = make_response(json.dumps(aaa))
    rst.headers['Access-Control-Allow-Origin'] = '*'
    return rst

if __name__ == '__main__':
    app.run()

前端代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>layPage快速使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<table id="demo" lay-filter="test"></table>
<div id="test1"></div>

<script src="./layui/layui.js"></script>
<script>
    layui.use('table', function () {
        var table = layui.table;

        //第一个实例
        table.render({
            elem: '#demo'
            , height: 500
            , url: 'http://127.0.0.1:5000/aaaaa' //数据接口
            , page: true //开启分页
            , limit: 10 //数据总数,从服务端得到
            , loading: false
            , LAY_CHECKED: true
            , cols: [[ //表头
                {field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left'}
                , {field: 'username', title: '用户名', width: 80}
                , {field: 'sex', title: '性别', width: 80, sort: true}
                , {field: 'city', title: '城市', width: 80}
                , {field: 'sign', title: '签名', width: 177}
                , {field: 'experience', title: '积分', width: 80, sort: true}
                , {field: 'score', title: '评分', width: 80, sort: true}
                , {field: 'classify', title: '职业', width: 80}
                , {field: 'wealth', title: '财富', width: 135, sort: true}
            ]]
        });

    });
</script>
</body>
</html>
结果图:
分页表格示例

文件上传

支持异步上传,无需与其他表单共存
参考:https://www.layui.com/doc/modules/upload.html

树形图

图片示例:

树形图示例

参考:https://www.layui.com/doc/modules/tree.html

颜色选择器

图片示例:

颜色选择器示例

参考:https://www.layui.com/doc/modules/colorpicker.html

分页导航栏

图片示例:

分页导航栏示例

参考:https://www.layui.com/doc/modules/element.html

评分组件

举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>评分使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<div id="test1"></div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="./layui/layui.js"></script>
<script>
    layui.use('rate', function () {
        var rate = layui.rate;
        var ins1 = rate.render({
            elem: '#test1',  //绑定元素
            value: 3,   // 默认三颗星
            choose: function (value) {
                console.log(value); // 点击输出评分
            }
        });
    });
</script>
</html>
结果图:

评分组件示例

参考:https://www.layui.com/doc/modules/rate.html

工具集

固定块

可以固定一个图框在网页的某个位置(有点像IPhone里固定在屏幕的灰色圈圈),点击后实现某个功能,举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>固定块使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
</body>
<script src="./layui/layui.js"></script>
<script>
    layui.use('util', function () {
        var util = layui.util;
        util.fixbar({
            bar1: true
            , css: {left: 0, top: 300}
            , click: function (type) {
                console.log(type);
                if (type === 'bar1') {
                    alert('点击了bar1')
                }
            }
        });
    });
</script>
</html>
结果图:
固定块示例
更多参考文档:https://www.layui.com/doc/modules/util.html

代码块

即让代码显示出来,举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>代码块使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<div id="test1" class="layui-code">print("hello world!")<br>
    exit()
</div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="./layui/layui.js"></script>
<script>
    layui.use('code', function () { //加载code模块
        layui.code(); //引用code方法
    });
</script>
</html>
结果图:
代码块示例

轮播图

举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>轮播图使用</title>
    <link rel="stylesheet" href="./layui/css/layui.css" media="all">
</head>
<body>
<div class="layui-carousel" id="test1">
    <div carousel-item>
        <div style="background: red;">条目1</div>
        <div style="background: green;">条目2</div>
        <div style="background: blue;">条目3</div>
        <div style="background: yellow;">条目4</div>
        <div style="background: purple;">条目5</div>
    </div>
</div>
</body>
<script src="./layui/layui.js"></script>

<script>
    layui.use('carousel', function () {
        var carousel = layui.carousel;
        //建造实例
        carousel.render({
            elem: '#test1'
            , width: '100%' //设置容器宽度
            , arrow: 'always' //始终显示箭头
        });
    });
</script>
</html>
结果图:
轮播图示例

Layui踩坑记录

使用弹层时第一次的效果不对,之后又没问题

原因:第一次执行时资源没有加载完毕
解决办法:把弹层功能放在layer.ready中执行,举例:

layui.use('layer', function () {
    let layer = layui.layer;
    layer.ready(function () {
        // 将内容放在ready方法里
        layer.msg("测试", {
            time: 0,
            area: ['300px', '150px'],
            shade: [0.6, '#000', true],
            icon: 7,
            shadeClose: true,
            btn: ['关闭']
        });
    })
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 来到简书已经一年多的时间了,所得到的领悟和体会颇多,但与自己的期望却依然相差甚远。 回顾了入驻简书一年多以来,我的...
    清清Echo阅读 380评论 2 2
  • 水熊虫waterbear阅读 265评论 0 0
  • 今天应该是最近我和若溪比较轻松的一天。因为我产假结束,已经开始上班,属于我和若溪的时间就更少了。恰巧今天若溪...
    宛若小溪阅读 133评论 0 0
  • 借钱这种行为吗。 小编觉得不懂,现在谁还没有个花呗啊,不想分期买,直接就借呗。 下面让我们尽情欣赏下面这组聊天截图...
    尾田的小迷弟阅读 184评论 1 4