Виджет JQuery Mobile Panel - открытие свертываемых списков приводит к тому, что прокрутка переходит к нижней части страницы, когда ее размер превышает ее высоту. Зачем? - PullRequest
0 голосов
/ 01 мая 2018

Попытка создать разборное многоуровневое меню с помощью виджета Panel JQuery Mobile (v 1.4.5). Я добавил анимацию slideUp / Down, чтобы сделать открытие подменю более заметным.

<div data-role="page">

<div data-role="panel" id="mainmenu" role="navigation" data-display="overlay">
  <ul data-role="listview" class="ui-listview-outer">
    <li><a href="#">Home Page</a></li>
    <li data-role="collapsible" data-inset="false">
      <h3>LIST 1 OF 6</h3>
      <ul data-role="listview" data-theme="b">
        <li><a href="#">1.1</a></li>
        <li><a href="#">1.2</a></li>
        <li><a href="#">1.3</a></li>
        <!-- etc. -->
      </ul>
    </li>
    <li data-role="collapsible" data-inset="false">
      <h3>List 2 OF 6</h3>
      <ul data-role="listview" data-theme="c">
        <li role="menuitem"><a href="#">2.1</a></li>
        <li role="menuitem"><a href="#">2.2</a></li>
        <li role="menuitem"><a href="#">2.3</a></li>
        <!-- etc. -->
      </ul>
    </li>
    <li data-role="collapsible" data-inset="false">
      <h3>List 3 OF 6</h3>
      <ul data-role="listview">
        <li><a href="#">3.1</a></li>
        <li><a href="#">3.2</a></li>
        <li><a href="#">3.3</a></li>
        <!-- etc. -->
      </ul>
    </li>
    <li data-role="collapsible" data-inset="false">
      <h3>LIST 4 OF 6</h3>
      <ul data-role="listview">
        <li><a href="#">4.1</a></li>
        <li><a href="#">4.2</a></li>
        <li><a href="#">4.3</a></li>
        <!-- etc. -->
      </ul>
    </li>
    <li data-role="collapsible" data-inset="false">
      <h3>LIST 5 of 6</h3>
      <ul data-role="listview">
        <li><a href="#">5.1</a></li>
        <li><a href="#">5.2</a></li>
        <li><a href="#">5.3</a></li>
        <!-- etc. -->
      </ul>
    </li>
    <li data-role="collapsible" data-inset="false">
      <h3>LIST 6 OF 6</h3>
      <ul data-role="listview">
        <li><a href="#">6.1</a></li>
        <li><a href="#">6.2</a></li>
        <li><a href="#">6.3</a></li>
        <!-- etc. -->
      </ul>
      </li>
  </ul>
</div>

<div data-role="header" class="header">
<a href="#mainmenu" data-icon="bars" data-iconpos="notext">Menu</a><h1>This is the header
</h1>
</div>

<div data-role="content" class="content">
This is the content
<br>
<br>
<br>
<br>
<!-- <br>'s etc. to increase page length for illustrative purposes -->
</div>

<div data-role="footer" class="footer">
This is the footer
</div>

</div>

Проблема: когда высота меню превышает высоту div страницы (что происходит быстро, поскольку верхнее подменю довольно длинное), а затем еще одно подменю , расположенное ниже, расширяется / сворачивается, область просмотра переходы так, что нижняя часть страницы находится внизу области просмотра, толкая недавно открытое подменю под областью просмотра и, несомненно, вводит пользователя в заблуждение относительно того, что только что произошло.

В идеале, подменю, которое только что щелкнуло, остается в поле зрения, анимация slideDown видима, и пользователь понимает, что подменю открылось. JQuery, по-видимому, динамически изменяет высоту страницы в зависимости от высоты меню, что имеет смысл, но внезапное смещение области просмотра ... меньше.

Поведение сохраняется с или без анимации слайдов, включенной ниже:

$(document).ready(function () {

  $(document).on("collapsibleexpand", ".ui-collapsible", function (event) {
        var contentDiv = $(this).children(".ui-collapsible-content");
        contentDiv.hide();
        contentDiv.slideDown(300);
        event.stopPropagation(); // don't bubble up
    });

    $(document).on("collapsiblecollapse", ".ui-collapsible", function (event) {
        var contentDiv = $(this).children('.ui-collapsible-content');
        contentDiv.slideUp(300);
        event.stopPropagation(); // don't bubble up
    });
}); 

Рабочая скрипка, чтобы показать проблему

Я далёк от того, чтобы быть экспертом по JQuery / JS / JQM, и вполне может быть, что я делаю здесь что-то, что не рекомендуется (например, я не видел много о вложенных списках в панели для навигации) , Если это так, я готов услышать об этом.

1 Ответ

0 голосов
/ 02 мая 2018

Вот мое предложение для такого рода навигационной системы. ИМХО должно быть два прокручиваемых элемента, содержимое страницы и подсистема меню (боковая панель).

Я не могу полностью понять Ваше предложение " ... область просмотра скачет так, что нижняя часть страницы находится внизу области просмотра ", но в любом случае, мне нравится Ваша идея о скользящем сабвуфере -Меню, поэтому я считаю, что сложность заключается в следующем: как рассчитать количество прокрутки, необходимое для перемещения текущего пункта меню наверх.

Пожалуйста, имейте в виду, что я не тестировал этот кусок кода ни при каких обстоятельствах, но на первый взгляд кажется, что все в порядке - по крайней мере, в браузере.

$(document).ready(function() {
  $(document).on("collapsibleexpand", ".ui-collapsible", function(e) {
    var self = $(this), 
        menu = $("#mainmenu"),
        pageY = $(document).scrollTop(),
        content = $(this).children(".ui-collapsible-content");
    content.hide();
    content.slideDown({
        duration: 300,
        step: function(now, fx) {
          if (fx.prop == "height") {
            var pct = ((100 * now) / fx.end),
              itemTop = $(self).offset().top,
              menuScrollTop = $(menu).scrollTop(),
              amt = (itemTop - pageY) / 100 * pct;
            menu.scrollTop(menuScrollTop + amt);
          }
        }
      }
    );
    e.stopPropagation(); // don't bubble up
  });

  $(document).on("collapsiblecollapse", ".ui-collapsible", function(e) {
    var content = $(this).children('.ui-collapsible-content');
    content.slideUp(300);
    e.stopPropagation(); // don't bubble up
  });
});
.content {
  text-align: center;
}

#mainmenu {
  position: fixed;
  overflow-y: scroll;
  height: 100%;
}

.ui-page-active {
  overflow-y: scroll;
  min-height: 100% !important;
}

li,
ul {
  padding: 0 !important;
}

h3 {
  margin: 0 !important;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css">
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.js"></script>
</head>
<body>
  <div data-role="page">
    <div data-role="panel" id="mainmenu" role="navigation" data-display="overlay">
      <ul data-role="listview" class="ui-listview-outer">
        <li><a href="#">Home Page</a></li>
        <li data-role="collapsible" data-inset="false">
          <h3>LIST 1 OF 6</h3>
          <ul data-role="listview" data-theme="b">
            <li><a href="#">1.1</a></li>
            <li><a href="#">1.2</a></li>
            <li><a href="#">1.3</a></li>
            <li><a href="#">1.4</a></li>
            <li><a href="#">1.5</a></li>
            <li><a href="#">1.6</a></li>
            <li><a href="#">1.7</a></li>
            <li><a href="#">1.8</a></li>
            <li><a href="#">1.9</a></li>
            <li><a href="#">1.10</a></li>
            <li><a href="#">1.11</a></li>
            <li><a href="#">1.12</a></li>
            <li><a href="#">1.13</a></li>
            <li><a href="#">1.14</a></li>
            <li><a href="#">1.15</a></li>
            <li><a href="#">1.16</a></li>
            <li><a href="#">1.17</a></li>
            <li><a href="#">1.18</a></li>
            <li><a href="#">1.19</a></li>
            <li><a href="#">1.20</a></li>
            <li><a href="#">1.21</a></li>
            <li><a href="#">1.22</a></li>
            <li><a href="#">1.23</a></li>
            <li><a href="#">1.24</a></li>
            <li><a href="#">1.25</a></li>
            <li><a href="#">1.26</a></li>
            <li><a href="#">1.27</a></li>
            <li><a href="#">1.28</a></li>
            <li><a href="#">1.29</a></li>
          </ul>
        </li>
        <li data-role="collapsible" data-inset="false">
          <h3>List 2 OF 6</h3>
          <ul data-role="listview" data-theme="c">
            <li><a href="#">2.1</a></li>
            <li><a href="#">2.2</a></li>
            <li><a href="#">2.3</a></li>
            <li><a href="#">2.4</a></li>
            <li><a href="#">2.5</a></li>
            <li><a href="#">2.6</a></li>
            <li><a href="#">2.7</a></li>
            <li><a href="#">2.8</a></li>
            <li><a href="#">2.9</a></li>
            <li><a href="#">2.10</a></li>
            <li><a href="#">2.11</a></li>
            <li><a href="#">2.12</a></li>
            <li><a href="#">2.13</a></li>
            <li><a href="#">2.14</a></li>
            <li><a href="#">2.15</a></li>
            <li><a href="#">2.16</a></li>
          </ul>
        </li>
        <li data-role="collapsible" data-inset="false">
          <h3>List 3 OF 6</h3>
          <ul data-role="listview">
            <li><a href="#">3.1</a></li>
            <li><a href="#">3.2</a></li>
            <li><a href="#">3.3</a></li>
            <li><a href="#">3.4</a></li>
            <li><a href="#">3.5</a></li>
            <li><a href="#">3.6</a></li>
            <li><a href="#">3.7</a></li>
          </ul>
        </li>
        <li data-role="collapsible" data-inset="false">
          <h3>LIST 4 OF 6</h3>
          <ul data-role="listview">
            <li><a href="#">4.1</a></li>
            <li><a href="#">4.2</a></li>
            <li><a href="#">4.3</a></li>
          </ul>
        </li>
        <li data-role="collapsible" data-inset="false">
          <h3>LIST 5 of 6</h3>
          <ul data-role="listview">
            <li><a href="#">5.1</a></li>
            <li><a href="#">5.2</a></li>
            <li><a href="#">5.3</a></li>
            <li><a href="#">5.4</a></li>
            <li><a href="#">5.5</a></li>
            <li><a href="#">5.6</a></li>
            <li><a href="#">5.7</a></li>
            <li><a href="#">5.8</a></li>
            <li><a href="#">5.9</a></li>
            <li><a href="#">5.10</a></li>
          </ul>
        </li>
        <li data-role="collapsible" data-inset="false">
          <h3>LIST 6 OF 6</h3>
          <ul data-role="listview">
            <li><a href="#">6.1</a></li>
            <li><a href="#">6.2</a></li>
            <li><a href="#">6.3</a></li>
            <li><a href="#">6.4</a></li>
            <li><a href="#">6.5</a></li>
            <li><a href="#">6.6</a></li>
            <li><a href="#">6.7</a></li>
            <li><a href="#">6.8</a></li>
            <li><a href="#">6.9</a></li>
            <li><a href="#">6.10</a></li>
          </ul>
        </li>
      </ul>
    </div>
    <div data-role="header" class="header">
      <a href="#mainmenu" data-icon="bars" data-iconpos="notext">Menu</a>
      <h1>This is the header</h1>
    </div>
    <div data-role="content" class="content">
      This is the content
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
    </div>
    <div data-role="footer" class="footer">
      <h1>This is the footer</h1>
    </div>
  </div>
</body>
</html>

Пожалуйста, протестируйте этот подход выше на всех Ваших доступных устройствах и дайте мне обратную связь.

...