后退按钮,如 jquery 中的面包屑

Posted

技术标签:

【中文标题】后退按钮,如 jquery 中的面包屑【英文标题】:Back button like breadcrumbs in jquery 【发布时间】:2022-01-11 08:13:41 【问题描述】:

我在左侧显示菜单。到目前为止,菜单没有问题。 现在我正在处理后退按钮。一旦用户点击Demo1 -> Demo 1.1 然后它将显示Demo 1.1.1, Demo 1.1.2 等。所以我打算在顶部显示返回按钮

//back
Demo1->Demo 1.1

//dropdown
Demo 1.1.1
Demo 1.1.2
Demo 1.1.3
Demo 1.1.4

注意:我的菜单是完全动态的,我不想添加静态值。

$('.menu-item-has-children .sub-menu').css(
  'left': '-320px'
);

$('.menu-item-has-children > a').click(function() 
  //alert('hello');

  var positionMenu = $(this).parent().attr('id');
  //console.log(positionMenu); 
  $('.menu-item-has-children[id=' + positionMenu + '] > .sub-menu').css(
    'left': '0px'
  );
  var pMenu1 = $(this).text();
  console.log(pMenu1);
  $('.secondary').prepend(pMenu1);
);
ul 
  padding-left: 0;


.secondary 
  z-index: 99;
  background: #f8f8f8;
  -webkit-box-shadow: 0 8px 24px rgba(229, 228, 230, 0.4);
  box-shadow: 0 8px 24px rgba(229, 228, 230, 0.4);
  -webkit-transition: left 0.2s ease, width 0.2s ease;
  transition: left 0.2s ease, width 0.2s ease;
  border-right: 1px solid #eaedf1;
  position: fixed;
  top: 0;
  height: 100%;
  padding: 12px;
  width: 320px;


.menu li 
  padding-bottom: 10px;
  padding-left: 23px;
  list-style: none;


.menu-item-has-children>a 
  position: relative;
  display: block;


.menu-item-has-children .sub-menu 
  width: 100%;
  height: 100%;
  padding-top: 40px;
  background: #f8f8f8;
  list-style: none;
  position: absolute;
  top: 0;
  left: 0;
  transition: left .3s;
  z-index: 10;


.menu-item-has-children>a::after 
  display: inline-block;
  vertical-align: middle;
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
  content: "\f054";
  position: absolute;
  right: 05px;
  top: 0px;
  font-size: 12px;
<script src="https://kit.fontawesome.com/97446b8f60.js" crossorigin="anonymous"></script>

<div class="secondary">
  <ul id="menu-inner-page-menu" class="menu">
    <li>Home</li>
    <li id="menu-item-204" class="menu-item-has-children"><a href="#">Demo1</a>
      <ul class="sub-menu">
        <li id="menu-item-304" class="menu-item-has-children"><a href="#">Demo 1.1</a>
          <ul class="sub-menu">
            <li><a href="">Demo 1.1.1</a></li>
            <li><a href="">Demo 1.1.2</a></li>
            <li><a href="">Demo 1.1.2</a></li>
          </ul>

        </li>
        <li id="menu-item-305"><a href="">Demo 1.2</a></li>
        <li id="menu-item-306"><a href="">Demo 1.3</a></li>
        <li id="menu-item-307"><a href="">Demo 1.4</a></li>
      </ul>
    </li>

    <li id="menu-item-205" class="menu-item-has-children"><a href="#">Demo2</a>
      <ul class="sub-menu">
        <li id="menu-item-315"><a href="">Demo 2.1</a></li>
        <li id="menu-item-316"><a href="">Demo 2.2</a></li>
      </ul>
    </li>

  </ul>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

现在我正在控制台中获取输出。

同样获取 html 视图源代码

现在,如何使可点击?

【问题讨论】:

【参考方案1】:

您的 HTML。

<div class="secondary">
    <div id="menu-breadcrumb"></div>
    <ul id="menu-inner-page-menu" class="menu">
        <li>Home</li>
        <li id="menu-item-204" class="menu-item-has-children"><a href="#">Demo1</a>
            <ul class="sub-menu">
                <li id="menu-item-304" class="menu-item-has-children"><a href="#">Demo 1.1</a>
                    <ul class="sub-menu">
                        <li><a href="">Demo 1.1.1</a></li>
                        <li><a href="">Demo 1.1.2</a></li>
                        <li><a href="">Demo 1.1.2</a></li>
                    </ul>

                </li>
                <li id="menu-item-305"><a href="">Demo 1.2</a></li>
                <li id="menu-item-306"><a href="">Demo 1.3</a></li>
                <li id="menu-item-307"><a href="">Demo 1.4</a></li>
            </ul>
        </li>

        <li id="menu-item-205" class="menu-item-has-children"><a href="#">Demo2</a>
            <ul class="sub-menu">
                <li id="menu-item-315"><a href="">Demo 2.1</a></li>
                <li id="menu-item-316"><a href="">Demo 2.2</a></li>
            </ul>
        </li>

    </ul>
</div>

<script src="https://kit.fontawesome.com/97446b8f60.js" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

CSS

ul 
  padding-left: 0;


.secondary 
  z-index: 99;
  background: #f8f8f8;
  -webkit-box-shadow: 0 8px 24px rgba(229, 228, 230, 0.4);
  box-shadow: 0 8px 24px rgba(229, 228, 230, 0.4);
  -webkit-transition: left 0.2s ease, width 0.2s ease;
  transition: left 0.2s ease, width 0.2s ease;
  border-right: 1px solid #eaedf1;
  position: fixed;
  top: 0;
  height: 100%;
  padding: 12px;
  width: 320px;


.menu li 
  padding-bottom: 10px;
  padding-left: 23px;
  list-style: none;


.menu-item-has-children>a 
  position: relative;
  display: block;


.menu-item-has-children .sub-menu 
  width: 100%;
  height: 100%;
  padding-top: 40px;
  background: #f8f8f8;
  list-style: none;
  position: absolute;
  top: 0;
  left: 0;
  transition: left .3s;
  z-index: 10;

/* select only first child li that has sub menu to top 40 */
.menu > li.menu-item-has-children > .sub-menu 
    top: 40px;


.menu-item-has-children>a::after 
  display: inline-block;
  vertical-align: middle;
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
  content: "\f054";
  position: absolute;
  right: 05px;
  top: 0px;
  font-size: 12px;


/* below is style for menu breadcrumb */
.mbc-link-back 
    color: #0066cc;
    text-decoration: none;


#menu-breadcrumb a + a::before 
    color: #222;
    content: '>';
    cursor: default;
    padding: 0 3px;

javascript (jQuery)

$('.menu-item-has-children .sub-menu').css(
    'left': '-320px'
);

var menuBreadcrumb = document.getElementById('menu-breadcrumb');

$('.menu-item-has-children > a').click(function() 
    //alert('hello');

    var thismenuLi = $(this).parent().attr('id');
    let thismenuText = $(this).text();
    let mbcElement = '<a class="mbc-link-back" href="#" data-menu-item-id="' + thismenuLi + '">' + thismenuText + '</a>'
    menuBreadcrumb.insertAdjacentHTML('beforeend', mbcElement);
    //console.log(thismenuLi); 
    $('.menu-item-has-children[id=' + thismenuLi + '] > .sub-menu').css(
        'left': '0px'
    );

);


// use event delegation to listen click on menu breadcrumb and go back.
$('body').on('click', '.mbc-link-back', function(e) 
    e.preventDefault();
    // in case user click on the item before last, go back all until the end.
    $(this).nextAll().each(function(index) 
        mbcGoBack($(this));
    );
    mbcGoBack($(this));
);
function mbcGoBack(jQThis) 
    let menuLiId = jQThis.data('menuItemId');
    $('.menu-item-has-children[id=' + menuLiId + '] > .sub-menu').css(
        'left': '-320px'// must match from the beginning.
    );
    jQThis.remove();

我已将您的一个 JS 变量重命名以使其更易于理解,添加 JS 功能,稍微修改 CSS 以仅针对第一个子项的 top 值,为菜单面包屑添加 CSS。

See it in action

【讨论】:

让我看看答案 是的,它正在处理虚拟文本,但我遇到了实际内容的一个问题。我的内容太大了。我打算缩短菜单.. 如果 Demo1->Demo 1.1 这没关系,但如果菜单太大,如 Demo1->Demo 1.1-> Demo1.1.1,那么我必须只显示第一个和最后一个输出,如 Demo1- >....-> Demo1.1.1 让我试试这个。你对此有什么想法吗 不,我不认为很多面包屑项目应该放在这个位置。您应该使用后退按钮来获得更好的 UI/UX 和样式。那些长面包屑应该在顶部的主列中,小字体。 For example 或者您可以使用text truncate,但结果不是您所期望的。将面包屑(单击后)移动到主要内容是最佳选择,因为它可以尽可能多地扩展。

以上是关于后退按钮,如 jquery 中的面包屑的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET 切换到面包和黄油 HTML/jQuery 的优势

折叠在导航栏面包屑按钮的 ng-bootstrap 和 Angular 4 应用程序中不起作用

使用jquery mobile时如何处理手机中的表单导航后退按钮

如何用jQuery禁用浏览器的前进后退按钮

如何使用面包屑导航组件

SEO之面包屑导航