从浏览器 F12 查看可知,demo-block-control 元素块的固定与不固定,是通过增加 .is-fixed 的 class 覆盖样式实现的。
查看源码,.is-fixed 属性是通过 scrollHandler() 方法触发了重新计算赋值。
这里有一个新的 Web API 接口:Element.getBoundingClientRect(),该方法返回元素的大小及其相对于视口的位置。
Element.getBoundingClientRect() 的返回结果是包含完整元素的最小矩形,并且拥有 left,top,right,bottom,x,y,width,height 这几个以像素为单位的只读属性用于描述整个边框。除了 width 和 height 以外的属性是相对于事图窗口的左上角来计算的。
从源码中可以看到,scrollHandler 方法读取了 meta 元素的位置参数,与当前窗口的高度 document.documentElement.clientHeight 进行比较,得到 fixedControl 的布尔值。
在结构上,meta 和 control 是分开的,如果 meta 块元素的底边低于屏幕,且上边仍在屏幕视窗内,表示 control 要固定在页面底部。
此时 meta 元素的 bottom 值会大于窗口高度,top 值与元素的高度(44px)相加的和应小于等于窗口高度。
那么,scrollHandler 方法是什么时候调用的呢?
watch 中,监测 isExpanded 属性,如果为展开状态(isExpanded=true),则添加 scroll 事件监听,当 scroll 事件发生时,触发 scrollHandler 方法,从而重新计算 control 元素的状态。