Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

    • 编程语言

      • CSS

        • CSS 学习笔记
        • BFC
        • flex布局笔记
        • inline-block空内容最小高度的问题
        • 单行文本两端对齐
        • 响应式卡片分页
        • 实现两个直角梯形按钮斜切的效果
        • 最多2行文本&单行文本居底
        • 段落文本嵌入图标
        • 监听 stick 状态
          • 示例: sticky 状态的导航栏加阴影
            • 方式1:借助 IntersectionObserver
            • 方式2:纯 css
          • 示例:修改 sticky 内容
        • 【前端】仿 Android TextView 实现完整的文本溢出截断省略效果
        • 前端元素默认宽高
        • CSS居中布局
      • HTML

      • JavaScript

      • Rust

      • TypeScript

      • WebAssembly

    • 开发工具

    • 前端调试

    • 浏览器原理

    • 浏览器生态

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 前端基础
  • 编程语言
  • CSS
gahing
2022-05-06
目录

监听 stick 状态草稿

# 示例: sticky 状态的导航栏加阴影

# 方式1:借助 IntersectionObserver

sticky 元素增加 1 像素偏移,通过 IntersectionObserver 监听到该元素不是 100% 展现时修改样式

<header></header>
<nav></nav>

<style>
  body {
    margin: 0;
    height: 200vh;
  }
  header {
    background: red;
    height: 80px;
  }
  nav {
    background: magenta;
    height: 80px;
    position: sticky;
    top: -1px; 
  }
  nav[stuck] {
    box-shadow: 0 0 16px black;
  }
</style>

<script>
  const observer = new IntersectionObserver(
    ([e]) => {
      e.target.toggleAttribute("stuck", e.intersectionRatio < 1);
      console.log(e.intersectionRatio);
    },
    { threshold: [1] }
  );

  observer.observe(document.querySelector("nav"));
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

在线示例:https://codepen.io/francecil/pen/JjrJvzO?editors=1111

也可以增加一个占位元素,然后 observe 该元素,这样就不需要对 sticky 元素进行偏移

# 方式2:纯 css

阴影本身也是一个 sticky 元素,并用 margin-top 顶开一段距离

https://zhuanlan.zhihu.com/p/81249133

在线示例:https://codesandbox.io/s/xenodochial-proskuriakova-mg7up?file=/src/styles.css

# 示例:修改 sticky 内容

纯 css 无法实现,需要借助 IntersectionObserver 监听 sticky 元素的上方元素

threshold 定为 0,则当上方元素完全隐藏时触发事件,告知修改 sticky 内容

import React, { useLayoutEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function App() {
  useLayoutEffect(() => {
    const observer = new IntersectionObserver(
      ([e]) => {
        console.log(e.intersectionRatio, e.isIntersecting);
      },
      { threshold: [0] }
    );

    observer.observe(document.querySelector("#top"));
  }, []);
  return (
    <div className="App">
      <div id="top" style={{ height: 50, background: "red" }}>
        top
      </div>
      <nav>CSS Sticky With Shadow</nav>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

参考文档:https://developers.google.com/web/updates/2017/09/sticky-headers

编辑 (opens new window)
上次更新: 2023/08/26, 10:18:07
段落文本嵌入图标
【前端】仿 Android TextView 实现完整的文本溢出截断省略效果

← 段落文本嵌入图标 【前端】仿 Android TextView 实现完整的文本溢出截断省略效果→

最近更新
01
我的 2024 总结
12-31
02
浅谈代码质量与量化指标
08-27
03
快速理解 JS 装饰器
08-26
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式