溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用JS+CSS+HTML制作原生時序圖

發(fā)布時間:2022-02-22 11:15:15 來源:億速云 閱讀:124 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了怎么用JS+CSS+HTML制作原生時序圖的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用JS+CSS+HTML制作原生時序圖文章都會有所收獲,下面我們一起來看看吧。

經(jīng)過思索后決定使用原聲js+css+html去實現(xiàn),因為原聲js下性能是最優(yōu)的。下面先來說說新版本的需求:

  • 左側(cè)以樹形結(jié)構(gòu)展示任務(wù),可折疊

  • 右側(cè)展示任務(wù)運行所耗時間的長度

  • 需要用線條鏈接任務(wù)之間的關(guān)系

  • 右側(cè)可縮放查看詳細的任務(wù)狀態(tài)

  • 縮放時圖形保持以鼠標(biāo)為中心向兩端成一定比例放大,放大時里面的文字描述不受影響

  • 圖形縮放時表示任務(wù)耗時的時間以及坐標(biāo)需要跟隨圖像放大的比例進行相應(yīng)變化

  • 鼠標(biāo)在時序圖上移動時出現(xiàn)一根線條提示當(dāng)前的時間以及信息

怎么用JS+CSS+HTML制作原生時序圖

實現(xiàn)難點

鼠標(biāo)縮放,x軸的縮放方式

鼠標(biāo)縮放產(chǎn)生時序圖X軸的縮放。時序圖的縮放,在這里提供三種思路:

  1. 做數(shù)據(jù)截取,按照一定的算法截取前后的數(shù)據(jù),然后重新渲染整個頁面

  2. 利用css3的scaleX對時序圖的dom做縮放

  3. 實際改變時序圖dom的width,里面的任務(wù)運行的長度,連接線條的長度,任務(wù)運行預(yù)計需要的時長都以百分比顯示。

三種思路的優(yōu)缺點:

  1. 優(yōu)點:不需要去操作dom的css屬性,之間重新渲染,比較方便。缺點:對于使用dom重繪,耗費性能嚴重,大量任務(wù)渲染時性能很慢。

  2. 優(yōu)點:只需改變dom的css,加載快,較流程。缺點:計算麻煩,使用過scaleX的小伙伴會發(fā)現(xiàn)當(dāng)我X軸放大時垂直連接線會變寬,字體會橫向拉伸,都需要去反向縮小。

  3. 優(yōu)點:加載快,很流暢,一次計算好元素所占寬度的占百分比,后面的操作都不需要去計算。缺點:使用百分比計算會有一定誤差,放大到一定程度會看的出來。(綜合考慮,本人采用的是第三種)

// 計算寬度百分比的函數(shù)
// endTime: 任務(wù)的結(jié)束時間
// startTime: 任務(wù)的開始時間
// maxTime: 所有任務(wù)結(jié)束時間最大的值
// minTime: 所有任務(wù)開始時間最小的值
// time: 所有任務(wù)開始時間與結(jié)束時間的排序 升序
// task_width: 任務(wù)的長度、水平連接線的長度、垂直連接線的left值
const widthFun = function (endTime, startTime, maxTime, minTime) {
    const task_width =
    (((Number (endTime) - Number (startTime)) /
    ((maxTime || time[time.length - 1]) - (minTime || time[0])) *
    (body_width - tree_box_dom.offsetWidth)) / dom.offsetWidth)*100;
    return task_width> 100 ? 100 : task_width;
  };

鼠標(biāo)縮放,保持以鼠標(biāo)為中心,往兩邊放大

先放推理過程圖:

怎么用JS+CSS+HTML制作原生時序圖

// 上圖解釋
// dom = 時序圖的dom元素
// domL1, domeL2 = dom.scrollLeft;
// domeL1表示前一次的dom.scrollLeft;
// domeL2表示當(dāng)前的dom.scrollLeft;
// scale 表示當(dāng)前的放大的比例
// scale1 表示上一次的放大比例
// tree_dom.offsetWidth表示左側(cè)樹的寬度
// clientX1 表示上一次的鼠標(biāo)位置距離時序圖左側(cè)的距離 = e.clientX - tree_dom.offsetWidth
// clientX2 表示當(dāng)前鼠標(biāo)位置距離時序圖的距離

// 以鼠標(biāo)為中心的縮放,公式為:
domL2 = domeL1(scale/scale1) + clientX1(scale/scale1) - e.clientX + tree_dom.offsetWidth
// 公式講解:
// 1. scale/scale1表示本次的縮放比例除以上一次的縮放比例,表示當(dāng)前的縮放比例
// 左側(cè)卷去的寬度在第二次縮放時也會跟著縮放,所以左側(cè)的寬度需要乘以縮放比例
// 鼠標(biāo)位置距離時序圖左側(cè)的寬度在縮放時也會跟著縮放,所以也要乘以縮放比例
// 最后面減去鼠標(biāo)位置距離時序圖左側(cè)的實際距離就等于縮放時左側(cè)卷去的長度

// 頁面代碼
time_box_parent.scrollLeft = (time_box_parent.scrollLeft + e.clientX - tree_box_dom.offsetWidth) * (scale_x / scale_x1) - e.clientX + tree_box_dom.offsetWidth;

使用連線表示任務(wù)之間的關(guān)系

方案:

  1. 采用的時css3 + js + html5,用偽元素繪制。

  2. 用dom包裹直角圖片,設(shè)置其位置及高度。

  3. 用標(biāo)簽繪制
     

優(yōu)缺點:

  1. 優(yōu)點:不會增加多余的標(biāo)簽,對渲染有利。缺點:父任務(wù)產(chǎn)生了多個子任務(wù),不好添加偽類及設(shè)置偽類的高度及寬度。

  2. 優(yōu)點:方便,只要計算子任務(wù)距父任務(wù)的高度即可。缺點:任務(wù)過多時圖片會非常多,很影響性能

  3. 優(yōu)點:單獨控制每個元素的高度及位置,可控性高,可添加反饋色。缺點:添加了較多的元素,對渲染產(chǎn)生影響(本人使用的是第三種,這是一個笨方法,有更好方法的大佬,可以提供建議,多謝)

實現(xiàn)思路:

用一個變量記錄每個任務(wù)的層級深度,層級深都以當(dāng)前任務(wù)的父任務(wù)為起點,就是說是從哪個任務(wù)產(chǎn)生的當(dāng)前任務(wù),同級的子任務(wù)進行累加操作。用累加的變量按照一定的比例獲取垂直連線的高度以及水平連線的top值,水平連線的長度由任務(wù)的創(chuàng)建時間和開始時間決定。(使用上面的寬度百分比函數(shù))

時間單位:天、時、分、秒

這個比較簡單,實現(xiàn)思路:

因為本demo的時間4刻度是個刻度,判斷最小時間戳與最大時間戳之間的差除以4,是否還有一天的時間(60 * 60 * 24,換算成秒),從大到小的降序獲取時間單位。

關(guān)于“怎么用JS+CSS+HTML制作原生時序圖”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“怎么用JS+CSS+HTML制作原生時序圖”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI