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

浏览器垂直调整大小时如何保证可拖拽div始终处于可视区域

问题原因

当前代码仅在拖拽结束时将水平位置left转换为相对父容器宽度的百分比,垂直方向的top属性仍被jQuery UI设置为固定像素值,因此窗口高度变化时元素不会按比例调整位置,就会出现移出可视区的问题。

解决方案

  1. 拖拽结束时同步将垂直位置也转换为相对高度的百分比
  2. 可额外增加窗口resize事件的边界校验,避免极端情况下元素超出可视区域

修改后的完整代码

$(function() {
  const $dragEle = $(".drag-me");
  
  $dragEle.draggable({
    containment: "window",
    stop: function(e, ui) {
      // 横向百分比转换,保留原有逻辑
      const leftPerc = ui.position.left / ui.helper.parent().width() * 100;
      // 新增纵向百分比转换
      const topPerc = ui.position.top / ui.helper.parent().height() * 100;
      ui.helper.css({
        'left': leftPerc + '%',
        'top': topPerc + '%'
      });
    }
  });

  // 可选:窗口缩放时补充边界校验,避免元素超出可视区
  $(window).on('resize', function() {
    const winWidth = $(window).width();
    const winHeight = $(window).height();
    const eleWidth = $dragEle.outerWidth();
    const eleHeight = $dragEle.outerHeight();
    const eleOffset = $dragEle.offset();

    // 左边界校验
    if (eleOffset.left < 0) $dragEle.css('left', '0%');
    // 右边界校验
    if (eleOffset.left + eleWidth > winWidth) $dragEle.css('left', `${(winWidth - eleWidth)/winWidth *100}%`);
    // 上边界校验
    if (eleOffset.top < 0) $dragEle.css('top', '0%');
    // 下边界校验
    if (eleOffset.top + eleHeight > winHeight) $dragEle.css('top', `${(winHeight - eleHeight)/winHeight *100}%`);
  })
});

注意事项

  • 如果图标是放在指定容器内而非整个窗口,把代码里的ui.helper.parent()替换为对应的容器选择器即可,containment属性也同步改为容器选择器。
  • 百分比计算时要保证父容器的定位属性设置为relative,避免百分比基准偏移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:27:03