layui响应式表单上下结构

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="/lib/layui-2.13.5/css/layui.css" media="all">
    <style>
        /* 全局背景与容器 */
        body {
            background-color: #f5f5f5;
            padding: 20px;
        }

        .layui-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 6px;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
        }

        /* 按钮行下方留白 */
        .top-btn-row {
            margin-bottom: 15px;
        }

        /* 带边框的卡片 */
        .bordered-card {
            border: 1px solid #d2d2d2 !important;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
        }

        .bordered-card .layui-card-body {
            padding: 20px 20px 10px 20px;
        }

        /* ===== 上下布局核心样式 ===== */
        .vertical-layout .layui-form-item {
            display: flex;
            flex-direction: column;
            /* 纵向排列 */
            margin-bottom: 0;
            /* 间距由 grid 的 gap 控制 */
        }

        /* 标签容器:使用 flex 让 label 可省略,星号紧贴 */
        .vertical-layout .label-container {
            display: flex;
            align-items: center;
            width: 100%;
            margin-bottom: 5px;
            /* 与输入框的间距 */
        }

        /* label 本身:可省略,宽度由内容决定,允许收缩 */
        .vertical-layout .layui-form-label {
            float: none;
            width: auto;
            padding: 0;
            /* 去掉内边距,由容器控制 */
            text-align: left;
            display: inline-block;
            /* 确保能正确计算宽度 */
            line-height: normal;
            font-weight: 500;
            /* 文本过长显示省略号 */
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            /* 不拉伸,但可收缩 */
            flex: 0 1 auto;
            /* 默认值,可不写,明确一下 */
            min-width: 0;
            /* 允许收缩 */
        }

        /* 红色星号:独立且不省略,紧跟在 label 后 */
        .vertical-layout .required-star {
            color: red;
            margin-left: 4px;
            /* font-size: 1.2em; */
            flex-shrink: 0;
            /* 防止被压缩 */
            height: 20px;
        }

        .vertical-layout .layui-input-block {
            margin-left: 0;
            width: 100%;
        }

        /* 输入框、下拉框、文本域宽度自适应 */
        .vertical-layout .layui-input,
        .vertical-layout .layui-select,
        .vertical-layout .layui-textarea {
            width: 100%;
            box-sizing: border-box;
            /* 确保 padding 不影响宽度 */
        }

        /* 复选框、开关等特殊元素保持一行显示 */
        .vertical-layout .layui-input-block .layui-unselect {
            /* margin-right: 10px; */
        }

        /* ===== CSS Grid 布局 ===== */
        .form-grid {
            display: grid;
            gap: 20px;
            /* 行列间距 */
            grid-template-columns: repeat(5, 1fr);
            /* 默认大屏4列 */
        }

        /* 响应式断点 */
        @media screen and (max-width: 1500px) {
            .form-grid {
                grid-template-columns: repeat(4, 1fr);
                /* 中屏3列 */
            }
        }

        @media screen and (max-width: 1200px) {
            .form-grid {
                grid-template-columns: repeat(3, 1fr);
                /* 中屏3列 */
            }
        }

        @media screen and (max-width: 992px) {
            .form-grid {
                grid-template-columns: repeat(2, 1fr);
                /* 小屏2列 */
            }
        }

        @media screen and (max-width: 768px) {
            .form-grid {
                grid-template-columns: repeat(1, 1fr);
                /* 超小屏1列 */
            }
        }

        /* 每个表单项容器:允许内容收缩,避免长文本撑大网格 */
        .grid-item {
            min-width: 0;
            /* 关键:允许网格项收缩到小于内容最小宽度 */
        }
    </style>
</head>

<body>
    <script src="/lib/layui-2.13.5/layui.js" charset="utf-8"></script>
    <script src="/js/lay-config.js?v=2.0.0" charset="utf-8"></script>
    <script src="/lib/axio/axios.min.js"></script>

    <div class=" layui-form" lay-filter="exampleForm">
        <!-- 顶部按钮行:右侧对齐 -->
        <div class="layui-row top-btn-row">
            <div class="layui-col-xs12" style="text-align: right;">
                <button type="button" class="layui-btn" lay-submit lay-filter="formSubmit">提交</button>
            </div>
        </div>

        <!-- 表单区域:使用 vertical-layout 实现上下布局,grid 实现固定列数响应式 -->
        <div class="vertical-layout">
            <div class="layui-card bordered-card">
                <div class="layui-card-header">基本信息</div>
                <div class="layui-card-body">
                    <!-- 使用 grid 容器 -->
                    <div class="form-grid">
                        <!-- 姓名(必填)- 使用超长文本演示省略效果,星号紧贴 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">
                                        这是一个非常非常长的姓名标签,用来测试文本溢出省略效果
                                    </label>
                                    <span class="required-star">*</span>
                                </div>
                                <div class="layui-input-block">
                                    <input type="text" name="name" required lay-verify="required" placeholder="请输入姓名"
                                        autocomplete="off" class="layui-input">
                                </div>
                            </div>
                        </div>
                        <!-- 性别(非必填) -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">性别</label>
                                    <!-- <span class="required-star">*</span> -->

                                </div>
                                <div class="layui-input-block">
                                    <select name="sex" lay-verify="required">
                                        <option value=""></option>
                                        <option value="男">男</option>
                                        <option value="女">女</option>
                                    </select>
                                </div>
                            </div>
                        </div>
                        <!-- 邮箱(必填) -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">邮箱</label>
                                    <span class="required-star">*</span>
                                </div>
                                <div class="layui-input-block">
                                    <input type="email" name="email" required lay-verify="required|email"
                                        placeholder="请输入邮箱" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                        </div>
                        <!-- 手机(必填) -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">手机</label>
                                    <span class="required-star">*</span>
                                </div>
                                <div class="layui-input-block">
                                    <input type="tel" name="phone" required lay-verify="required|phone"
                                        placeholder="请输入手机号" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                        </div>
                        <!-- 出生日期 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">出生日期</label>
                                </div>
                                <div class="layui-input-block">
                                    <input type="text" name="birth" id="birth" placeholder="请选择日期" autocomplete="off"
                                        class="layui-input">
                                </div>
                            </div>
                        </div>
                        <!-- 学历 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">学历</label>
                                </div>
                                <div class="layui-input-block">
                                    <select name="education">
                                        <option value=""></option>
                                        <option value="大专">大专</option>
                                        <option value="本科">本科</option>
                                        <option value="硕士">硕士</option>
                                        <option value="博士">博士</option>
                                    </select>
                                </div>
                            </div>
                        </div>
                        <!-- 职业 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">职业</label>
                                </div>
                                <div class="layui-input-block">
                                    <input type="text" name="job" placeholder="请输入职业" autocomplete="off"
                                        class="layui-input">
                                </div>
                            </div>
                        </div>
                        <!-- 城市 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">城市</label>
                                </div>
                                <div class="layui-input-block">
                                    <select name="city" lay-search>
                                        <option value="北京">北京</option>
                                        <option value="上海">上海</option>
                                        <option value="广州">广州</option>
                                        <option value="深圳">深圳</option>
                                        <option value="杭州">杭州</option>
                                    </select>
                                </div>
                            </div>
                        </div>
                        <!-- 兴趣爱好 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">兴趣爱好</label>
                                </div>
                                <div class="layui-input-block">
                                    <input type="checkbox" name="hobby[]" value="读书" title="读书">
                                    <input type="checkbox" name="hobby[]" value="运动" title="运动">
                                    <input type="checkbox" name="hobby[]" value="音乐" title="音乐">
                                </div>
                            </div>
                        </div>
                        <!-- 是否在职 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">是否在职</label>
                                </div>
                                <div class="layui-input-block">
                                    <input type="radio" name="isWork" value="是" title="是" checked>
                                    <input type="radio" name="isWork" value="否" title="否">
                                </div>
                            </div>
                        </div>
                        <!-- 个人简介 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">个人简介</label>
                                </div>
                                <div class="layui-input-block">
                                    <textarea name="desc" placeholder="请输入简介" class="layui-textarea"></textarea>
                                </div>
                            </div>
                        </div>
                        <!-- 开关 -->
                        <div class="grid-item">
                            <div class="layui-form-item">
                                <div class="label-container">
                                    <label class="layui-form-label">开关</label>
                                </div>
                                <div class="layui-input-block">
                                    <input type="checkbox" name="switch" lay-skin="switch" lay-text="ON|OFF">
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script>
        layui.use(['form', 'laydate'], function () {
            var form = layui.form;
            var laydate = layui.laydate;

            // 日期渲染
            laydate.render({
                elem: '#birth'
            });

            // 监听提交按钮
            form.on('submit(formSubmit)', function (data) {
                console.log(data);
                layer.msg(JSON.stringify(data.field), { icon: 1 });
                return false;
            });

            // 渲染所有表单组件
            form.render();
        });
    </script>
</body>

</html>
相关推荐
天问一1 小时前
Cesium 中 PointPrimitiveCollection 与 primitives 的结合使用
前端
小J听不清2 小时前
CSS 文本样式全解析:颜色 / 对齐 / 装饰 / 缩进
前端·javascript·css·html·css3
宁雨桥2 小时前
Vue3 虚拟列表实现原理与实战
前端·javascript·vue.js
早點睡3902 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-video
javascript·react native·react.js
启山智软2 小时前
【使用 Java(JSP)实现的简单商城页面前端示例】
java·前端·商城开发
Qlittleboy2 小时前
TP5.0的“请求缓存”,把页面缓存为静态HTML文件,提升加载速度
前端·缓存·html·php
請你喝杯Java2 小时前
基于 TypeScript React Next.js 的 AI 产品技术栈调研报告
javascript·react.js·typescript
Doris8932 小时前
【Node.js 】Node.js 与 Webpack 模块化工程化入门指南
前端·webpack·node.js