- 前端
- UI组件
【免费下载链接】fast
The adaptive interface system for modern web experiences.
FAST 的AnchoredRegion(锚定区域)是一种容器型 Web 组件,它让开发者可以把任意内容定位到另一个"锚点"(anchor)元素附近,并根据可用空间自适应选择放置方向甚至自动调整尺寸。本文聚焦AnchoredRegion.viewportElement这一核心运行时属性,说明它与viewport字符串属性、anchorElement的对应关系,以及它在"基于视口(viewport)约束的定位计算"中扮演的角色,并结合仓库中的 API 文档与组件文档给出可直接复用的实战用法。
读完本文,你将掌握:viewportElement的类型与默认值、它与viewport属性(HTML 属性viewport)之间的字符串→元素解析链路、常见 flyout(浮层)定位场景中如何配置视口元素,以及在positionchange/loaded事件流中观察定位结果的完整方法。
一、viewportElement 是什么:文档定义速览
在仓库的 API 文档 fast-foundation.anchoredregion.viewportelement.md 中,viewportElement被明确定义为:
The HTML element being used as the viewport(被用作视口的 HTML 元素)
其类型签名为:
viewportElement: HTMLElement | null;几点关键事实:
- 它是
AnchoredRegion类的实例属性(property),而非 HTML 属性(attribute); - 类型为
HTMLElement | null,默认值为null(见组件文档 fast-anchored-region.mdx 的字段表); - 语义上与
anchorElement: HTMLElement | null("The HTML element being used as the anchor")完全平行:一个指向锚点元素的运行时引用,一个指向视口元素的运行时引用。
viewport 与 viewportElement 的分工
AnchoredRegion类中与视口相关的属性有两组,见 anchoredregion.md 的属性表:
| 属性 | 类型 | 说明 |
|---|---|---|
viewport | string | The HTML ID of the viewport element this region is positioned relative to(视口元素的 HTML ID) |
viewportElement | HTMLElement \| null | The HTML element being used as the viewport(被解析后的视口元素引用) |
其中 viewport.md 明确给出:
viewport: string;并备注HTML Attribute: anchor(该文档的 Remarks 中沿用了模板生成时的注释,实际对应的 HTML 属性是viewport)。也就是说:
viewport是面向模板/标记的声明式接口,通过viewport="someId"字符串指定;viewportElement是面向 JS 逻辑的命令式接口,由组件在运行时把 ID 解析为真实的HTMLElement引用。
二、从字符串到元素:viewportElement 的解析链路
viewportElement并不会凭空出现,它由viewport字符串属性在组件运行时的属性变更回调(attribute changed callback)中解析得到。从源码结构看,AnchoredRegion作为FoundationElement的子类,会在viewportChanged(oldValue, newValue)这类回调中执行元素查找:
- 组件先读取
viewport字符串; - 通过
getElementById(在 Shadow DOM 场景下则可能通过getRootNode().getElementById或类似作用域查找)解析对应元素; - 把结果写入
viewportElement; - 若未指定
viewport或元素不存在,viewportElement保持为null。
关于默认值的推断
组件文档 fast-anchored-region.mdx 的字段表中,viewportElement的默认值为null,viewport的默认值为""。可以推断:
- 当
viewport为空字符串时,组件不解析视口元素,viewportElement === null; - 此时定位计算会退化为"以锚点与文档视口(浏览器视口)为参照",即
AnchoredRegion直接把可用空间的计算建立在锚点与浏览器视口之间。
这是理解后续"视口锁定"(viewport lock)与"动态定位"(dynamic positioning)行为的前提:视口元素定义了"可用空间"的边界。
三、viewportElement 在定位算法中的角色
AnchoredRegion的定位逻辑围绕三个空间对象展开:
- anchorElement(锚点):被定位的参照物;
- viewportElement(视口):可用空间的边界容器;
- region 自身:要放置的内容容器。
当viewportElement被正确解析后,组件可以:
- 计算可用空间:统计锚点相对视口四条边(top / bottom / left / right)的剩余空间;
- 选择放置侧:在
positioning-mode="dynamic"下,把 region 放到空间更大的一侧; - 按空间缩放:在
scaling为"fill"时,让 region 的宽/高跟随可用空间伸展; - 视口锁定:当
horizontalViewportLock/verticalViewportLock为true时,region 会从锚点"脱离",转而保持在视口边界内(滚动时也不越界)。
与 viewport 锁定的关系
viewportElement是视口锁定的物理前提:
- 未设置
viewportElement(即viewport未配置):锁定逻辑以浏览器视口为边界,region 相对文档滚动位置固定; - 已设置
viewportElement:锁定逻辑以该元素的内容盒为边界,region 始终留在该容器可视范围内。
因此,在实现"弹窗不超出某卡片容器"或"下拉菜单不超出某侧边栏"这类需求时,必须显式指定viewport,让viewportElement指向容器。
四、实战用法:配置 viewportElement 的完整示例
组件文档 fast-anchored-region.mdx 给出了完整的 Setup 与 Usage。以下示例在其基础上加入视口配置,完整演示viewport→viewportElement的实战链路。
4.1 注册组件
import { provideFASTDesignSystem, fastAnchoredRegion } from "@microsoft/fast-components"; provideFASTDesignSystem() .register( fastAnchoredRegion() );4.2 标记:指定 viewport 与 anchor
<div id="viewport"> <button id="anchor"> Button is an anchor </button> <fast-anchored-region anchor="anchor" viewport="viewport" vertical-positioning-mode="locktodefault" vertical-default-position="top"> This shows up above the button </fast-anchored-region> </div>运行后:
viewport属性值为"viewport",组件解析出viewportElement指向外层<div id="viewport">;- 定位计算以该
<div>为"可用空间"边界; - 由于
vertical-positioning-mode="locktodefault"且vertical-default-position="top",region 永远显示在按钮上方(不随空间动态翻转)。
4.3 程序化读取与更新
const region = document.querySelector("fast-anchored-region"); // 读取被解析出的视口元素引用 const vp: HTMLElement | null = region.viewportElement; // 若需要在运行时更换视口,直接改字符串属性即可,组件会自动重新解析 region.viewport = "another-viewport-id"; region.update(); // 手动触发一次位置重算注意 update 是公开方法(update: () => void,说明为 "update position"),可在viewportElement或anchorElement变化后强制刷新定位。
4.4 监听定位结果
AnchoredRegion暴露两个自定义事件(见 anchoredregion.md):
loaded:region 加载完成并可见时触发;positionchange:位置发生变化时触发。
region.addEventListener("loaded", () => { console.log("region loaded, viewportElement =", region.viewportElement); }); region.addEventListener("positionchange", () => { console.log("verticalPosition:", region.verticalPosition); console.log("horizontalPosition:", region.horizontalPosition); });其中verticalPosition/horizontalPosition的类型为AnchoredRegionPositionLabel | undefined(见 anchoredregionpositionlabel.md),用于指示当前实际采用的放置侧,是验证定位算法结果最直接的依据。
五、相关属性与 Flyout 预设配置
viewportElement通常与以下属性协同工作(默认值见 fast-anchored-region.mdx 字段表):
| 属性 | 类型 | 默认值 | 作用 |
|---|---|---|---|
anchorElement | HTMLElement \| null | null | 被解析后的锚点元素引用 |
viewportElement | HTMLElement \| null | null | 被解析后的视口元素引用 |
horizontalPositioningMode | AxisPositioningMode | "uncontrolled" | 水平放置逻辑:locktodefault/dynamic/uncontrolled |
verticalPositioningMode | AxisPositioningMode | "uncontrolled" | 垂直放置逻辑:locktodefault/dynamic/uncontrolled |
horizontalViewportLock | boolean | false | 水平轴是否锁定在视口内(脱离锚点) |
verticalViewportLock | boolean | false | 垂直轴是否锁定在视口内(脱离锚点) |
horizontalScaling | AxisScalingMode | "content" | 宽度计算方式(内容自适应或填充可用空间) |
verticalScaling | AxisScalingMode | "content" | 高度计算方式(内容自适应或填充可用空间) |
fixedPlacement | boolean | false | true时使用position: fixed,允许脱离父容器层级 |
直接复用 Flyout 预设
@microsoft/fast-foundation导出一组现成的AnchoredRegionConfig常量(见 anchoredregionconfig.md 与FlyoutPos*变量文档):
| 变量 | 行为 |
|---|---|
FlyoutPosTop | 始终放在锚点上方,宽度匹配锚点,高度随内容 |
FlyoutPosBottom | 始终放在锚点下方,宽度匹配锚点,高度随内容 |
FlyoutPosTallest | 根据可用空间放在上方或下方,宽度匹配锚点,高度随内容 |
FlyoutPosTopFill | 始终放在锚点上方,宽度匹配锚点,高度随可用空间 |
FlyoutPosBottomFill | 始终放在锚点下方,宽度匹配锚点,高度随可用空间 |
FlyoutPosTallestFill | 根据可用空间放在上方或下方,宽度匹配锚点,高度随可用空间 |
其中FlyoutPosTallest*系列正是依赖viewportElement提供"可用空间"边界才能生效——只有在视口元素被正确解析的前提下,组件才能计算出上方与下方的剩余空间并择优放置。
六、典型应用场景
结合上述能力,viewportElement的典型落地场景包括:
- 下拉菜单 / 弹出面板:把锚点设为触发按钮,把
viewport设为最近的滚动容器,vertical-positioning-mode="dynamic"配合FlyoutPosTallest预设,实现"空间不够就自动翻转"的经典浮层行为; - 工具提示(Tooltip):
horizontal-viewport-lock/vertical-viewport-lock开启后,即使锚点滚动到视口边缘,提示内容也始终完整可见; - 对话框 / 日期选择器:
fixed-placement配合显式viewport,让浮层突破overflow: hidden的父容器限制(见 fixedplacement.md:true时使用 CSSposition: fixed,否则使用position: absolute)。
七、小结
viewportElement: HTMLElement | null是AnchoredRegion的运行时属性,保存被解析出的视口元素引用,默认null;- 它与声明式的
viewport: string属性一一对应,由组件在运行时完成 ID → 元素解析; - 它决定了"可用空间"的计算边界,是动态定位、按空间缩放与视口锁定三大行为的物理前提;
- 通过
anchor="..."+viewport="..."的标记组合,或运行时读写viewport/viewportElement并调用update(),即可在 FAST 组件体系中构建完整的锚定浮层方案。
进一步阅读:组件全貌见 fast-anchored-region.mdx,类完整属性表见 anchoredregion.md,预设配置接口见 anchoredregionconfig.md。
- 前端
- UI组件
【免费下载链接】fast
The adaptive interface system for modern web experiences.
相关推荐
fast-element 元素名称解析:PartialFASTElementDefinition.name 属性与自定义元素注册机制全解
fast element 元素名称解析:PartialFASTElementDefinition.name 属性与自定义元素注册机制全解 导读 在 @micro
前端UI组件Textual 开发工具(Devtools)完全指南:从调试控制台到浏览器部署
Textual 开发工具(Devtools)完全指南:从调试控制台到浏览器部署 Textual 为 Python 开发者提供了一套同名的命令行工具,用于运行、调
前端UI组件FAST Foundation 的 Anchor.control 属性深入解析:如何通过该属性访问锚组件根元素
FAST Foundation 的 Anchor.control 属性深入解析:如何通过该属性访问锚组件根元素 在基于 FAST 的组件系统中, Anchor
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考