当我们用 方向键 在 HTML页面 上移动,此时,可通过多种方式控制焦点行为:
1、通过 JS 逻辑,控制焦点的移动,此时下一个焦点位置,完全是由 JS 来控制
2、可通过浏览器默认行为,浏览器会计算焦点的位置,响应上下左右按键是通过 各个焦点相对位置 来确定下一个焦点
注:
1、当页面通过 JS 逻辑控制焦点时,要添加 event.preventDefault() 来阻止浏览器的默认焦点行为,以防止焦点被多次处理
2、浏览器 判定 焦点位置的时候,会通过多个条件来判定
<1> 从 DOM 树遍历结点,找出在移动方向上的结点,比如,按方向右键时,在当前结点左边以及正上、正下的结点都被 PASS
<2> 从上面找出的可能结点中,计算每个 Candidate跟当前结点的距离,并跟最近的结点对比,
如小于最近结点,则设此结点为最近结点【findFocusCandidateInContainer】
<3> 判断 Candidate 跟当前结点方向是否完全在一条直线上(aligned),平行结点优先于部分平行结点,
即 正对的 优先于 斜对的,添加次条件以为,计算两个结点距离时,结点通常不是一个点,而是有宽高,
距离获取的都是最近的部分,可能相等
<4> 两个 Candidate 可能有重合部分,此时,浏览器会通过 HitTest 算法,来判断究竟是哪个结点优先,
但在 HitTest 时,可能存在后一个结点盖住前面结点部分区域的问题,这个还要看情况来判断