如何使屏幕跟随 Slidetoggle

Posted

技术标签:

【中文标题】如何使屏幕跟随 Slidetoggle【英文标题】:How to make the screen follow the Slidetoggle 【发布时间】:2017-09-17 17:28:33 【问题描述】:

我有一个问题/答案列表divs:当我通过单击问题打开答案时,所有其他答案都会关闭。

<div class="question">
  QUESTION 1
</div>

<div class="answer">
  ANSWER 1
</div>

<div class="question">
  QUESTION 2
</div>

<div class="answer">
  ANSWER 2
</div>

(etc.)

为此,我使用了一个 javascript 代码 found on ***,效果很好:

$(document).ready(function() 
  var $answers = $('.answer');
  $(".question").click(function() 
    var $ans = $(this).next(".answer").stop(true).slideToggle(500);
    $answers.not($ans).filter(':visible').stop(true).slideUp();
  )
);

我的问题:如果打开的答案之一(比如说答案 2)真的很长,高度很大,当我点击下一个问题(问题 3)时,所有的divs 都会向上(跟随答案 2 的 SlideUp),屏幕不会跟随它们。而且我想要的答案(答案 3)将不可见,我必须向上滚动才能看到它。

这是一个例子(问题 2 是长答案):https://jsfiddle.net/TB54/1dgchwyw/1/

有什么方法可以让屏幕上滑出刚刚关闭的答案? 或者至少让屏幕滚动到点击的问题?

【问题讨论】:

【参考方案1】:

如果您设置minmax-height,您的代码可以正常工作,只需将overflow 设置为自动。在最好的情况下,滚动浏览一个很长的答案可能会很痛苦,所以如果一个答案很长,最好让它在 div 内滚动,然后它不会立即显得那么长(而且可能令人生畏!)

看看小提琴https://jsfiddle.net/769ohszw/

(我将最小高度设置为 20vh,最大设置为 30vh 并溢出到自动)

【讨论】:

谢谢!这是一个很好的备份解决方案,但我宁愿避免使用滚动条。 @TB54 它可能会改善用户体验。考虑到这一点。 :)【参考方案2】:

一位朋友向我推荐了一个 JQuery 解决方案,让屏幕滚动到点击的问题。

这是完整的新代码(在本例中,问题的类别是“.exchange_question”,答案的类别是“.exchange_answer”)

$(document).ready(function() 

  /*
   * DURATION ANIM
   */
  var SlideOfTheText = 500;
  var ScrollToTheQuestion = 500;

  // target the questions and answers
  var question = $('.exchange_question');
  var answer = $('.exchange_answer');

  // hide the loaded content
  answer.hide();

  // handler 
  $(question).on('click', clickHandler.bind(this));

  // fn click
  function clickHandler(event) 
    var currentQuestion = event.currentTarget;
    var currentAnswer = $(currentQuestion).next();

    // at click, we first hide all
    hiddenAnswer(answer);

    // if the clicked div is hidden
    if (currentAnswer.css('display') == 'none') 
      showAnswer(currentAnswer, currentQuestion);
      //if not, we hide it
     else 
      hiddenAnswer(currentAnswer);
    
  

  // fn show
  function showAnswer(currentAnswer, currentQuestion) 
    // we make them all slide up
    $(currentAnswer).slideDown(SlideOfTheText, function() 

      $('html, body').animate(
        scrollTop: $(currentAnswer).offset().top - $(currentQuestion).height() - 50
      , ScrollToTheQuestion);

    );
  

  // fn hide
  function hiddenAnswer(currentAnswer) 
    // we make them all slide up
    $(currentAnswer).slideUp();
  

);

Exemple here

它并不完美(它不会同时发生:首先问题打开,然后屏幕紧随其后......),它需要用一点easeInOut 来软化,但它有效!

【讨论】:

这是我的回答中我的代码的一个非常细微的变化。用滚动条!请接受我的回答。

以上是关于如何使屏幕跟随 Slidetoggle的主要内容,如果未能解决你的问题,请参考以下文章

如何使按钮宽度跟随基于文本的最大宽度按钮?

如何使 QLineEdit 跟随光标向我显示它的坐标

如何使底部按钮跟随 SwiftUI 中的键盘显示

如何使子列在滚动时跟随父行

如何使相机跟随unity3d C#中的对象?

如何使 CAGradientLayer 中的渐变跟随滑块上的某个值?