【CSS笔记】双向绑定导航栏(页面内位置跳转)

0 简介

场景简介:页面内容分块纵向排布,右侧有导航,导航栏内高亮内容与页面位置双向绑定

简单构建纵向页面与导航栏:

html 复制代码
<template>
  <div class="main-container">
    <div class="info-wrap">
      <div class="info-wrap-title">内容板块1</div>
      <div class="info-wrap-content">
        ...
      </div>
    </div>
    
    <div class="info-wrap">
      <div class="info-wrap-title">内容板块2</div>
      <div class="info-wrap-content">
        ...
      </div>
    </div>
    
    ...
    
    <div class="info-wrap">
      <div class="info-wrap-title">内容板块10</div>
      <div class="info-wrap-content">
        ...
      </div>
    </div>
    
    <div class="vertical-navbar">
      <div
        v-for="(item, key) in 10"
        :key="key"
        class="vertical-navbar-item"
      >
        内容板块{{ key + 1 }}
      </div>
    </div>
  </div>
</template>
<style lang="scss" scoped>
.main-container {
  position: relative;
}

// 导航栏固定在页面右方
.vertical-navbar {
  position: fixed;
  top: 100px;
  right: 100px;
  
  // 内容竖向排布
  display: flex;
  flex-direction: column;
}
</style>

1 导航栏根据根据页面滑动位置变化

需要使用 css 新功能 timeline-scope

1.1 设置标记索引及标记高亮条件

1.1.1 设置标记索引

在内容板块 .info-wrap 中设置标记索引

css 复制代码
.info-wrap {
  ...
  // 设置标记索引
  view-timeline-name: var(--s);
}

1.1.2 设置高亮条件

在内容板块 .info-wrap 上设置高亮条件

css 复制代码
.info-wrap {
  ...
  // 设置高亮条件
  view-timeline-inset: 0 100%; // 标记进入区域范围后高亮
}

view-timeline-inset 设置的两个属性之和为 100% 最好,可以自行调试看效果。

1.2 设置标记并增加高亮样式

1.2.1 设置标记

在内容板块标题 .info-wrap-title 上设置标记

html 复制代码
<div class="info-wrap" style="--s: --t1;">
  <div class="info-wrap-title">内容板块1</div>
  ...
</div>

<div class="info-wrap" style="--s: --t2;">
  <div class="info-wrap-title">内容板块2</div>
  ...
</div>

...

在导航栏内容 .vertical-navbar-item 上绑定同样的标记

html 复制代码
<div class="vertical-navbar">
  <div class="vertical-navbar-item" style="--s: --t1;">内容板块1</div>
  <div class="vertical-navbar-item" style="--s: --t2;">内容板块2</div>
  ...
</div>

1.2.2 配置高亮样式

在导航栏内容 .vertical-navbar-item 上配置高亮样式

css 复制代码
.vertical-navbar-item {
  ...
  // 设置高亮样式
  border-left: 2px solid #D9DEE9; // 默认样式
  animation: active; // 高亮动画
  animation-timeline: var(--s); // 高亮动画绑定索引
  // 高亮动画
  @keyframes active {
    0%, 100% {
      border-left: 2px solid #D9DEE9; // 默认样式
      border-left: 2px solid #006CFF; // 高亮样式
    }
  }  
}

1.3 注册标记

在纵向页面容器 .main-container 中注册标记

css 复制代码
.main-container {
  ...
  // 之前设置了多少个标记,全都注册在这
  timeline-scope: --t1, --t2, --t3, --t4, --t5, --t6, --t7, --t8, --t9, --t10;
}

完成以上设置,便可以实现导航栏根据根据页面位置变化的效果。

2 页面位置随导航栏按钮点击事件变化

2.1 使用 id<a> 链接跳转

2.1.1 设置 id

在内容板块标题 .info-wrap-title 上设置 id

html 复制代码
<div class="info-wrap" style="--s: --t1;">
  <div id="t1" class="info-wrap-title">内容板块1</div>
  ...
</div>

<div class="info-wrap" style="--s: --t2;">
  <div id="t2" class="info-wrap-title">内容板块2</div>
  ...
</div>

...

2.1.2 设置 <a> 跳转地址

将导航栏内容变为 <a>,并设置 href

html 复制代码
<div class="vertical-navbar">
  <a href="#t1" class="vertical-navbar-item" style="--s: --t1;">内容板块1</a>
  <a href="#t2" class="vertical-navbar-item" style="--s: --t2;">内容板块2</a>
  ...
</div>

2.1.3 页面丝滑滚动

提升视觉效果,设置页面丝滑滚动

css 复制代码
.main-container {
  ...
  // 设置滚动丝滑
  scroll-behavior: smooth;
}

如此,导航栏点击后页面随之滚动,便实现了双向绑定。 这个方法会导致页面地址随之变化,页面刷新和回退都会受到影响。

2.2 借助 js 实现跳转

2.2.1 js 跳转方法

js 复制代码
changeHash(id) {
  window.document.querySelector(id).scrollIntoView(true)
}

2.2.2 绑定方法

在导航栏内容上绑定方法

html 复制代码
<div class="vertical-navbar">
  <div class="vertical-navbar-item" style="--s: --t1;" @click="changeHash('#t1')">内容板块1</a>
  <div class="vertical-navbar-item" style="--s: --t1;" @click="changeHash('#t2')">内容板块1</a>
  ...
</div>

如此,便实现了页面内导航功能,且地址不会变化。

笔记主要为自用,欢迎友好交流!

内容参考站内文:juejin.cn/post/739634...

相关推荐
majingming1234 小时前
FUNCTION
java·前端·javascript
A_nanda5 小时前
Vue项目升级
前端·vue3·vue2
SuperEugene5 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
abigale036 小时前
【浏览器 API / 网络请求 / 文件处理】前端文件上传全流程:从基础上传到断点续传
前端·typescript·文件上传·vue cli
Setsuna_F_Seiei6 小时前
AI 对话应用之页面滚动交互的实现
前端·javascript·ai编程
新缸中之脑6 小时前
追踪来自Agent的Web 流量
前端
wefly20177 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
英俊潇洒美少年7 小时前
vue如何实现react useDeferredvalue和useTransition的效果
前端·vue.js·react.js
kyriewen118 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
英俊潇洒美少年8 小时前
react19和vue3的优缺点 对比
前端·javascript·vue.js·react.js