nv-basic-bw 1.0.18 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DIST/nv-basci-bw.js +14 -10
- package/README/calc.d.ts +97 -0
- package/README/code.d.ts +113 -0
- package/calc.js +187 -2
- package/code.js +319 -1
- package/package.json +1 -1
package/README/calc.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* calc.js - UI 几何布局计算与层叠上下文分析工具库
|
|
3
|
+
*/
|
|
4
|
+
declare module "calc" {
|
|
5
|
+
/** 矩形区域描述对象 */
|
|
6
|
+
export interface RectDesc {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
top: number;
|
|
12
|
+
right: number;
|
|
13
|
+
bottom: number;
|
|
14
|
+
left: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** 带有元素引用的位置结果 */
|
|
18
|
+
export interface ElementRectResult {
|
|
19
|
+
el: HTMLElement;
|
|
20
|
+
rect: RectDesc;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** 层叠上下文节点信息 */
|
|
24
|
+
export interface StackingContextNode {
|
|
25
|
+
el: HTMLElement;
|
|
26
|
+
z: number;
|
|
27
|
+
index: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** 创建一个初始化的矩形描述对象 (全 0) */
|
|
31
|
+
export function creat_rect_desc(): RectDesc;
|
|
32
|
+
|
|
33
|
+
/** * 获取元素在移除 transform 后的原始布局位置
|
|
34
|
+
* 会临时操作 DOM style 并触发重排
|
|
35
|
+
*/
|
|
36
|
+
export function get_rect_desc_bfr_transfrom(el: HTMLElement): Promise<RectDesc>;
|
|
37
|
+
|
|
38
|
+
/** * 遍历子树,获取所有匹配元素在 transform 之前的原始位置
|
|
39
|
+
*/
|
|
40
|
+
export function get_all_positions_bfr_transform(
|
|
41
|
+
el: HTMLElement,
|
|
42
|
+
filter?: (el: HTMLElement) => boolean
|
|
43
|
+
): Promise<ElementRectResult[]>;
|
|
44
|
+
|
|
45
|
+
/** * 遍历子树,获取所有匹配元素在 transform 之后的最终渲染位置
|
|
46
|
+
*/
|
|
47
|
+
export function get_all_positions_aft_transform(
|
|
48
|
+
el: HTMLElement,
|
|
49
|
+
filter?: (el: HTMLElement) => boolean
|
|
50
|
+
): Promise<ElementRectResult[]>;
|
|
51
|
+
|
|
52
|
+
/** * 计算并返回 transform 前后产生位移或形变的元素及其差异值
|
|
53
|
+
*/
|
|
54
|
+
export function get_all_positions_transform_diff(
|
|
55
|
+
el: HTMLElement,
|
|
56
|
+
filter?: (el: HTMLElement) => boolean
|
|
57
|
+
): Promise<ElementRectResult[]>;
|
|
58
|
+
|
|
59
|
+
/** * 判断两个矩形区域在二维平面上是否重叠
|
|
60
|
+
*/
|
|
61
|
+
export function is_rect_overlapping(rect1: RectDesc, rect2: RectDesc): boolean;
|
|
62
|
+
|
|
63
|
+
/** * 检查目标元素是否与给定元素列表中的任何一个发生重叠
|
|
64
|
+
*/
|
|
65
|
+
export function is_ele_overlapping_with_eles(checkEle: HTMLElement, eleList: HTMLElement[]): boolean;
|
|
66
|
+
|
|
67
|
+
/** * 获取元素在当前层叠上下文中的权重信息 (z-index 数值与 DOM 索引)
|
|
68
|
+
*/
|
|
69
|
+
export function get_z_stacking_info(el: HTMLElement): { zValue: number; domIndex: number };
|
|
70
|
+
|
|
71
|
+
/** * 溯源获取元素向上直到根节点的层叠上下文链条
|
|
72
|
+
*/
|
|
73
|
+
export function get_z_stacking_context_chain(el: HTMLElement): StackingContextNode[];
|
|
74
|
+
|
|
75
|
+
/** * 物理层面上比较两个元素在 Z 轴上的高低
|
|
76
|
+
* @returns 1: el0 在上, -1: el1 在上, 0: 相同
|
|
77
|
+
*/
|
|
78
|
+
export function compare_z_physically(el0: HTMLElement, el1: HTMLElement): number;
|
|
79
|
+
|
|
80
|
+
/** * 判断 el0 是否在 el1 的下方
|
|
81
|
+
* @param phisically 是否考虑层叠上下文的真实物理覆盖关系。默认 true。
|
|
82
|
+
*/
|
|
83
|
+
export function is_below_at_z(el0: HTMLElement, el1: HTMLElement, phisically?: boolean): boolean;
|
|
84
|
+
|
|
85
|
+
/** * 判断 el0 是否与 el1 在同一层叠层级
|
|
86
|
+
*/
|
|
87
|
+
export function is_same_at_z(el0: HTMLElement, el1: HTMLElement, phisically?: boolean): boolean;
|
|
88
|
+
|
|
89
|
+
/** * 判断 el0 是否在 el1 的上方
|
|
90
|
+
*/
|
|
91
|
+
export function is_upper_at_z(el0: HTMLElement, el1: HTMLElement, phisically?: boolean): boolean;
|
|
92
|
+
/** * 深度穿透探测指定坐标下的所有元素(含 Shadow DOM 内部元素)
|
|
93
|
+
*/
|
|
94
|
+
export function get_deep_elements_from_point(x:Number, y:Number): Array<HTMLElement>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
package/README/code.d.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* code.js - 资源采集与 CSS 变量深度探测工具库
|
|
3
|
+
*/
|
|
4
|
+
declare module "code" {
|
|
5
|
+
/**
|
|
6
|
+
* 获取页面中所有的脚本代码(包括外链 fetch 的内容和内联内容)
|
|
7
|
+
* 返回包裹在 <script> 标签中的合并字符串
|
|
8
|
+
*/
|
|
9
|
+
export function get_all_scripts(): Promise<string>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 获取页面中所有的 CSS 内容(包括外链 link 和内联 style 标签)
|
|
13
|
+
*/
|
|
14
|
+
export function get_all_csses(): Promise<string>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* 从指定根节点搜集所有类似图片的资源 URL
|
|
18
|
+
* 涵盖 img[src], img[srcset], svg 转换出的 Blob URL, 以及 CSS 背景图
|
|
19
|
+
* @param root 起始节点,默认为 document
|
|
20
|
+
* @param fltr 过滤器,返回 false 的元素将被跳过
|
|
21
|
+
*/
|
|
22
|
+
export function collect_img_like_urls(
|
|
23
|
+
root?: Document | HTMLElement,
|
|
24
|
+
fltr?: (el: HTMLElement | SVGElement) => boolean
|
|
25
|
+
): string[];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 从单个 CSSRule 中递归提取 CSS 自定义属性(变量)
|
|
29
|
+
* @param rule 样式规则
|
|
30
|
+
* @param target 存储结果的对象
|
|
31
|
+
*/
|
|
32
|
+
export function extract_css_varnms_from_rule(rule: CSSRule, target: Record<string, string>): void;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 获取页面中所有 CSS 自定义属性(变量)及其声明值
|
|
36
|
+
* 返回格式: { [样式表来源]: { [变量名]: 变量值 } }
|
|
37
|
+
*/
|
|
38
|
+
export function get_all_css_vars(): Record<string, Record<string, string>>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 从样式规则中提取变量名并存入 Set
|
|
42
|
+
*/
|
|
43
|
+
export function extract_css_varnms_from_rule_to_set(rule: CSSRule, name_set: Set<string>): void;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 获取页面所有样式表中定义的唯一 CSS 变量名数组
|
|
47
|
+
*/
|
|
48
|
+
export function get_all_uniq_css_varnms(): string[];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 寻找定义或重定义指定 CSS 变量的最近源头节点(支持 Shadow DOM)
|
|
52
|
+
* @param varnm 变量名
|
|
53
|
+
* @param target_el 探测起始元素
|
|
54
|
+
*/
|
|
55
|
+
export function find_css_var_scope_ele(varnm: string, target_el: HTMLElement): HTMLElement | null;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 检查变量是否是在指定元素自身上显式定义或覆盖的(而非纯继承)
|
|
59
|
+
*/
|
|
60
|
+
export function is_css_var_defined_on_self(varnm: string, target_el: HTMLElement): boolean;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 获取变量名到其所有定义源元素的映射
|
|
64
|
+
* 返回: { "--varnm": [el, el...] }
|
|
65
|
+
*/
|
|
66
|
+
export function get_css_var_scope_ele_mp(rt?: HTMLElement): Promise<Record<string, HTMLElement[]>>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 获取元素到其上定义的变量名列表的映射
|
|
70
|
+
* 返回: Map { el => ["--a", "--b"] }
|
|
71
|
+
*/
|
|
72
|
+
export function get_scope_ele_css_var_mp(rt?: HTMLElement): Promise<Map<HTMLElement, string[]>>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 检查变量是否定义。
|
|
76
|
+
* 如果带 target_el 则查继承链;否则全局查样式表。
|
|
77
|
+
*/
|
|
78
|
+
export function is_css_var_defined(varnm: string, target_el?: HTMLElement): boolean;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 在指定元素上定义 CSS 变量值
|
|
82
|
+
*/
|
|
83
|
+
export function def_css_var(name: string, val: string | number, el?: HTMLElement): void;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 获取 @property 注册的元数据(类型语法、继承性、初始值)
|
|
87
|
+
*/
|
|
88
|
+
export function get_css_prop_var(varnm: string): {
|
|
89
|
+
name: string;
|
|
90
|
+
syntax: string;
|
|
91
|
+
inherits: boolean;
|
|
92
|
+
initialValue?: string;
|
|
93
|
+
} | null;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 探测变量是否因为 @property 规则(inherits: false)而处于隔离状态
|
|
97
|
+
*/
|
|
98
|
+
export function is_css_var_isolated(varnm: string, target_el: HTMLElement): boolean;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 运行时注册 CSS 变量规则(JS 版 @property)
|
|
102
|
+
* @param name 变量名
|
|
103
|
+
* @param options 配置项
|
|
104
|
+
*/
|
|
105
|
+
export function def_css_prop_var(
|
|
106
|
+
name: string,
|
|
107
|
+
options: {
|
|
108
|
+
syntax?: string;
|
|
109
|
+
inherits?: boolean;
|
|
110
|
+
initialValue?: string;
|
|
111
|
+
}
|
|
112
|
+
): boolean;
|
|
113
|
+
}
|
package/calc.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const {wait_for_layout_ready}
|
|
1
|
+
const {wait_for_layout_ready} = require("./wait");
|
|
2
2
|
|
|
3
3
|
const creat_rect_desc = () => ({
|
|
4
4
|
"x": 0,
|
|
@@ -132,6 +132,186 @@ const is_ele_overlapping_with_eles = (checkEle, eleList) => {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
|
|
135
|
+
/**
|
|
136
|
+
* 获取元素在层叠上下文中的“真实层叠权重”
|
|
137
|
+
* 返回 [zIndex(数值), DOM索引(数值)]
|
|
138
|
+
*/
|
|
139
|
+
const get_z_stacking_info = (el) => {
|
|
140
|
+
const style = window.getComputedStyle(el);
|
|
141
|
+
const zIndex = style.zIndex;
|
|
142
|
+
// 如果 z-index 是 auto,在层叠上下文计算中视为 0
|
|
143
|
+
// 但 auto 和 0 在某些情况下有细微区别,这里统一转为数字处理
|
|
144
|
+
const zValue = zIndex === 'auto' ? 0 : parseInt(zIndex, 10);
|
|
145
|
+
// 获取它在父元素中的位置索引,用于 z-index 相同时的“后来居上”原则
|
|
146
|
+
const domIndex = Array.from(el.parentNode?.children || []).indexOf(el);
|
|
147
|
+
return { zValue, domIndex };
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 寻找元素向上直到根节点的“层叠上下文链”
|
|
152
|
+
*/
|
|
153
|
+
const get_z_stacking_context_chain = (el) => {
|
|
154
|
+
const chain = [];
|
|
155
|
+
let curr = el;
|
|
156
|
+
while (curr && curr !== document.documentElement) {
|
|
157
|
+
const style = window.getComputedStyle(curr);
|
|
158
|
+
// 只有创建了层叠上下文的元素才具有“统治力”
|
|
159
|
+
// 简单的判定:zIndex 不是 auto 且 position 不是 static,或者有 opacity, transform 等
|
|
160
|
+
const isStacking = style.zIndex !== 'auto' ||
|
|
161
|
+
style.opacity < 1 ||
|
|
162
|
+
style.transform !== 'none' ||
|
|
163
|
+
style.flex !== 'none'; // 简化版判定
|
|
164
|
+
if (isStacking || curr === el) {
|
|
165
|
+
chain.unshift({
|
|
166
|
+
el: curr,
|
|
167
|
+
z: style.zIndex === 'auto' ? 0 : parseInt(style.zIndex, 10),
|
|
168
|
+
index: Array.from(curr.parentNode?.children || []).indexOf(curr)
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
curr = curr.parentElement;
|
|
172
|
+
}
|
|
173
|
+
return chain;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
//取实时值,,不要取配置值
|
|
177
|
+
/**
|
|
178
|
+
* 比较两个元素在 Z 轴上的高低
|
|
179
|
+
* @returns {number} 1: el0 在上, -1: el1 在上, 0: 相同
|
|
180
|
+
*/
|
|
181
|
+
const compare_z_physically = (el0, el1) => {
|
|
182
|
+
if (el0 === el1) return 0;
|
|
183
|
+
const chain0 = get_z_stacking_context_chain(el0);
|
|
184
|
+
const chain1 = get_z_stacking_context_chain(el1);
|
|
185
|
+
// 找到两个链条开始分叉的地方
|
|
186
|
+
let i = 0;
|
|
187
|
+
while (i < chain0.length && i < chain1.length && chain0[i].el === chain1[i].el) {
|
|
188
|
+
i++;
|
|
189
|
+
}
|
|
190
|
+
// 如果在一个链条内(一个是另一个的祖先)
|
|
191
|
+
if (i === chain0.length) return -1; // el0 是 el1 的祖先,通常在下
|
|
192
|
+
if (i === chain1.length) return 1; // el1 是 el0 的祖先,通常在上
|
|
193
|
+
// 在分叉点对比两者的层叠属性
|
|
194
|
+
const node0 = chain0[i];
|
|
195
|
+
const node1 = chain1[i];
|
|
196
|
+
if (node0.z !== node1.z) {
|
|
197
|
+
return node0.z > node1.z ? 1 : -1;
|
|
198
|
+
}
|
|
199
|
+
// z-index 相同,靠后的胜出
|
|
200
|
+
return node0.index > node1.index ? 1 : -1;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const is_below_at_z = (el0, el1, phisically = true) => {
|
|
204
|
+
if (phisically) return compare_z_physically(el0, el1) === -1;
|
|
205
|
+
const s0 = get_z_stacking_info(el0);
|
|
206
|
+
const s1 = get_z_stacking_info(el1);
|
|
207
|
+
return s0.zValue < s1.zValue || (s0.zValue === s1.zValue && s0.domIndex < s1.domIndex);
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const is_same_at_z = (el0, el1, phisically = true) => {
|
|
211
|
+
if (phisically) return compare_z_physically(el0, el1) === 0;
|
|
212
|
+
const s0 = get_z_stacking_info(el0);
|
|
213
|
+
const s1 = get_z_stacking_info(el1);
|
|
214
|
+
return s0.zValue === s1.zValue && s0.domIndex === s1.domIndex;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const is_upper_at_z = (el0, el1, phisically = true) => {
|
|
218
|
+
if (phisically) return compare_z_physically(el0, el1) === 1;
|
|
219
|
+
const s0 = get_z_stacking_info(el0);
|
|
220
|
+
const s1 = get_z_stacking_info(el1);
|
|
221
|
+
return s0.zValue > s1.zValue || (s0.zValue === s1.zValue && s0.domIndex > s1.domIndex);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* 深度穿透探测指定坐标下的所有元素(含 Shadow DOM 内部元素)
|
|
226
|
+
* @param {number} x - ClientX
|
|
227
|
+
* @param {number} y - ClientY
|
|
228
|
+
* @returns {Element[]} 按从上到下顺序排列的元素数组
|
|
229
|
+
*/
|
|
230
|
+
const get_deep_elements_from_point = (x, y) => {
|
|
231
|
+
const elements = new Set(); // 使用 Set 去重
|
|
232
|
+
|
|
233
|
+
const get_deep_at = (root) => {
|
|
234
|
+
// 1. 获取当前根节点下该坐标的所有元素
|
|
235
|
+
const targets = root.elementsFromPoint ?
|
|
236
|
+
root.elementsFromPoint(x, y) :
|
|
237
|
+
[];
|
|
238
|
+
|
|
239
|
+
for (const el of targets) {
|
|
240
|
+
// 如果已经处理过(避免死循环),跳过
|
|
241
|
+
if (elements.has(el)) continue;
|
|
242
|
+
elements.add(el);
|
|
243
|
+
|
|
244
|
+
// 2. 核心:如果该元素拥有 ShadowRoot,递归进去
|
|
245
|
+
if (el.shadowRoot) {
|
|
246
|
+
get_deep_at(el.shadowRoot);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
get_deep_at(document);
|
|
252
|
+
|
|
253
|
+
// 转换为数组,并按照它们在 DOM 树中的视觉层级(从上到下)排序
|
|
254
|
+
// elementsFromPoint 默认就是从上到下的,递归合并后大部分情况下顺序是正确的
|
|
255
|
+
return Array.from(elements);
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* 根据索引获取具备高辨识度的状态样式 (Indexed Distinct Style)
|
|
260
|
+
* 采用黄金角算法确保色相跨度最大,并结合背景材质进行分组细化。
|
|
261
|
+
*/
|
|
262
|
+
function get_indexed_distinct_style(idx, total) {
|
|
263
|
+
if (idx === 0) return {
|
|
264
|
+
backgroundColor: '#ffffff',
|
|
265
|
+
backgroundImage: 'none',
|
|
266
|
+
color: '#000'
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const goldenAngle = 137.508;
|
|
270
|
+
const hue = (idx * goldenAngle) % 360;
|
|
271
|
+
|
|
272
|
+
// 分组逻辑:将 360 度分为 6 个主色相组
|
|
273
|
+
const group = Math.floor(hue / 60);
|
|
274
|
+
|
|
275
|
+
let style = {
|
|
276
|
+
backgroundColor: `hsl(${hue}, 75%, 82%)`, // 统一亮度
|
|
277
|
+
backgroundImage: 'none',
|
|
278
|
+
color: '#000',
|
|
279
|
+
fontWeight: 'bold',
|
|
280
|
+
border: 'none'
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const dark_mask = 'rgba(0,0,0,0.12)';
|
|
284
|
+
const light_mask = 'rgba(255,255,255,0.4)';
|
|
285
|
+
|
|
286
|
+
// 基于 group 的背景材质编码 (Visual Fingerprinting)
|
|
287
|
+
if (group === 0) { // 红色系 - 纯平材质
|
|
288
|
+
style.backgroundImage = 'none';
|
|
289
|
+
}
|
|
290
|
+
else if (group === 1) { // 黄色系 - 经典波点
|
|
291
|
+
style.backgroundImage = `radial-gradient(${dark_mask} 15%, transparent 16%)`;
|
|
292
|
+
style.backgroundSize = '6px 6px';
|
|
293
|
+
}
|
|
294
|
+
else if (group === 2) { // 绿色系 - 微型格纹
|
|
295
|
+
style.backgroundImage = `linear-gradient(45deg, ${dark_mask} 25%, transparent 25%, transparent 75%, ${dark_mask} 75%, ${dark_mask}), linear-gradient(45deg, ${dark_mask} 25%, transparent 25%, transparent 75%, ${dark_mask} 75%, ${dark_mask})`;
|
|
296
|
+
style.backgroundSize = '10px 10px';
|
|
297
|
+
style.backgroundPosition = '0 0, 5px 5px';
|
|
298
|
+
}
|
|
299
|
+
else if (group === 3) { // 青色系 - 散斑材质
|
|
300
|
+
style.backgroundImage = `radial-gradient(${dark_mask} 15%, transparent 16%), radial-gradient(${light_mask} 15%, transparent 16%)`;
|
|
301
|
+
style.backgroundSize = '8px 8px';
|
|
302
|
+
style.backgroundPosition = '0 0, 4px 4px';
|
|
303
|
+
}
|
|
304
|
+
else if (group === 4) { // 蓝色系 - 垂直栅栏纹
|
|
305
|
+
style.backgroundImage = `linear-gradient(90deg, ${dark_mask} 1px, transparent 1px)`;
|
|
306
|
+
style.backgroundSize = '4px 100%';
|
|
307
|
+
}
|
|
308
|
+
else { // 紫色系 - 柔光渐变
|
|
309
|
+
style.backgroundImage = `radial-gradient(circle at center, ${light_mask} 0%, transparent 75%)`;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return style;
|
|
313
|
+
}
|
|
314
|
+
|
|
135
315
|
module.exports = {
|
|
136
316
|
creat_rect_desc,
|
|
137
317
|
get_rect_desc_bfr_transfrom,
|
|
@@ -140,5 +320,10 @@ module.exports = {
|
|
|
140
320
|
get_all_positions_transform_diff,
|
|
141
321
|
is_rect_overlapping,
|
|
142
322
|
is_ele_overlapping_with_eles,
|
|
143
|
-
|
|
323
|
+
get_z_stacking_info,
|
|
324
|
+
get_z_stacking_context_chain,
|
|
325
|
+
compare_z_physically,
|
|
326
|
+
is_below_at_z,is_same_at_z,is_upper_at_z,
|
|
327
|
+
get_deep_elements_from_point,
|
|
328
|
+
get_indexed_distinct_style
|
|
144
329
|
}
|