首页 > 解决方案 > JQuery隐藏和淡入时丢失的滚动位置

问题描述

在页面上有一个问题列表,可能很长。我在示例代码中创建了一个小列表。用户滚动到问题,点击它,列表隐藏,单个问题出现。用户阅读并单击“X”将其关闭,原始列表重新出现在相同的位置(我想要的,但没有得到)。

问题是列表重新出现在顶部而不是保持其滚动位置。

使用 event.preventDefault() 更改为显示/隐藏、fadeIN/fadeOut 似乎没有什么区别。

代码使用 Bootstrap 4/Jquery。
(放大浏览器以获取滚动条进行测试)

下面的代码:

    //********************************************************************************************************
    //     Clone Question, display on its own, hide existing list of questions
    //********************************************************************************************************     
    $(document).on('click', '[data-name="question"]', function(){
        event.preventDefault();
        var qid = $(this).attr("data-qid");//id of the question being answered        
        //var clone = $(this).clone();//clone entire question element to paste into new space
        var clone = $('#header'+qid).clone();//clone entire question element to paste into new space    
        $('#load_data').hide();
        $(clone).hide().appendTo('#load_single_answer').fadeIn(1000);
        var html = '<div class="container">'+//provide an X button to close the single question display
            '<div class="exit btn btn-light btn-space col-12 box displ text-center align-self-center" style="font-size:120%"><strong>X</strong></div>'+
            '</div>';                    
        $(html).appendTo('#load_single_answer'); 
    });
    //**********************************************************************
    //    Close single question display, bring back the list of questions
    //**********************************************************************
    $(document).on('click', '.exit', function(){
        event.preventDefault();
        //restore all background data
        $('#load_data').fadeIn(500);
        $('#load_single_answer').empty();//clear out single answer data
    });
<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- JQuery -->
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous" type="text/javascript" charset="utf-8"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>   
    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</head>
<body style="background-color:#f2f2f2;">

    <!-- loading point for displaying single questions and answers -->
    <div class='container' style="max-width:900px;">
        <div id="load_single_answer"></div>
    </div>
 
    <div id="main">
            <!-- Question and Answers loaded here via ajax call -->
            <div id = "dataX" class="container p-0" style="max-width: 900px;">
                <div id="load_data">               
                    <!-- BEGINNING LIST OF QUESTIONS-->
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header165" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="165" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>                    
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header166" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="166" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header167" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="167" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header168" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="168" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header169" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="169" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header170" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="170" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>    
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header171" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="171" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>     
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header172" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="172" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>      
                    <!-- END OF LIST OF QUESTIONS -->
                </div> 
            </div>
    </div>
    </body>

标签: javascriptjquerybootstrap-4

解决方案


我会通过使列表显示和隐藏(而不是删除它)然后将单个答案视图固定到视口顶部(而不是添加到页面顶部)来做到这一点。这样,滚动位置自然而然地保留下来,而无需管理某种状态。

如果你想用动画隐藏问题,你应该使用 CSS。

//********************************************************************************************************
//     Clone Question, display on its own, hide existing list of questions
//********************************************************************************************************     
$(document).on('click', '[data-name="question"]', function(){
    event.preventDefault();
    var qid = $(this).attr("data-qid");//id of the question being answered        
    //var clone = $(this).clone();//clone entire question element to paste into new space
    var clone = $('#header'+qid).clone();//clone entire question element to paste into new space    
    $('#load_data').removeClass('fadein').addClass('fadeout')
    $(clone).hide().appendTo('#load_single_answer').fadeIn(1000);
    var html = '<div class="container">'+//provide an X button to close the single question display
        '<div class="exit btn btn-light btn-space col-12 box displ text-center align-self-center" style="font-size:120%"><strong>X</strong></div>'+
        '</div>';                    
    $(html).appendTo('#load_single_answer'); 
});
//**********************************************************************
//    Close single question display, bring back the list of questions
//**********************************************************************
$(document).on('click', '.exit', function(){
    event.preventDefault();
    //restore all background data
    $('#load_data').removeClass('fadeout').addClass('fadein')
    $('#load_single_answer').empty();//clear out single answer data
});
#load_single_answer {
	position: fixed;
	top: 0;
	left: 0;
	z-index: 1;
}
.fadeout {
	opacity: 0;
	transition-duration: .5s;
}
.fadein {
	opacity: 1;
	transition-duration: .5s;
}
<head>
	    <!-- JQuery -->
	    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous" type="text/javascript" charset="utf-8"></script>
	    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>   
	    <!-- Bootstrap -->
	    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
	    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</head>
<body style="background-color:#f2f2f2;">

    <!-- loading point for displaying single questions and answers -->
    <div class='container' style="max-width:900px;">
        <div id="load_single_answer"></div>
    </div>

    <div id="main">
            <!-- Question and Answers loaded here via ajax call -->
            <div id = "dataX" class="container p-0" style="max-width: 900px;">
                <div id="load_data">               
                    <!-- BEGINNING LIST OF QUESTIONS-->
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header165" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="165" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>                    
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header166" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="166" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header167" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="167" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header168" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="168" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header169" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="169" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header170" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="170" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>    
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header171" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="171" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>     
                    <!-- questions here -->
                    <div data-name="results">
                        <!-- individual question container with DETAILS link  -->
                        <div class="card-header" id="header172" style="border-radius:10px;background-color:white;border:none;">                 
                            <div data-qid="172" data-aid="0" data-name="question" style="cursor: pointer;">
                                <div style="margin-bottom:-7px;">
                                    <h5 style="font-family: &quot;Verdana&quot;, Verdana;font-weight: bolder;margin-top:0px;"><span style="white-space:pre-wrap;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam?</span>
                                </div>                   
                            </div> 
                        </div> 
                        <br>
                    </div>      
                    <!-- END OF LIST OF QUESTIONS -->
                </div> 
            </div>
    </div>
</body>


推荐阅读