javascript - 在多步模式中显示第一个表单

标签 javascript jquery

我从网上复制了这段代码,来自 here

它用于通过滑出旧字段集并滑入新字段集来在单个模态中显示多个表单。

      <div class="modal-content">

         <!-- MultiStep Form -->
         <div class="row">
            <div class="col-md-12 ">
               <form id="msform" name="flatform" ng-submit="addflatinfo(flat, flatform)" novalidate>
                  <div class="modal-header">
                   <h4 class="modal-title" id="exampleModalLabel">Add flat</h4>
                  </div>

                  <!-- First fieldset -->
              <fieldset class="firstFieldSet">
                     <h4>
                        adf
                     </h4>
                     <div class="row">
                     ....
                  <input type="button" name="nextOcc"
                     class="nextO action-button 
                     adFlatSecondFieldsetCl" 
                     value="Next" />
              </fieldset>
           <!--Second fieldset -->
              <fieldset class="secondFieldSet">
                     <h4>
                        adf
                     </h4>
                     <div class="row">
                     ....

             </fieldset>

它工作正常,但是当我在第二个或第三个或第四个字段集中关闭模态时,它会显示我停止的字段集。因此,每当我单击按钮打开模式时,我都尝试执行上一个按钮将执行的操作(滑出当前字段集并显示前一个字段集)。

我的应用程序中有 5 个字段集。我跟踪当前的字段集,当再次打开模态时,我滑出关闭模态之前存在的字段集并显示第一个字段集。

但这不行.. 我在一个较大的字段集上看到一个较小的字段集,有时我除了模态标题什么都看不到,有时只是一个小的字段集,如下图所示,它全都搞砸了。

如何在打开模式时始终显示第一个字段集?

单击具有 .nextO 类的按钮时显示下一个字段集的代码。

current_fs = $(".nextO").parent();
        next_fs = $(".nextO").parent().next();

        //activate next step on progressbar using the index of next_fs
        $("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");

        //show the next fieldset
        next_fs.show(); 
        //hide the current fieldset with style
        current_fs.animate({opacity: 0}, {
            step: function(now, mx) {
                //as the opacity of current_fs reduces to 0 - stored in "now"
                //1. scale current_fs down to 80%
                scale = 1 - (1 - now) * 0.2;
                //2. bring next_fs from the right(50%)
                left = (now * 50)+"%";
                //3. increase opacity of next_fs to 1 as it moves in
                opacity = 1 - now;
                current_fs.css({
                    'transform': 'scale('+scale+')',
                    'position': 'absolute'
                });
                next_fs.css({'left': left, 'opacity': opacity});
            }, 
            duration: 800, 
            complete: function(){
                current_fs.hide();
                animating = false;
            }, 
            //this comes from the custom easing plugin
            easing: 'easeInOutBack'
        });

转到上一个字段集的代码(这是我在首次打开模式时使用的代码,因此它始终显示第一个)。

if(animating) return false;
    animating = true;
    //fade remove the fieldset which was open before closing the modal -- $scope.currentAdFieldset 
    current_fs = $($scope.currentAdFieldset).parent();
    previous_fs = $('.adFlatSecondFieldsetCl').parent().prev();
    $("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active");
    console.log(previous_fs, "prevfs");
    previous_fs.show(); 
    current_fs.animate({opacity: 0}, {
        step: function(now, mx) {
            scale = 0.8 + (1 - now) * 0.2;
            left = ((1-now) * 50)+"%";
            opacity = 1 - now;
            current_fs.css({'left': left,  });
            previous_fs.css({'transform': 'scale('+scale+')', 'opacity': opacity});

        }, 
        duration: 800, 
        complete: function(){
            current_fs.hide();
            animating = false;
        }, 
        //this comes from the custom easing plugin
        easing: 'easeInOutBack'
    });

当我打开模式时,是否有正确的方法来显示第一个字段集。这就是它的样子。字段集不填充模态 img

编辑: 我在打开模式的按钮的 ng-click 上尝试了这个

$('.modal-content fieldset').css('opacity', '0');
    $('.modal-content fieldset').first().css('opacity', '1');
    $('.modal-content fieldset').first().show();
    $("#progressbar li:not(:eq(0))").removeClass('active');
    $('#apartmentsmodel').modal({ backdrop: 'static', keyboard: false, show: true });

编辑 2:

我尝试了这个以及答案所说的并且有效:

$('.modal-content fieldset').css({'opacity': '0','display':'none', 'transform' : 'scale(1)'});
    $('.modal-content fieldset').first().css({'opacity': '1', 'transform' : 'scale(1)', 'display':'block'});

最佳答案

试试这个片段。它使用 show.bs.modal 事件 ( more info ) 来检查是否打开了模式。

<script type="text/javascript">
    $(document).ready(function () {

        $('body').on('show.bs.modal', function () {

            //hide all the fieldsets
            $('.modal-content fieldset').css('opacity', '0');

            //show the first fieldset
            $('.modal-content fieldset').first().css('opacity', '1');
            $('.modal-content fieldset').first().show();

            //make sure the progress bar also show the first only
            $("#progressbar li:not(:eq(0))").removeClass('active');

        });

    });
</script>

这是使用 plugin you specified 中的示例代码测试的.在 Bootrap 4 模式中使用该站点上下载的 html、css 和 jquery,它起作用了。

更新

<!doctype html>
<html lang="nl">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link rel="stylesheet" href="bootstrap.css" />

</head>
<body>

    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
        Launch demo modal
    </button>

    <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">

                    <!-- progressbar -->
                    <ul id="progressbar">
                        <li class="active">Account Setup</li>
                        <li>Social Profiles</li>
                        <li>Personal Details</li>
                    </ul>

                    <!-- fieldsets -->
                    <fieldset>
                        <h2 class="fs-title">Create your account</h2>
                        <h3 class="fs-subtitle">This is step 1</h3>
                        <input type="text" name="email" placeholder="Email" />
                        <input type="password" name="pass" placeholder="Password" />
                        <input type="password" name="cpass" placeholder="Confirm Password" />
                        <input type="button" name="next" class="next action-button" value="Next" />
                    </fieldset>
                    <fieldset>
                        <h2 class="fs-title">Social Profiles</h2>
                        <h3 class="fs-subtitle">Your presence on the social network</h3>
                        <input type="text" name="twitter" placeholder="Twitter" />
                        <input type="text" name="facebook" placeholder="Facebook" />
                        <input type="text" name="gplus" placeholder="Google Plus" />
                        <input type="button" name="previous" class="previous action-button" value="Previous" />
                        <input type="button" name="next" class="next action-button" value="Next" />
                    </fieldset>
                    <fieldset>
                        <h2 class="fs-title">Personal Details</h2>
                        <h3 class="fs-subtitle">We will never sell it</h3>
                        <input type="text" name="fname" placeholder="First Name" />
                        <input type="text" name="lname" placeholder="Last Name" />
                        <input type="text" name="phone" placeholder="Phone" />
                        <textarea name="address" placeholder="Address"></textarea>
                        <input type="button" name="previous" class="previous action-button" value="Previous" />
                        <input type="submit" name="submit" class="submit action-button" value="Submit" />
                    </fieldset>

                </div>
            </div>
        </div>
    </div>

    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="bootstrap.js"></script>
    <script type="text/javascript" src="jquery.easing.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function () {

            $("#openmodal").click(function () {
                $('bootstrap-modal').modal('show');
                return false;
            });

            $('body').on('show.bs.modal', function () {

                //hide all the fieldsets
                $('.modal-content fieldset').css('opacity', '0');

                //show the first fieldset
                $('.modal-content fieldset').first().css('opacity', '1');
                $('.modal-content fieldset').first().show();

                //make sure the progress bar also show the first only
                $("#progressbar li:not(:eq(0))").removeClass('active');

            });

        });
    </script>

    <style>
        /*custom font*/

        @import url(http://fonts.googleapis.com/css?family=Montserrat);
        /*basic reset*/
        * {
            margin: 0;
            padding: 0;
        }

        html {
            height: 100%;
            /*Image only BG fallback*/
            background: url('http://thecodeplayer.com/uploads/media/gs.png');
            /*background = gradient + image pattern combo*/
            background: linear-gradient(rgba(196, 102, 0, 0.2), rgba(155, 89, 182, 0.2)), url('http://thecodeplayer.com/uploads/media/gs.png');
        }

        body {
            font-family: montserrat, arial, verdana;
        }
        /*form styles*/
        #msform {
            width: 400px;
            margin: 50px auto;
            text-align: center;
            position: relative;
        }

            #msform fieldset {
                background: white;
                border: 0 none;
                border-radius: 3px;
                box-shadow: 0 0 15px 1px rgba(0, 0, 0, 0.4);
                padding: 20px 30px;
                box-sizing: border-box;
                width: 80%;
                margin: 0 10%;
                /*stacking fieldsets above each other*/
                position: absolute;
            }
                /*Hide all except first fieldset*/
                #msform fieldset:not(:first-of-type) {
                    display: none;
                }
            /*inputs*/
            #msform input, #msform textarea {
                padding: 15px;
                border: 1px solid #ccc;
                border-radius: 3px;
                margin-bottom: 10px;
                width: 100%;
                box-sizing: border-box;
                font-family: montserrat;
                color: #2C3E50;
                font-size: 13px;
            }
            /*buttons*/
            #msform .action-button {
                width: 100px;
                background: #27AE60;
                font-weight: bold;
                color: white;
                border: 0 none;
                border-radius: 1px;
                cursor: pointer;
                padding: 10px 5px;
                margin: 10px 5px;
            }

                #msform .action-button:hover, #msform .action-button:focus {
                    box-shadow: 0 0 0 2px white, 0 0 0 3px #27AE60;
                }
        /*headings*/
        .fs-title {
            font-size: 15px;
            text-transform: uppercase;
            color: #2C3E50;
            margin-bottom: 10px;
        }

        .fs-subtitle {
            font-weight: normal;
            font-size: 13px;
            color: #666;
            margin-bottom: 20px;
        }
        /*progressbar*/
        #progressbar {
            margin-bottom: 30px;
            overflow: hidden;
            /*CSS counters to number the steps*/
            counter-reset: step;
        }

            #progressbar li {
                list-style-type: none;
                color: white;
                text-transform: uppercase;
                font-size: 9px;
                width: 33.33%;
                float: left;
                position: relative;
            }

                #progressbar li:before {
                    content: counter(step);
                    counter-increment: step;
                    width: 20px;
                    line-height: 20px;
                    display: block;
                    font-size: 10px;
                    color: #333;
                    background: white;
                    border-radius: 3px;
                    margin: 0 auto 5px auto;
                }
                /*progressbar connectors*/
                #progressbar li:after {
                    content: '';
                    width: 100%;
                    height: 2px;
                    background: white;
                    position: absolute;
                    left: -50%;
                    top: 9px;
                    z-index: -1; /*put it behind the numbers*/
                }

                #progressbar li:first-child:after {
                    /*connector not needed before the first step*/
                    content: none;
                }
                /*marking active/completed steps green*/
                /*The number of the step and the connector before it = green*/
                #progressbar li.active:before, #progressbar li.active:after {
                    background: #27AE60;
                    color: white;
                }
    </style>

    <script>
        $(function () {

            //jQuery time
            var current_fs, next_fs, previous_fs; //fieldsets
            var left, opacity, scale; //fieldset properties which we will animate
            var animating; //flag to prevent quick multi-click glitches

            $(".next").click(function () {
                if (animating) return false;
                animating = true;

                current_fs = $(this).parent();
                next_fs = $(this).parent().next();

                //activate next step on progressbar using the index of next_fs
                $("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");

                //show the next fieldset
                next_fs.show();
                //hide the current fieldset with style
                current_fs.animate({ opacity: 0 }, {
                    step: function (now, mx) {
                        //as the opacity of current_fs reduces to 0 - stored in "now"
                        //1. scale current_fs down to 80%
                        scale = 1 - (1 - now) * 0.2;
                        //2. bring next_fs from the right(50%)
                        left = (now * 50) + "%";
                        //3. increase opacity of next_fs to 1 as it moves in
                        opacity = 1 - now;
                        current_fs.css({ 'transform': 'scale(' + scale + ')' });
                        next_fs.css({ 'left': left, 'opacity': opacity });
                    },
                    duration: 800,
                    complete: function () {
                        current_fs.hide();
                        animating = false;
                    },
                    //this comes from the custom easing plugin
                    easing: 'easeInOutBack'
                });
            });

            $(".previous").click(function () {
                if (animating) return false;
                animating = true;

                current_fs = $(this).parent();
                previous_fs = $(this).parent().prev();

                //de-activate current step on progressbar
                $("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active");

                //show the previous fieldset
                previous_fs.show();
                //hide the current fieldset with style
                current_fs.animate({ opacity: 0 }, {
                    step: function (now, mx) {
                        //as the opacity of current_fs reduces to 0 - stored in "now"
                        //1. scale previous_fs from 80% to 100%
                        scale = 0.8 + (1 - now) * 0.2;
                        //2. take current_fs to the right(50%) - from 0%
                        left = ((1 - now) * 50) + "%";
                        //3. increase opacity of previous_fs to 1 as it moves in
                        opacity = 1 - now;
                        current_fs.css({ 'left': left });
                        previous_fs.css({ 'transform': 'scale(' + scale + ')', 'opacity': opacity });
                    },
                    duration: 800,
                    complete: function () {
                        current_fs.hide();
                        animating = false;
                    },
                    //this comes from the custom easing plugin
                    easing: 'easeInOutBack'
                });
            });

            $(".submit").click(function () {
                return false;
            })

        });
    </script>

</body>
</html>

关于javascript - 在多步模式中显示第一个表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52055778/

相关文章:

jquery - 年 View 中全日历的工具提示

javascript - jQueryUI 按钮显示操作的子菜单

jquery - 如何在不编辑 css 的情况下添加 fadeIn() 隐藏显示效果

javascript - 如何在浏览器中运行.html文件?

javascript - 根据登录状态加载按钮时出现问题

Javascript:调用阻塞 HTTP POST

javascript - iframe 调整高度自动不起作用

javascript - 打开 maxmind DB 并在 nodejs 中访问它

javascript - 如何借助启用/禁用按钮禁用/启用表格中的整行?

javascript - RegEx - 查找所有用引号括起来的字符串集