You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery UI Autocomplete短列表最后一项触发垂直滚动条问题

解决jQuery UI Autocomplete短列表悬停触发滚动条的问题

嘿,这个问题我之前也踩过坑!本质上是jQuery UI Autocomplete 1.12.1在计算下拉菜单高度时,没考虑到悬停状态下列表项的样式变化(比如边框、内边距的细微调整),导致明明是短列表,最后一项悬停时却触发了滚动条。给你几个实用的解决方案:

方案1:快速缓冲法(修改CSS)

给下拉菜单加一点底部内边距,给悬停元素的高度变化留缓冲空间,最简单直接:

.ui-autocomplete {
  height: auto;
  max-height: 180px;
  overflow-x: hidden;
  z-index: 1002;
  padding-bottom: 4px; /* 给底部留缓冲,抵消悬停时的高度变化 */
}

方案2:重写组件计算逻辑(更彻底)

Autocomplete默认的_resizeMenu方法只会计算普通状态下的列表项高度,我们可以重写这个方法,让它考虑悬停状态的元素尺寸:

$(function() {
  // 重写Autocomplete的菜单高度计算方法
  $.ui.autocomplete.prototype._resizeMenu = function() {
    const menuUl = this.menu.element;
    const lastItem = menuUl.find('li:last');
    
    // 临时模拟悬停状态,获取最后一项的实际高度
    const wasHovered = lastItem.hasClass('ui-state-hover');
    lastItem.addClass('ui-state-hover');
    const hoverItemHeight = lastItem.outerHeight();
    if (!wasHovered) lastItem.removeClass('ui-state-hover');
    
    // 重新计算所有列表项的总高度
    const totalItemsHeight = menuUl.children().map(function() {
      return $(this).outerHeight();
    }).get().reduce((sum, height) => sum + height, 0);
    
    // 取总高度和max-height的最小值,设置菜单高度
    menuUl.outerHeight(Math.min(totalItemsHeight + (menuUl.outerHeight() - menuUl.height()), this.options.maxHeight));
  };
});

这个方法会临时给最后一项加上悬停样式,计算它的真实高度后再调整菜单总高度,从根源避免滚动条误触发。

方案3:调整悬停样式(自定义样式适配)

如果是你自己给ui-state-hover加了额外的上下内边距或边框导致高度变化,那可以把这些样式改成不影响元素高度的类型:

/* 替换掉会改变高度的悬停样式 */
.ui-autocomplete li.ui-state-hover {
  background-color: #f5f5f5;
  outline: 1px solid #ccc; /* 用outline代替border,不占用元素空间 */
  /* 去掉padding-top/padding-bottom这类会改变高度的属性 */
}

内容的提问来源于stack exchange,提问作者Savage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:26:56