npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@type-dom/popper

v0.9.0

Published

基于 floatingui修改而来。 以下是关于 [TypeDom Popper 仓库](https://github.com/type-dom/popper) 的详细说明和使用指南,基于 GitHub 项目命名惯例和 TypeDom 框架生态的常见用途整理:

Readme

基于 floatingui修改而来。 以下是关于 TypeDom Popper 仓库 的详细说明和使用指南,基于 GitHub 项目命名惯例和 TypeDom 框架生态的常见用途整理:


一、TypeDom Popper 简介

1. 项目定位

  • 核心目标
    • 提供一个轻量级的 浮动元素定位库,用于实现 Tooltip(提示框)、Dropdown(下拉菜单)、Popover(弹出框)等需要动态计算位置的交互组件。
    • TypeDom 框架 深度集成,支持 TypeScript 和面向对象设计。
  • 适用场景
    • 需要动态计算元素位置的场景(如自动调整弹窗方向、响应窗口大小变化)。
    • 基于 TypeDom 框架的项目中需要高可定制化浮动元素管理的场景。

2. 核心特性

  • 精准定位
    • 支持多种定位策略(如 auto, top, bottom, left, right),自动避让视口边界和滚动条。
  • TypeScript 支持
    • 完全使用 TypeScript 编写,提供类型定义(.d.ts 文件)。
  • 模块化设计
    • 可单独使用,也可与 TypeDom UI 组件库无缝集成。
  • 性能优化
    • 支持防抖、节流、虚拟滚动等优化策略,避免频繁重排。

二、快速上手指南

1. 安装依赖

npm install @type-dom/popper
# 或使用 pnpm/yarn

2. 基本用法示例

以下是一个简单的 Tooltip 实现示例:

步骤1:HTML 结构
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>TypeDom Popper Example</title>
</head>
<body>
  <button id="reference">Hover me</button>
  <div id="popper" style="display: none;">This is a tooltip!</div>

  <script src="dist/bundle.js"></script>
</body>
</html>
步骤2:TypeScript 代码
import { createPopper, Placement } from '@type-dom/popper';

const reference = document.getElementById('reference')!;
const popper = document.getElementById('popper')!;

// 创建 Popper 实例
const popperInstance = createPopper(reference, popper, {
  placement: 'right-start', // 定位策略
  modifiers: [
    {
      name: 'offset',
      options: {
        offset: [0, 8], // 偏移量 [x, y]
      },
    },
  ],
});

// 显示 Popper
reference.addEventListener('mouseenter', () => {
  popper.style.display = 'block';
  popperInstance.update(); // 动态更新位置
});

// 隐藏 Popper
reference.addEventListener('mouseleave', () => {
  popper.style.display = 'none';
});
步骤3:构建与运行
npm run build  # 使用 Webpack 构建
npm run dev    # 启动本地开发服务器

三、核心功能与 API

1. 主要导出模块

| 模块名 | 功能描述 | |--------|----------| | createPopper | 创建 Popper 实例,核心 API。 | | Placement | 定义定位策略的枚举(如 top, bottom, left, right 等)。 | | Modifiers | 提供内置修饰符(如 offset, flip, preventOverflow)。 |

2. 常用配置项

| 配置项 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | placement | Placement | 'bottom' | 定位方向(参考元素与 Popper 的相对位置)。 | | modifiers | Modifier[] | [] | 修饰符数组,用于自定义行为(如偏移、自动翻转)。 | | strategy | 'absolute' \| 'fixed' | 'absolute' | 定位策略(绝对定位或固定定位)。 |

3. 内置修饰符

| 修饰符 | 功能描述 | |--------|----------| | offset | 调整 Popper 与参考元素之间的偏移量。 | | flip | 当 Popper 超出视口时自动翻转方向。 | | preventOverflow | 防止 Popper 被截断(如靠近窗口边缘时)。 | | hide | 当 Popper 完全不可见时自动隐藏。 |


四、高级用法

1. 动态更新位置

  • 当参考元素或 Popper 内容变化时,调用 update() 方法重新计算位置:
    popperInstance.update();

2. 与 TypeDom 框架集成

  • 在 TypeDom 项目中结合 Popper 使用:
    ;
    import { createPopper } from '@type-dom/popper';
    
    class Tooltip extends Div {
      constructor(reference: HTMLElement, content: string) {
        super();
        this.reference = reference;
        this.content = content;
        this.popperElement = document.createElement('div');
        this.popperElement.textContent = content;
        document.body.appendChild(this.popperElement);
    
        this.popper = createPopper(reference, this.popperElement, {
          placement: 'top',
        });
      }
    
      show() {
        this.popperElement.style.display = 'block';
        this.popper.update();
      }
    
      hide() {
        this.popperElement.style.display = 'none';
      }
    }

3. 性能优化

  • 防抖与节流
    window.addEventListener('resize', () => {
      setTimeout(() => popperInstance.update(), 100); // 防抖
    });
  • 虚拟滚动:在长列表中仅更新可见区域的 Popper 实例。

五、常见问题与解答

Q1:如何解决 Popper 位置不准确?

  • 方法
    • 确保参考元素和 Popper 元素均已渲染完成后再初始化 Popper。
    • 检查 CSS 样式是否影响布局(如 transform, filter 等)。

Q2:如何实现点击外部关闭 Popper?

  • 方法
    document.addEventListener('click', (event) => {
      if (!reference.contains(event.target as Node) && !popper.contains(event.target as Node)) {
        popper.style.display = 'none';
      }
    });

Q3:文档和社区支持


六、总结

TypeDom Popper 是一个专为 TypeScript + TypeDom 框架 设计的浮动元素定位库,通过精准的定位算法和模块化设计,开发者可以轻松实现复杂的交互效果。建议从基础用法(如 Tooltip)开始实践,逐步探索动态更新、性能优化等高级功能。

TypeDOM框架中的Popper组件:类型安全与高性能的弹出层定位解决方案

TypeDOM框架中的Popper组件代表了一种创新的弹出层定位解决方案,它基于floating-ui实现,同时深度整合了TypeScript的类型系统。该组件通过精确的类型约束和面向对象的设计模式,为开发者提供了类型安全、高性能且易于维护的弹出层定位功能,适用于工具提示、下拉菜单、弹出框等多种交互场景。与传统popper.js相比,TypeDOM Popper继承了floating-ui的轻量特性(体积仅600字节),同时通过TypeScript的静态类型检查显著提升了开发效率和代码可靠性,减少了运行时错误。

一、实现原理与技术架构

TypeDOM Popper组件的核心实现基于floating-ui定位引擎,采用现代的定位技术而非传统的绝对定位。组件通过两个关键元素——触发器(trigger)和弹出内容(popper content)——的协作完成定位功能。在技术架构上,TypeDOM Popper采用了面向对象的设计模式,所有组件均为TypeElement抽象类的实例,遵循TypeDOM框架的整体设计理念。

具体实现过程包括三个核心步骤:首先,组件通过usePopperContainer函数创建一个统一的容器(如van-popper-container-1996),并将该容器挂载到元素上,避免了父元素样式对弹出元素的影响;其次,组件利用floating-ui提供的computePosition函数计算触发器与弹出元素之间的位置关系;最后,通过一系列modifiers(如flip、shift、offset)调整弹出元素的位置,确保其在视口内可见且避免溢出或遮挡。

这种实现方式与传统popper.js有本质区别:popper.js会自动将弹出元素移动到body的儿子位置,而TypeDOM Popper则通过统一容器管理所有弹出元素,保持了DOM结构的清晰性。TypeDOM Popper还支持多种定位策略(strategy)和放置位置(placement),如'absolute'、'fixed'、'bottom-start'等,为开发者提供了灵活的配置选项。

二、API设计与类型安全特性

TypeDOM Popper组件的API设计充分体现了框架与TypeScript的深度集成,通过严格的类型约束和面向对象的设计模式,提供了类型安全的开发体验。组件主要通过以下props进行配置:

| Prop | 类型 | 默认值 | 说明 | |------|------|--------|------| | placement | string as PropType<'top' | 'bottom' | 'left' | 'right' | 'top-start' | ...> | 'bottom-start' | 弹出元素相对于触发器的位置 | | strategy | string as PropType<'absolute' | 'fixed' | 'sticky' | 'static'> | 'absolute' | 定位策略 | | showArrow | boolean | true | 是否显示箭头指示 | | transitionName | string | 'van-popper-fade' | 过渡动画名称 | | popperClass | string | '' | 弹出元素的额外类名 | | effect | string as PropType<'light' | 'dark'> | 'dark' | 弹出元素的视觉效果 |

这些props均通过TypeScript的PropType和泛型进行约束,确保开发者只能传递有效的值,从而在编译时捕获潜在错误。例如,placement属性被约束为特定的字符串枚举值,开发者无法传递无效的位置参数。

组件还提供了完整的生命周期管理,包括在组件挂载时初始化floating UI实例,在组件卸载时销毁实例以避免内存泄漏。这种设计使得开发者可以专注于业务逻辑,而无需手动处理复杂的DOM操作和事件监听。

TypeDOM Popper的API设计还体现了框架对直接操作原生DOM的坚持,开发者可以通过TypeDOM提供的API直接访问和操作DOM元素,无需经过虚拟DOM层的抽象,这在某些需要精细控制DOM的场景中尤为重要。

三、实际应用场景与优势分析

TypeDOM Popper组件在实际项目中有着广泛的应用场景,主要集中在需要动态定位的交互元素上。最常见的应用场景包括工具提示(Tooltip)、下拉菜单(Dropdown)、弹出框( Popover)和表单验证提示等。在这些场景中,Popper组件能够确保弹出元素始终正确地定位在触发元素附近,即使在窗口变化、滚动或父元素样式改变的情况下也能保持稳定。

在实际项目中,TypeDOM Popper组件展现出以下显著优势:

首先,类型安全是其最大优势之一。通过TypeScript的严格类型约束,Popper组件在编译时就能捕获配置错误,减少运行时错误。例如,如果开发者尝试传递一个无效的placement值,TypeScript编译器会直接报错,而无需等到运行时才能发现。

其次,轻量化设计使其在性能敏感的应用中表现出色。作为floating-ui的封装,TypeDOM Popper继承了其仅600字节的体积优势,远小于传统的popper.js(3KB),且支持摇树优化,进一步减少最终打包体积。

第三,统一的容器管理简化了开发流程。TypeDOM Popper将所有弹出元素统一挂载到一个全局容器中,避免了重复创建容器和样式冲突的问题,同时确保弹出元素不受父元素定位干扰。

最后,与TypeDOM框架的深度集成提供了无缝的开发体验。作为TypeDOM框架的一部分,Popper组件可以直接使用框架提供的DOM操作API,无需额外的类型断言或转换,大大提高了开发效率。

在复杂场景中,TypeDOM Popper的优势更为明显。例如,在滚动容器中,传统定位方式可能无法正确计算位置,而Popper组件通过floating-ui的computePosition函数和一系列modifiers(如flip、shift)可以自动处理这些问题,确保弹出元素始终正确可见。此外,Popper组件还支持与框架其他模块(如路由、状态管理)的无缝协作,在动态路由场景中也能保持稳定表现。

四、与其他定位解决方案的对比

与市场上其他流行的定位解决方案相比,TypeDOM Popper组件具有独特的优势。下表展示了TypeDOM Popper与popper.js和floating-ui原生的对比:

| 特性 | TypeDOM Popper | popper.js | floating-ui | |------|-----------------|-----------|-------------| | 体积 | 约600字节 | 3KB | 600字节 | | TypeScript支持 | 完整类型约束 | 基本支持 | 需手动配置 | | 容器管理 | 统一全局容器 | 自动移动到body子元素 | 需手动管理 | | DOM操作 | 直接操作原生DOM | 直接操作DOM | 直接操作DOM | | 学习曲线 | 低(熟悉TypeScript和DOM即可) | 中等 | 中等 | | 生态系统 | 集成TypeDOM框架 | 有独立生态 | 有独立生态 |

与popper.js相比,TypeDOM Popper继承了floating-ui的体积优势和现代定位技术,同时通过TypeScript提供了更严格的类型约束。popper.js虽然功能强大,但在处理复杂场景时可能不够灵活,且其自动将弹出元素移动到body子元素的特性可能不符合某些项目需求。

与floating-ui原生相比,TypeDOM Popper提供了更简洁的API和更好的TypeScript支持,同时与TypeDOM框架的其他组件无缝协作。floating-ui虽然体积小且性能优异,但需要开发者自行处理容器管理和TypeScript类型约束等问题。

TypeDOM Popper的独特价值在于它结合了floating-ui的高性能和TypeScript的类型安全,为开发者提供了一个既轻量又可靠的弹出层定位解决方案。对于使用TypeDOM框架的项目,Popper组件是构建复杂交互界面的理想选择。

五、最佳实践与使用建议

在实际项目中使用TypeDOM Popper组件时,遵循以下最佳实践可以充分发挥其优势:

首先,充分利用TypeScript的类型约束。Popper组件的props均通过PropType和泛型进行约束,开发者应严格遵循这些约束,避免传递无效值。例如,placement属性应使用预定义的有效值,而非随意字符串。

其次,合理配置modifiers。浮动UI的 modifiers是Popper组件功能的核心,开发者可以根据需求配置不同的 modifiers,如翻转(flip)、偏移(offset)和边界(防止溢出)等。例如,为了防止弹出元素超出视口,可以配置防止溢出(preventOverflow)修饰器。

第三,考虑性能优化。Popper组件在计算位置时会进行频繁的DOM操作,在性能敏感的应用中,可以考虑以下优化策略:限制更新频率(如使用防抖);使用正确的策略(如滚动容器中使用'sticky'策略);在组件卸载时及时销毁Popper实例以避免内存泄漏。

最后,与TypeDOM框架其他组件协同使用。Popper组件可以与其他TypeDOM组件(如按钮、输入框等)协同使用,构建完整的交互界面。例如,可以将Popper与按钮结合,创建下拉菜单;或与输入框结合,创建表单验证提示。

对于需要精细控制弹出元素定位的场景,TypeDOM Popper提供了足够的灵活性和可配置性;而对于简单的工具提示场景,组件也提供了默认配置,开发者可以快速上手。

六、未来发展趋势与潜在改进

随着Web开发技术的不断发展,TypeDOM Popper组件也有其未来发展趋势和潜在改进空间。首先,TypeDOM框架可能会进一步优化TypeScript集成,提供更简洁的类型定义和更智能的类型推断,减少开发者手动类型断言的需求。

其次,Popper组件可能会引入更多预定义的 modifiers和效果,如动画过渡、交互处理等,进一步简化开发流程。例如,可以预定义一些常用的 modifiers组合,如"防溢出+翻转+偏移",开发者只需选择预定义的组合即可。

第三,组件可能会更好地支持响应式设计,自动适应不同屏幕尺寸和布局变化。随着移动设备的普及和多设备访问的增加,响应式定位能力将成为弹出层组件的重要特性。

最后,TypeDOM Popper可能会与更多前端框架和库集成,如React、Vue等,提供一致的API和更好的开发体验。虽然当前TypeDOM专注于直接操作原生DOM,但与主流框架的集成可以扩大其应用范围。

随着TypeScript在前端开发中的普及和重要性增加,TypeDOM Popper组件在类型安全方面的优势将进一步凸显。未来,组件可能会引入更高级的类型系统,如泛型模板、依赖注入等,提供更强大的类型约束和更灵活的配置选项。

总之,TypeDOM Popper组件代表了一种现代化、类型安全的弹出层定位解决方案,它结合了floating-ui的高性能和TypeScript的类型安全,为开发者提供了强大的工具来构建复杂的交互界面。随着框架的不断演进和Web开发技术的发展,Popper组件有望在保持轻量高效的同时,提供更丰富的功能和更好的开发体验。