0

0

实现分屏滚动与粘性侧边内容切换效果教程

聖光之護

聖光之護

发布时间:2025-10-03 10:40:02

|

724人浏览过

|

来源于php中文网

原创

实现分屏滚动与粘性侧边内容切换效果教程

本教程详细介绍了如何创建一种分屏布局,其中一侧内容可滚动,另一侧内容保持粘性(sticky)并在滚动过程中根据左侧内容的进度进行切换。通过CSS实现分屏和粘性定位,并辅以JavaScript(概念性说明)实现动态内容更新,旨在帮助开发者复刻类似Calendly的交互体验。

概述与实现目标

在现代网页设计中,一种常见的交互模式是分屏滚动体验,用户在滚动页面时,屏幕的一侧内容(通常是文本或段落)会依次展现,而另一侧内容(通常是图片、视频或动画)则保持固定(粘性),并随着左侧滚动内容的进度而动态更新。这种效果常用于产品介绍或故事叙述型页面,能够有效地引导用户注意力并提升信息传达效率。本教程将指导您如何利用css构建基础的分屏粘性布局,并阐述如何通过javascript实现右侧粘性内容的动态切换。

核心布局:CSS实现分屏与粘性定位

实现这种布局的关键在于CSS的Flexbox或Grid布局,结合position: sticky属性。我们将创建一个主容器,内部包含两个子元素:一个用于滚动内容的“流动”区域,另一个用于粘性内容的“固定”区域。

HTML 结构

首先,定义清晰的HTML结构。建议使用语义化的类名来代替原始答案中的属性选择器,以提高可读性和维护性。

顶部滚动内容,用于提供初始滚动空间。

...

AVCLabs
AVCLabs

AI移除视频背景,100%自动和免费

下载
@@##@@ @@##@@ @@##@@

这是第一段滚动内容。当用户滚动到这里时,右侧的图片将显示第一张。

这是第二段滚动内容。当用户滚动到这里时,右侧的图片将显示第二张。

这是第三段滚动内容。当用户滚动到这里时,右侧的图片将显示第三张。

...

底部滚动内容,用于提供后续滚动空间。

...

CSS 样式

接下来,应用CSS来构建分屏布局并实现粘性效果。

/* 主分屏容器 */
.main-split-section {
  display: flex; /* 使用Flexbox创建分屏 */
  min-height: 100vh; /* 确保容器至少占据一个视口高度 */
  position: relative; /* 为 sticky 元素提供定位上下文 */
}

/* 粘性面板样式 */
.sticky-panel {
  flex: 1; /* 占据可用空间的一半 */
  position: sticky; /* 使元素在滚动时保持粘性 */
  top: 0; /* 粘性元素吸附在视口顶部 */
  height: 100vh; /* 粘性元素高度与视口高度一致 */
  overflow: hidden; /* 隐藏超出容器的图片部分 */
  /* background: salmon; /* 示例背景色 */
  display: flex; /* 内部图片也可能需要flex布局 */
  justify-content: center;
  align-items: center;
}

.sticky-panel .sticky-image {
  position: absolute; /* 使图片叠放 */
  opacity: 0; /* 默认隐藏 */
  transition: opacity 0.5s ease-in-out; /* 切换时的过渡效果 */
  max-width: 90%; /* 限制图片大小 */
  max-height: 90%;
  object-fit: contain; /* 保持图片比例 */
}

.sticky-panel .sticky-image.active {
  opacity: 1; /* 激活时显示 */
}

/* 流动面板样式 */
.flow-panel {
  flex: 1; /* 占据可用空间的一半 */
  /* background: slateblue; /* 示例背景色 */
  padding: 20px; /* 增加内边距 */
  box-sizing: border-box; /* 确保padding不增加宽度 */
}

/* 滚动内容段落样式 */
.flow-panel p {
  height: 50vh; /* 每个段落占据半个视口高度,方便触发滚动事件 */
  display: flex; /* 垂直居中内容 */
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 1.5em;
  margin: 0; /* 移除默认外边距 */
  border-bottom: 1px solid #eee; /* 区分段落 */
}

/* 辅助滚动内容 */
.scroll-content-before,
.scroll-content-after {
  height: 100vh; /* 提供足够的滚动空间 */
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #f8f8f8;
  font-size: 1.2em;
  color: #555;
}

注意事项:

  1. Flexbox 布局: display: flex 在 main-split-section 上创建了一个弹性容器,flex: 1 使 sticky-panel 和 flow-panel 各占据一半的可用宽度。
  2. position: sticky: sticky-panel 设置 position: sticky; top: 0; height: 100vh; 会使其在父容器滚动时,当其顶部到达视口顶部时,开始固定在视口顶部,并占据整个视口高度。
  3. 对齐问题: 如果希望 flow-panel 和 sticky-panel 在视觉上从页面的同一水平线开始,并且 sticky-panel 的高度是固定的(例如 100vh),而 flow-panel 位于其下方,您可能需要为 flow-panel 设置一个负的 margin-top 值,其大小等于 sticky-panel 的高度。然而,在上述的Flexbox结构中,它们是并排的,所以通常不需要负外边距。如果您的布局结构是 sticky-panel 在 flow-panel 之前,并且 flow-panel 紧随其后,且希望 flow-panel 的内容能“滚动到” sticky-panel 旁边,则需要更复杂的布局,例如使用 grid 或调整 margin。本例中,它们是并列关系,无需额外处理。
  4. 内容高度: flow-panel 中的 p 标签设置了 height: 50vh,这使得每个段落都足够长,以便在滚动时能清晰地触发内容切换。整个 flow-panel 的总高度将由其内部内容的累加高度决定,这提供了足够的滚动空间。

动态内容切换:JavaScript 实现

CSS只负责布局和粘性效果,而右侧粘性面板内容的动态切换(例如图片淡入淡出)则需要JavaScript来完成。核心思路是监听滚动事件,判断当前滚动位置,并根据位置激活相应的粘性内容。

JavaScript 逻辑(概念性说明)

document.addEventListener('DOMContentLoaded', () => {
  const flowPanel = document.querySelector('.flow-panel');
  const stickyImages = document.querySelectorAll('.sticky-panel .sticky-image');
  const scrollTriggers = document.querySelectorAll('.flow-panel .scroll-trigger');

  // 初始化显示第一张图片
  if (stickyImages.length > 0) {
    stickyImages[0].classList.add('active');
  }

  // 使用 Intersection Observer 监听滚动触发点
  const observerOptions = {
    root: null, // 视口作为根
    rootMargin: '0px 0px -50% 0px', // 当触发元素中心进入视口时触发
    threshold: 0 // 元素进入视口即可触发
  };

  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        // 获取当前进入视口的触发段落的索引
        const index = parseInt(entry.target.dataset.imageIndex);

        // 移除所有图片的 active 类
        stickyImages.forEach(img => img.classList.remove('active'));

        // 激活对应索引的图片
        if (stickyImages[index]) {
          stickyImages[index].classList.add('active');
        }
      }
    });
  }, observerOptions);

  // 观察每个滚动触发点
  scrollTriggers.forEach(trigger => {
    observer.observe(trigger);
  });
});

JavaScript 逻辑说明:

  1. 获取元素: 选中所有粘性图片 (.sticky-image) 和滚动触发段落 (.scroll-trigger)。
  2. 初始化: 默认显示第一张图片。
  3. Intersection Observer: 这是实现滚动监听和内容切换的最佳实践。
    • 它比传统的 scroll 事件监听更高效,因为它只在目标元素与根元素(这里是视口)交叉时触发回调,避免了频繁的计算。
    • rootMargin: '0px 0px -50% 0px' 意味着当目标元素的中心点(或更精确地说,是目标元素顶部距离视口底部50%的位置)进入视口时,isIntersecting 会变为 true。您可以根据实际需求调整这个值。
    • data-image-index 属性用于将每个滚动段落与其对应的粘性图片关联起来。
  4. 内容切换: 当一个 scroll-trigger 段落进入视口时,根据其 data-image-index 属性,移除所有图片的 active 类,然后为对应索引的图片添加 active 类,从而实现淡入淡出效果(通过CSS的 opacity 和 transition)。

总结与注意事项

通过上述CSS和JavaScript的结合,您可以成功创建一个具有粘性侧边栏和动态内容切换的分屏滚动体验。

  • 结构清晰: 使用语义化的类名和合理的HTML结构,有助于代码的维护和理解。
  • CSS 优化: 充分利用 flexbox 或 grid 进行布局,position: sticky 实现粘性效果。
  • JavaScript 效率: 优先使用 Intersection Observer API 来监听滚动事件,而不是直接监听 scroll 事件,以避免性能问题。对于更复杂的动画,可以考虑使用 requestAnimationFrame。
  • 响应式设计 确保在不同屏幕尺寸下(特别是移动设备)布局依然良好。可能需要使用媒体查询调整分屏布局,例如在小屏幕上将分屏改为堆叠布局。
  • 内容预加载: 如果粘性面板中的图片较多,考虑对图片进行预加载,以避免切换时的闪烁或延迟。
  • 无障碍性: 为图片添加 alt 属性,确保屏幕阅读器用户也能理解内容。

这种分屏粘性布局不仅美观,而且能有效提升用户体验,是现代网页设计中值得掌握的技巧。

描述1描述2描述3

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

81

2023.11.23

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

434

2023.12.18

css3transition
css3transition

css3transition属性用于指定如何从一个CSS样式过渡到另一个CSS样式,本专题为大家提供transition相关的文章、相关下载和相关课程,大家可以免费体验。

231

2023.06.27

flex教程
flex教程

php中文网为大家带来了flex教程合集,Flex是采用Flex布局的元素,称为Flex容器(flex container),简称"容器",它的所有子元素自动成为容器成员,有三个核心概念: flex项,需要布局的元素;flex容器,其包含flex项;排列方向,这决定了flex项的布局方向。php中文网还为大家带来flex的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

359

2023.06.14

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号