<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實現視覺化埋點的過程中,元素圈選是其功能中不可或缺的一環,其能力具備一定的通用性,故將其邏輯從 視覺化埋點平臺 中剝離出來,單獨作為一個獨立的工具方法暴露出來,原始碼及演示可直接在 github倉庫中 檢視。本文主要是對其實現的拆解和其中關鍵點的記錄。
整體的 demo 可以在此處檢視。
整體來講,圈選器的功能在於:
enable 前,使用者可自由互動,此時點選、移動並不會被阻礙。
而 enable 後,當用戶移動滑鼠/行動端移動手指,便會高亮當前選擇的元素的大小、padding 及 margin 等。
而當用戶滑鼠點選 / 行動端手指離開 後,將會觸發選中的回撥,視覺化埋點平臺在這一環節喚起 埋點錄入表單。
從整體的思路上來講,整個 元素圈選器 的核心功能在於:
除此之外需要具備 開關能力,以免影響使用者正常互動。
首先是元素的位置計算,一個非常簡單的方法是藉助現成的 api: Element.getBoundingClientRect 。
通過該方法拿到的 left, top,便是元素相對於視區左上角的位置,這樣在後續新增蒙層的時候,以此作為元素位置即可。
但是實際在新增蒙層時,左上角是包含了 margin 的位置,故此處通過 left - 'margin-left', top - 'margin-top' 作為元素在左上角的位置。
而對於元素的大小,可以通過 element.offsetWidth 來獲取,這一值包含了元素的 border padding 及 content,故元素實際的寬高需要減去左右 border 和 左右 padding,才是元素的 實際寬高。
對於元素的屬性:margin, padding,border,可以通過 Window.getComputedStyle 獲取。
得到上述資料後,整個元素的位置、大小、margin/padding/border 值都得到了完整的值,此時便可以按照這一尺寸繪製元素的蒙層。
但是在實際的場景中,還存在元素通過 transform 後縮放的場景,此處對上述用到的 api 和 transform scale 的關係進行梳理。
可以看出來,元素的位置是縮放後的,而大小、屬性是縮放前的,實際蒙層的位置和大小是無法對應的。
此時有兩種方案,一種是根據縮放比例,計算縮放後的大小、屬性,另一種方式是直接在父元素上追加同等的縮放比例,從而獲取到實際的蒙層大小。本文采用的是後一種方案。
通過 ele.offsetWidth / getComputedStyle().width 拿到元素本身的縮放比例,此時對蒙層父元素追加反向比例的縮放,即可正確新增縮放後的蒙層。此時,由於位置一直取的是左上角,故實際並不需要關心元素的 transform-origin,始終使用左上角即可保證蒙層的位置正確。
但是實際處理時,由於元素的位置是 left - 'margin-left' 獲得的,此時由於 left 是縮放後的,而 margin-left 是縮放前,所以此處還需要對 left 乘上比例後再相減,實際的 left 值計算出後,再除以縮放比例即可解決。
實際的場景中,還存在一種情況,就是對整個 html 檔案流的縮放,這一場景是在一些 h5 頁面,需要相容 pc 12px 的字型時,以前一些舊的頁面會先對 整個頁面按照放大 3 倍的尺寸開發,然後在最外層再套一個 transform: scale(0.333) 來實現對 12px 字型的相容。
要相容該場景,首先需要全域性插入一個輔助元素,用於檢測 html 上的縮放。
元素的大小、位置及屬性計算不進行修改,全部使用縮放前的值,但是蒙層父元素的縮放比例需要進行調整,從原本的 僅進行元素的縮放,改為進行元素的縮放並還原 html 的縮放。
這是因為由於蒙層本身被進行了縮放,而元素也被進行了自身和 html 的雙重縮放,所以蒙層父元素僅需要按照元素的實際縮放比例進行縮放,但是實際由於蒙層還被 html 的縮放了一層,故需要針對性的抵消縮放比例才可以正常展示蒙層的大小。
以上便是整個元素大小、位置及屬性獲取的方案,也解決了邊界的 transform 場景,實際中還會有一些額外的處理,比如 元素的 tips 由於存在文字,其展示就不進行元素大小的縮放,僅抵消掉 html 帶來的縮放比例即可。
在實際的頁面中,往往存在列表元素,這些元素結構類似但是每一行又有資料 or 樣式上的差別,對於這種元素,在視覺化埋點中,往往需要智慧檢測且需要批次選擇。
對於列表場景,每一行往往有跡可循,而判定列表元素,往往也是找到一行。當然,實際的判定還是需要按照一定的規則,在這裡,我定的幾個判定規則有:
通過這樣的方式,實測能夠覆蓋業務中的大部分列表場景。
在實際視覺化埋點過程中,圈選蒙層的掛載位置,一開始是放在 body 的最後一個元素,但是實際場景中,會存在動態 modal 這樣的場景,會動態的在 body 最後追加元素,此時該元素的 xpath 便會收到蒙層元素的影響,導致統計偏差,故在參考 vconsole 後,將元素轉移到了 html 下,從而減少對業務元素的影響。
pc 端 與 mobile 端,一方面是將 mousemove 替換為 touchmove。
而另一方面,圈選結束的時機在 mobile 端丟失。原本 pc 端通過 body 上捕獲階段的點選事件進行圈選結束的判定,而 mobile 端,由於 click 事件在 touchmove 後不會觸發,故需要在 touchend 中建立自定義事件,觸發 body 上的點選。
除此之外,mobile 端還存在移動觸發頁面捲動的情況,此處本文采用了對所有元素增加 touch-action: none 的方法,避免了行動端手指捲動時對全域性頁面的影響。
同時,行動端 touchmove 的 target 並不會指向當前 move 的元素,需要使用一些 api 進行當前元素的獲取,虛擬碼如下:
if (e instanceof TouchEvent && e.touches) { const changedTouch = e.changedTouches[0]; return document.elementFromPoint(changedTouch.clientX, changedTouch.clientY); }
同時,由於該方案回獲取當前位置的元素,也就是說如果手指下方的元素是蒙層元素,那麼也會被選中,所以需要對 蒙層等無關元素增加 touch-action: none 來避免被選中。
至此,便完成了 mobile 端的相容。
整體來講,圈選器的實現並不複雜,麻煩的點主要集中在特殊場景的處理及 dom 的操作上。
元素位置、大小、屬性的獲取,是否受 transform scale 影響,是否存在 html 上的縮放,都是一些常見的邊界條件。
而行動端的相容、列表元素的判定,也為視覺化埋點的整體能力進行了增強。
同時,此 dom-inspector-pro,也在 api 上進行了拓展,更多的回撥也能滿足更多的場景使用。
以上就是視覺化埋點元素圈選器實現原始碼的詳細內容,更多關於視覺化埋點元素圈選器的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45