element ui 代码查看工具栏固定和不固定

470 阅读1分钟

从浏览器 F12 查看可知,demo-block-control 元素块的固定与不固定,是通过增加 .is-fixed 的 class 覆盖样式实现的。

image.png

image.png

查看源码,.is-fixed 属性是通过 scrollHandler() 方法触发了重新计算赋值。

image.png image.png

这里有一个新的 Web API 接口:Element.getBoundingClientRect(),该方法返回元素的大小及其相对于视口的位置。

image.png

Element.getBoundingClientRect() 的返回结果是包含完整元素的最小矩形,并且拥有 left,top,right,bottom,x,y,width,height 这几个以像素为单位的只读属性用于描述整个边框。除了 width 和 height 以外的属性是相对于事图窗口的左上角来计算的。

image.png

从源码中可以看到,scrollHandler 方法读取了 meta 元素的位置参数,与当前窗口的高度 document.documentElement.clientHeight 进行比较,得到 fixedControl 的布尔值。

在结构上,meta 和 control 是分开的,如果 meta 块元素的底边低于屏幕,且上边仍在屏幕视窗内,表示 control 要固定在页面底部。

此时 meta 元素的 bottom 值会大于窗口高度,top 值与元素的高度(44px)相加的和应小于等于窗口高度。

那么,scrollHandler 方法是什么时候调用的呢?

image.png

watch 中,监测 isExpanded 属性,如果为展开状态(isExpanded=true),则添加 scroll 事件监听,当 scroll 事件发生时,触发 scrollHandler 方法,从而重新计算 control 元素的状态。