【问题标题】:How to change position of dropdown, if menu is not fit on the screen jQuery如果菜单不适合屏幕jQuery,如何更改下拉菜单的位置
【发布时间】:2021-01-25 07:34:33
【问题描述】:

我使用下拉菜单,这个下拉菜单放在桌子上。

但是如果没有足够的地方打开下拉菜单,它是不可见的:

所以我想在上面打开这个菜单,如果在底部没有足够的地方,我该怎么做?

我的代码 - jsFiddle

打开下拉菜单的代码:

$(document).ready(function () {

    Array.from(document.querySelectorAll('.custom-style')).forEach(function (menu_side) {
        menu_side.onclick = ({
            target
        }) => {
            if (!target.classList.contains('more')) return
            document.querySelectorAll('.dropout.active').forEach(
                (d) => d !== target.parentElement && d.classList.remove('active')
            )
            target.parentElement.classList.toggle('active');
        }

    });

});

我尝试使用一些方法,但它对我不起作用,现在我不知道如何解决这个问题。

【问题讨论】:

    标签: javascript html jquery css drop-down-menu


    【解决方案1】:

    我已经重写了 javascript 供您查看。在 isInView 函数中,您可以根据需要修改元素的底部位置。让我知道你的想法

    $(document).ready(function () {
    
    $('.more').click(function(){
                  let allMore=$(".dropout");
                  let wh=$(window).innerHeight();              
                  let parent=$(this).parent();
                  
                  allMore.each(function(){
                    if(!$(this).is(parent)){
                      $(this).removeClass("active");
                    }                
                  });
                  parent.toggleClass("active");
                  let parentBottom=parent.get(0).getBoundingClientRect().bottom;  
                  if(!isInView($(this).closest("td").get(0))){
                    parent.toggleClass("dropoutY");
                  }
                
                    
                
    });
    
    function isInView(el) {
      var rect = el.getBoundingClientRect();
      var elBottom = rect.bottom+$(el).height()+100;
    
      var visible = (elBottom <= window.innerHeight);
    
      return visible;
    }
    
    
    
    });
    .more {
        cursor: pointer;
        border: none;
        background: transparent;
        display: block;
        margin-top: auto;
        margin-bottom: auto;
    }
    
        .more span {
            display: block;
            width: .30rem;
            height: .30rem;
            background: #363636;
            border-radius: 50%;
            pointer-events: none;
        }
    
            .more span:not(:last-child) {
                margin-bottom: .125rem;
            }
    
    .dropout {
        display: block;
        margin-top: auto;
        margin-bottom: auto;
        float: right;
    }
    
    .dropoutY{
      display:flex;
      justify-content:flex-end;
      flex-direction: column;
    }
    
        .dropout ul {
            position: absolute;
            top: auto;
            right: 2rem;
            transform: scaleX(0);
            transform-origin: right;
            transition: transform 0.12s ease;
            color: #fff;
            background: rgba(33, 33, 33, 0.85);
            border-radius: 10px;
            padding: 20px 20px 20px 20px;
            list-style-type: none;
        }
    
            .dropout input {
                background: none;
                border: none;
            }
    
        .dropout btns {
            background: none;
            border: none;
        }
    
            .dropout.active ul {
                transform: scaleX(1);
            }
    
    .btns {
        display: inline-block;
        position: relative;
        width: 120px;
        height: 32px;
        line-height: 32px;
        border-radius: 2px;
        font-size: 0.9em;
        background-color: #fff;
        color: #646464;
        margin: 5px;
    }
    
        .btns > paper-ripple {
            border-radius: 2px;
            overflow: hidden;
        }
    
        .btns.narrow {
            width: 60px;
        }
    
        .btns.grey {
            background-color: #eee;
        }
    
        .btns.blue {
            background-color: #4285f4;
            color: #fff;
        }
    
        .btns.green {
            background-color: #0f9d58;
            color: #fff;
        }
    
        .btns.red {
            background-color: #cb3a3a;
            color: #fff;
        }
    
        .btns.light-blue {
            background-color: lightblue;
            color: #fff;
        }
    
        .btns.darkcyan {
            background-color: darkcyan;
            color: #fff;
        }
    
        .btns.raised {
            transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
            transition-delay: 0.2s;
            box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
        }
    
            .btns.raised:active {
                box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
                transition-delay: 0s;
            }
    
    .centered-text {
        text-align: center;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <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>
    
    <table style="width:100%" class="custom-style">
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Age</th>
        <td>
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
              <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
      <tr>
        <td>Jill</td>
        <td>Smith</td>
        <td>50</td>
        <td>
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
                 <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
      <tr>
        <td>Eve</td>
        <td>Jackson</td>
        <td>94</td>
        <td>
    
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
                <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
    </table>
    <hr>
    <table style="width:100%" class="custom-style">
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Age</th>
        <td>
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
              <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
      <tr>
        <td>Jill</td>
        <td>Smith</td>
        <td>50</td>
        <td>
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
                 <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
      <tr>
        <td>Eve</td>
        <td>Jackson</td>
        <td>94</td>
        <td>
    
          <div class="dropout">
            <button class="more">
              <span></span>
              <span></span>
              <span></span>
            </button>
            <ul>
                <li>
                <a id="open-modal" class="btns raised blue centered-text"href="#open-modal">Edit</a>
              </li>
              <li>
                <button type="button" class="btns raised grey">Detailbutton
                </button>
              </li>
            </ul>
          </div>
        </td>
      </tr>
    </table>

    【讨论】:

    • 感谢您的回答,但此解决方案将所有时间活动目录放在菜单顶部,但如果下拉菜单不在屏幕上,我只需要放在顶部。
    • 使用上面的 css 创建一个名为 '.dropoutY' 的类,并将这段代码添加到您提供的 javascript 块中。代码 => "const windowHeight=$(window).height()-10; const menuBottom=$(menu_side).get(0).getBoundingClientRect().bottom; if(menuBottom>=windowHeight){ target.parentElement. classList.add("dropoutY"); }";我认为您可以根据需要对其进行修改;
    • 请像回答一样添加这个方法:)
    • Uncaught ReferenceError: menu_side is not defined
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2019-07-28
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多