layui step 步骤条(分步表单)的表单提交 配置_前端

灵感来源于个网站,感谢个位大佬写的layui步骤条(分步表单)的教学(2024.2.3  15:58)

这里纯属个人理解,如有不足,请各位前端大佬进行评论批评(我是后端小白) 谅解一下!!!

一、模板

1、预览图

layui step 步骤条(分步表单)的表单提交 配置_前端_02

首先导入扩展 js和css 文件(可以直接引用官网里面的js,或者本地)

layui step 步骤条(分步表单)的表单提交 配置_ico_03

资源位置:【免费】step步骤表单(分步表单测试测试测试)资源-文库

后续如有需要,具体资源评论或者私信

2、layui-card-body
<div class="layui-card-body" id = "layui-card-body" style="padding-top: 40px; width: 100%; display: flex;height:auto">
    <div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="flex-grow: 1;" >
        <div carousel-item style="">
	   <div class="m-10" id="step1-content"
                 style="margin-left: 5.6%;background:white">
                <div style="margin-top: 2%;">
                    <p class="m-20" style="">aaaaaa</p>
                    <p class="m-20-p">bbbbbbbbbbb</p>
                    <p class="m-20" style="margin-top: 1.5%;">ccccc</p>
                    <p class="m-20-p">dddddddddddddd</p>
                    <ul style="margin-left: 20px">
                        <li>dddddddddddddd</li>
                        <li>dddddddddddddddddddddddddddd</li>
                        <li>dddddddddddddddddddddddddddd</li>
                        <li>dddddddddddddddddddddddddddd</li>
                        <li>dddddddddddddd</li>
                        <li>dddddddddddddddddddddddddddd</li>
                        <li>dddddddddddddd</li>
                        <li>dddddddddddddddddddddddddddd</li>
                    </ul>
                    <form class="layui-form" style="margin: 0 auto;width: 30%;padding-top: 40px;">

                        <div class="layui-form-item">

                            <div class="layui-input-block" style="margin-left: -14.4%;">

                                <button class="layui-btn" id="layui-btn-nextOne" lay-submit lay-filter="formStep"
                                        style=";width: 35%;background-color: #155ede;border-radius: 4px">
                                    ccc
                                </button>
                                <button class="layui-btn" lay-filter="formStep" onclick="printPage()"
                                        style="margin-left: 3.5%;width: 35%;border-radius: 4px">
                                    eee
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>  
             <div class="m-10" id="step2-content"
                 style="margin-left: 5.6%;background:white">
            </div>
            <div class="m-10" id="step3-content"
                 style="margin-left: 5.6%;background:white">
            </div>    
             <div class="m-10" id="step4-content"
                 style="margin-left: 5.6%;background:white">
            </div>
        </div>
    </div>
</div>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
3、步骤条配置
layui.config({
        base: './step-lay/'
    }).use(['form', 'step'], function () {
        var $ = layui.$,
            form = layui.form,
            step = layui.step;

        // 获取 URL 参数中的当前步骤索引值
        var urlParams = new URLSearchParams(window.location.search);
        var currentStep = parseInt(urlParams.get('step')) || 0;

        step.render({
            elem: '#stepForm',
            filter: 'stepForm',
            width: '100%',
            stepWidth: '750px',
            height: '500px',
            stepItems: [
                {title: '阅读须知'},
                {title: '填写信息'},
                {title: '上传材料'},
                {title: '结果领取'},
                {title: '申请成功'}
            ],
            // 设置当前步骤
            step: currentStep,
            // 监听步骤切换事件
            stepChange: function (currentStepIndex) {
                // 更新 URL 参数中的当前步骤索引值
                updateUrlParams(currentStepIndex);
            }
        });

        form.on('submit(formStep)', function (data) {
            step.next('#stepForm');
            return false;
        });

        form.on('submit(formStep2)', function (data) {
            step.next('#stepForm');
            return false;
        });

        $('.pre').click(function () {
            step.pre('#stepForm');
        });

        $('.next').click(function () {
            step.next('#stepForm');
        });

        // 更新 URL 参数中的当前步骤索引值
        function updateUrlParams(currentStepIndex) {
            var url = new URL(window.location.href);
            url.searchParams.set('step', currentStepIndex.toString());
            var newUrl = url.toString();
            window.history.replaceState({path: newUrl}, '', newUrl);
        }
    });
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.

 二、发现问题

1、颜色大小问题

因为一开始他自带的step颜色是绿色的,于是进行修改(这里只粘贴了具体有关的)

.step-item-head {
    /*边框背景  颜色 和字体颜色,大小等*/
    position: relative;
    display: inline-block;
    height: 28px;
    width: 28px;
    text-align: center;
    vertical-align: top;
    color: #999999;
    border: 1px solid #999999;
    border-radius: 50%;
    background: #ffffff;
}

.step-item-head.step-item-head-active,
.step-item-head.step-item-head-done {
    /*修改背景颜色*/
    background: #1D84FF;
    color: #ffffff;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
2、上一步,下一步

因为是分布表单嘛,于是又添加了上一步,下一步。于是又写了一个step.js 文件

layui.define(['layer', 'carousel'], function (exports) {
    var $ = layui.jquery;
    var layer = layui.layer;
    var carousel = layui.carousel;

    // 添加步骤条dom节点
    var renderDom = function (elem, stepItems, postion) {
        var stepDiv = '<div class="lay-step">';
        for (var i = 0; i < stepItems.length; i++) {
            stepDiv += '<div class="step-item">';
            // 线
            if (i < (stepItems.length - 1)) {
                if (i < postion) {
                    stepDiv += '<div class="step-item-tail"><i class="step-item-tail-done"></i></div>';
                } else {
                    stepDiv += '<div class="step-item-tail"><i class=""></i></div>';
                }
            }

            // 数字
            var number = stepItems[i].number;
            if (!number) {
                number = i + 1;
            }
            if (i == postion) {
                stepDiv += '<div class="step-item-head step-item-head-active"><i class="layui-icon">' + number + '</i></div>';
            } else if (i < postion) {
                stepDiv += '<div class="step-item-head"><i class="layui-icon layui-icon-ok"></i></div>';
            } else {
                stepDiv += '<div class="step-item-head "><i class="layui-icon">' + number + '</i></div>';
            }

            // 标题和描述
            var title = stepItems[i].title;
            var desc = stepItems[i].desc;
            if (title || desc) {
                stepDiv += '<div class="step-item-main">';
                if (title) {
                    stepDiv += '<div class="step-item-main-title">' + title + '</div>';
                }
                if (desc) {
                    stepDiv += '<div class="step-item-main-desc">' + desc + '</div>';
                }
                stepDiv += '</div>';
            }
            stepDiv += '</div>';
        }
        stepDiv += '</div>';

        $(elem).prepend(stepDiv);

        // 计算每一个条目的宽度
        var bfb = 100 / stepItems.length;
        $('.step-item').css('width', bfb + '%');
    };

    var step = {
        // 渲染步骤条
        render: function (param) {
            param.indicator = 'none';  // 不显示指示器
            param.arrow = 'always';  // 始终显示箭头
            param.autoplay = false;  // 关闭自动播放
            if (!param.stepWidth) {
                param.stepWidth = '400px';
            }

            // 渲染轮播图
            carousel.render(param);

            // 渲染步骤条
            var stepItems = param.stepItems;
            renderDom(param.elem, stepItems, 0);
            $('.lay-step').css('width', param.stepWidth);

            //监听轮播切换事件
            carousel.on('change(' + param.filter + ')', function (obj) {
                $(param.elem).find('.lay-step').remove();
                renderDom(param.elem, stepItems, obj.index);
                $('.lay-step').css('width', param.stepWidth);
            });

            // 隐藏左右箭头按钮
            $(param.elem).find('.layui-carousel-arrow').css('display', 'none');

            // 去掉轮播图的背景颜色
            $(param.elem).css('background-color', 'transparent');
        },
        //下一步
        next: function (elem) {
            var currentIndex = $(elem).find('.layui-carousel-ind ul li.layui-this').index();
            $(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click');
            $(elem).find('.step-item-head').eq(currentIndex).addClass('step-item-head-done');
        },
        //上一步
        pre: function (elem) {
            var currentIndex = $(elem).find('.layui-carousel-ind ul li.layui-this').index();
            $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click');
            $(elem).find('.step-item-head').eq(currentIndex).removeClass('step-item-head-done');
        }
    };
    layui.link('../step/step-lay/step.css');
    exports('step', step);
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
3、高度问题

 3种方法

1、height:500px                        固定step组件的高度,缺点:内容不能自适应

1、height:100%                        固定父div的高度          缺点:内容不能自适应  

3、动态修改里面的高度(方法并不是很好,目前还没有想到其他的方法)

在这配置里面我必须要配置高度500px 但是如果不配置 容器是不显示高度的

layui step 步骤条(分步表单)的表单提交 配置_layui_04

layui step 步骤条(分步表单)的表单提交 配置_css_05

于是我尝试把高度改为100%,显示高度的前提是父div必须要有固定高度或者百分比。于是我就想在父类div并没有设置高度的情况下去动态的根据里面的内容来调整高度。(有些方法可能会冗余了,谅解。2024.2.5  15:31 距离放年假还有一天半)

1、这段代码首先移除之前设置的固定高度,然后获取实际内容的高度,并将父容器和步骤内容的高度设置为实际内容的高度。这样就可以根据实际内容的高度来动态调整步骤的高度。

var stepIndex = -1;
    var currentStep = 0 ;

    layui.config({
        base: './step-lay/'
    }).use(['form', 'step', 'jquery'], function() {
        var $ = layui.jquery,
            form = layui.form,
            step = layui.step;

        // 获取 URL 参数中的当前步骤索引值
        var urlParams = new URLSearchParams(window.location.search);
        currentStep = parseInt(urlParams.get('step')) || 0;

        step.render({
            elem: '#stepForm',
            filter: 'stepForm',
            width: '100%',
            stepWidth: '92%',
            height: '100%',
            stepItems: [
                { title: '阅读须知', id: 'step1' },
                { title: '填写信息', id: 'step2' },
                { title: '上传材料', id: 'step3' },
                { title: '结果领取', id: 'step4' },
                { title: '申请成功', id: 'step5' }
            ],
            // 设置当前步骤
            step: currentStep
        });

        form.on('submit(formStep)', function(data) {
            // step.goStep(2);
            stepIndex++; // 先更新步骤索引值
            step.next('#stepForm'); // 切换到下一步
            adjustStepHeight(stepIndex); // 调整下一个步骤的高度
            return false;
        });

        $('.pre').click(function() {
            stepIndex--; // 先更新步骤索引值
            step.pre('#stepForm'); // 切换到上一步
            adjustStepHeight(stepIndex); // 调整上一个步骤的高度
        });

        // // 页面加载完成时调整步骤条高度
        $(document).ready(function() {
            stepIndex++;
            adjustStepHeight(stepIndex);
        });
    });

    function adjustStepHeight(stepIndex) {
        stepIndex++;
        console.log(stepIndex);
        var parentContainer = document.getElementById('carousel-item');
        var stepContent = document.getElementById('step' + stepIndex + '-content');

        // 移除之前设置的固定高度
        parentContainer.style.height = 'auto';
        stepContent.style.height = 'auto';

        // 获取实际内容的高度
        var stepContentHeight = stepContent.scrollHeight;

        // 设置父容器和步骤内容的高度为实际内容的高度
        parentContainer.style.height = stepContentHeight + 'px';
        stepContent.style.height = stepContentHeight + 'px';
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.

2、调用方法:比如说我点击收缩图片的时候,直接调用adjustStepHeight 就能实现动态修改高度的问题。

//展开和收缩
    function toggleContent(divId, toggleImage) {
        var contentDiv = document.getElementById(divId);

        if (contentDiv.style.display === 'none') {
            contentDiv.style.display = 'block';
            toggleImage.src = '../image/收缩.png';
        } else {
            contentDiv.style.display = 'none';
            toggleImage.src = '../image/展开.png';
        }
        adjustStepHeight(stepIndex);
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

3、存在问题:他会弹出一个警告 (可能是影响性能,但是无伤大雅)

[Violation] Forced reflow while executing JavaScript took 49ms
  • 1.
4、刷新问题

刷新之后他会直接跳转step1-content(2024.2.7 11:18)

一。这里存在问题可以直接查看出现问题二

1、于是我尝试本次存储 (分别在上一步,下一步,初始化添加存,取)

var stepIndex = -1;
    var currentStep = 0 ;

    layui.config({
        base: './step-lay/'
    }).use(['form', 'step', 'jquery'], function() {
        var $ = layui.jquery,
            form = layui.form,
            step = layui.step;

        // 获取 URL 参数中的当前步骤索引值
        var urlParams = new URLSearchParams(window.location.search);
        currentStep = parseInt(urlParams.get('step')) || 0;
        // 从本地存储中获取之前保存的步骤索引值
        var storedStepIndex = localStorage.getItem('currentStepIndex');

        if (storedStepIndex !== null) {
            stepIndex = parseInt(storedStepIndex);
            currentStep = stepIndex; // 更新当前步骤索引值
        }
        var elem = '#stepForm';
        step.render({
            elem: elem,
            filter: 'stepForm',
            width: '100%',
            stepWidth: '92%',
            height: '100%',
            stepItems: [
                { title: '阅读须知', id: 'step1' },
                { title: '填写信息', id: 'step2' },
                { title: '上传材料', id: 'step3' },
                { title: '结果领取', id: 'step4' },
                { title: '申请成功', id: 'step5' }
            ],
            // 设置当前步骤
            step: currentStep
        });

        form.on('submit(formStep)', function() {
            stepIndex++; // 先更新步骤索引值
            step.next('#stepForm'); // 切换到下一步
            adjustStepHeight(stepIndex); // 调整下一个步骤的高度
            // 保存当前步骤索引值到本地存储
            localStorage.setItem('currentStepIndex', stepIndex);
            return false;
        });

        $('.pre').click(function() {
            stepIndex--; // 先更新步骤索引值
            step.pre('#stepForm'); // 切换到上一步
            adjustStepHeight(stepIndex); // 调整上一个步骤的高度
            localStorage.setItem('currentStepIndex', stepIndex);
        });

        // // 页面加载完成时调整步骤条高度
        $(document).ready(function() {
            if (currentStep === 0) {
                stepIndex++;
            } else {
                stepIndex = currentStep;
            }
            // 触发相应的事件,跳转到指定的步骤
            if (currentStep > 0) {
                stepIndex = currentStep;
                step.goToStep(elem, 1);
            }
            adjustStepHeight(stepIndex);
        });
    });
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.

2、step.js 添加 goToStep()方法

// 跳转到指定步骤
        goToStep: function (elem, index) {
            var currentIndex = $(elem).find('.layui-carousel-ind ul li.layui-this').index();
            var stepCount = $(elem).find('.layui-carousel-ind ul li').length;

            if (index < 0 || index >= stepCount) {
                // 超出步骤范围,不执行跳转
                return;
            }

            if (index > currentIndex) {
                // 跳转到后续步骤
                var diff = index - currentIndex;
                for (var i = 0; i < diff; i++) {
                    $(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click');
                }
            } else if (index < currentIndex) {
                // 跳转到前面步骤
                var diff = currentIndex - index;
                for (var i = 0; i < diff; i++) {
                    $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click');
                }
            }

            // 更新步骤头部样式
            $(elem).find('.step-item-head').removeClass('step-item-head-done');
            $(elem).find('.step-item-head').eq(index).addClass('step-item-head-done');
        },
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

二、存在问题

这里面比如他在step3 上,内容是不显示的,我不知道是我代码的bug,还是这个框架的问题(后续如解决会更新!)  求求求,解决方法

三、个人总结

从23.12.2-3号吧,从那时候就一直弄这个分步表单,差不多弄了两个月,出现了很多问题,这里面layui框架step组件好像是不存在自适应高度的,给大家一起避避坑(存在的主要问题还是1、摸鱼(嘿嘿,不能怪我,太无聊了)2、存在问题不知道找谁去问,不熟悉代码,喜欢套框架,拿来直接能用。跟最开始element-ui 一样。后续会深入了解代码)后期的话我想弄一个群,大家可以一起分享问题和解决问题(主要是我想厚脸皮问问题.🤭)。 

layui step 步骤条(分步表单)的表单提交 配置_ico_06