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

如何让position: fixed的blue_square仅在divTwo内滚动显示?

问题描述

我有以下HTML、CSS和jQuery代码:

HTML代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div class="divOne"></div>

<div class="divTwo">
  <div class="col-md-12 col-sm-10">
    <div id="blue_square" style="top: 310px;">Blue</div>
  </div>
</div>

<div class="divThree"></div>

CSS代码

.divTwo {
  position: relative;
}

#blue_square {
  position: fixed;
  right: 0;
  z-index: 9;
  width: 370px;
  box-shadow: 0 0 6px transparent;
}

jQuery代码

$("#blue_square").css("top", $(window).height() / 2 - 80)

当前遇到的问题:blue_square元素会出现在divOne区域,期望它仅从divTwo开始显示,且滚动时始终被限制在divTwo范围内——滚动divOne或divThree时都不显示它,如何用JavaScript实现?


解决方案

核心思路是监听页面滚动事件,通过计算divTwo的位置与视口的重叠关系,动态控制blue_square的显示状态和位置:

1. 调整基础CSS

先给blue_square添加默认隐藏样式,避免初始状态出现在错误区域:

#blue_square {
  position: fixed;
  right: 0;
  z-index: 9;
  width: 370px;
  box-shadow: 0 0 6px transparent;
  display: none; /* 默认隐藏 */
}

2. 编写滚动监听逻辑

通过jQuery监听scroll和load事件,实时计算位置并控制元素:

$(window).on('scroll load', function() {
  const $divTwo = $('.divTwo');
  const $blueSquare = $('#blue_square');
  
  // 获取divTwo的位置与尺寸
  const divTwoTop = $divTwo.offset().top;
  const divTwoBottom = divTwoTop + $divTwo.outerHeight();
  // 获取视口的滚动位置与高度
  const viewportTop = $(window).scrollTop();
  const viewportBottom = viewportTop + $(window).height();
  
  // 计算blueSquare的目标居中位置
  let targetTop = viewportTop + ($(window).height() / 2) - 80;
  
  // 处理边界:避免超出divTwo顶部
  if (targetTop < divTwoTop) {
    targetTop = divTwoTop;
  }
  // 处理边界:避免超出divTwo底部(需考虑元素自身高度)
  else if (targetTop + $blueSquare.outerHeight() > divTwoBottom) {
    targetTop = divTwoBottom - $blueSquare.outerHeight();
  }
  
  // 判断视口与divTwo是否重叠,控制显示/隐藏
  if (viewportBottom > divTwoTop && viewportTop < divTwoBottom) {
    $blueSquare.css('top', targetTop).show();
  } else {
    $blueSquare.hide();
  }
});

逻辑说明

  • 页面加载和滚动时都会触发计算,确保初始状态和滚动过程中都能正确显示
  • 通过边界判断,让blue_square始终被限制在divTwo的上下范围内,不会超出
  • 只有当视口与divTwo区域有重叠时才显示元素,滚动到divOne或divThree区域时自动隐藏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:15:27