零碎的知識(一)

寫在前面

最近沒怎麼寫新的東西,一是因爲一直在準備換新的工作,所以一直在準備面試,二是因爲過年,心靜不下來,所以也無法輸出或者翻譯一些文章,三是由於手頭還有一些遺留工作需要完成和交接,比較忙。

但是忙裏偷閒還是整理了一些零碎的筆記,大體都是關於工作中遇到的實際問題或者衍生問題,比較亂,但還是具有一定的參考意義,所以整理出來分享給大家,有的知識點包含一個或多個參考鏈接以及一段描述,有的只包含一段描述,但我覺的都足以描述解決問題的思路了。

其實我感覺這種記錄性的學習方式還挺好的,以後會繼續堅持,然後每攢夠 10 個就整理成一篇文章,一來可以幫助自己溫故知新,二來可以幫助更多的人。

如何獲取一個元素盒的 baseline 的位置?

https://stackoverflow.com/que...

原理爲在元素盒末尾添加兩個內容爲 X 的且 vertical-align 位置默認值的子元素,之後將第二個子元素的 font-size 設置爲 0,這樣由於默認情況下元素的垂直對齊方式是與父元素盒的 baseline 對齊的,由於 font-size: 0 的緣故,該元素的 top 也與 baseline 對齊,因此就可以通過 getBoundingClientRect 分別獲取兩個子元素的 top 值並求差取得。

但要注意的是,這樣求得的 baseline 的位置並不一定是最原始的位置,因爲 baseline 的位置會根據行內子元素的樣式動態地發生改變,關於改變的規則,可參考這篇文章

Object.keys(new Set([1, 2, 3]) 的值是什麼?

https://github.com/30-seconds...

應該是 [],有興趣的可以閱讀 es 標準中有關這部分的章節。

那麼如何判定一個 set 是否爲空呢?可以直接通過其實例屬性 `size 來判定,比如

new Set([1, 2, 3]).size // 3

當 table 的 border-collapse 樣式屬性爲 collapse 時,懸浮 td 邊框顯示不完整

https://stackoverflow.com/que...

可以將 td 的 border-style 樣式屬性設置爲 double,如下:

td: hover {
    border-style: double;
}

獲取 es6 中 class 的 name ?

可以通過 this.constructor.name 來獲取。原理是 constructor 本身其實是一個函數,而 js 中的每個函數均有 name 屬性指向其函數名,而 class 的 name 恰恰就是 constructor 的函數名,因此可以通過這種方式獲得。

Angular 中的 animation 模塊如何在運行時動態傳入 styles

之所以遇到這個問題,是因爲在使用 @angular/animation 的過程中,當動畫的目標狀態無法提前定義時,如何聲明 AnimationMetadata,比如窗口縮放動畫,你無法預知運行時的窗口縮放大小。

這部分內容在官方文檔中沒有示例,僅在 api 文檔 中提了一下,其本質上就是利用 animation params 來動態地在運行時傳入某個動畫狀態下的某個 style 屬性,比如縮放動畫中涉及的 width 或者 height 屬性。

另外還有一個問題就是,當在使用 animate() 時,其第一個參數暫時不支持 animation-fill-mode,這就會造成當完成一個動畫時,無法指定其動畫的終止狀態,比如在聲明縮放動畫時,縮放動畫會按預期進行,但當動畫交互完畢後,其元素樣式又恢復到了動畫發生之前的樣式了。

暫時的解決方法是通過 ngStyle 來暫存動畫的終止狀態並綁定到相應的 dom 元素上,這樣當動畫完成時,其元素樣式就會是動畫終止時的狀態了。

Angular 中的 NgZone.run() 和 ChangeDetectorRef.detectChanges() 的區別?

https://stackoverflow.com/que...

NgZone.run() 會在應用整體,自上而下全部進行髒檢查校驗,而 cdr.detectChanges() 僅僅會對某個具體的組件進行髒檢查。

從適用角度來講,大部分情況適用 cdr.detectChanges()cdr.markForCheck() 已經足夠滿足日程工作需求了,但有些時候,當頁面有多個組件的 UI 層狀態與數據層狀態不一致時,使用 NgZone.run() 則更好。

另外,一些工具庫的源碼實現中,爲了儘可能的提高性能,都會使用 NgZone.runOutsideAngular() 將與 UI 層無關的邏輯移出髒檢查校驗流程,比如 cdk 中的 ScrollDispatcher,在使用時如果最終需要與一些組件的 UI 層狀態發生關係,應當手動管理髒檢查機制來觸發這些變動。

Angular 中如何在 service 和 component 中使用 pipe ?

https://stackoverflow.com/que...

pipe 本身即是 provider ,因此可以通過依賴注入的方式獲取相應實例並使用,但是別忘了在 NgModuleproviders 屬性中聲明。

同時,由於 pipe 本身的實現大部分是純函數,因此在 v6 版本中,一些不含副作用的 pipe 均在 @angular/common 中暴露了以 format 爲前綴的函數方法,也可以直接導入使用。

Canvas 在 retina 屏中繪製圖片或字體發虛怎麼辦?

https://stackoverflow.com/que...
https://www.html5rocks.com/en...

我們繪製圖片或者字體時,一般指的是邏輯像素,而 canvas 會將邏輯像素自動按照渲染設備的 devicePixelRatio 的值來渲染,因此,在 retina 這種高清顯示屏幕中,由於其 devicePixelRatio 爲 2,因此 1px 的邏輯像素相當於 2px 的物理像素,渲染結果會發虛,其實是被放大了。

解決方法就是,利用 canvas 的 setTransform 或者 scale 方法來對 canvas 的進行放大,之後再利用 css 屬性 width 和 height 進行縮小(這個過程是透明的,瀏覽器會幫我們完成),這樣,在 canvas 繪製時,我們就無需關係邏輯像素與物理像素之間的區別了。

值得一提的是,對於物理像素,可以通過 devicePixelRatio 來獲取。

Authorization Header 在 Safari 瀏覽器中神祕丟失?

嘗試檢查被請求的 api url 是否存在尾部斜線(trailing slash),具體原因暫時沒有找到相關資料。

如何移除 git 提交歷史中關於某個文件的修改歷史?

場景是這樣的,在一次提交 PR 的 review 過程中,我提交的一個文件,在若干 commits 的修改下,最終和最初狀態完全相同,但是 PR 中卻保留了對該文件的提交歷史,因此 reviewer 希望我可以將這個文件移除提交歷史。

這個主要需要用到 git rebase ,步驟如下:

  • git log filename: 首先通過 git log 來查詢要回滾到的 commit id
  • git reset commit-id filename: 對該文件進行 reset 操作(撤銷提交歷史相關的修改)
  • git checkout filename: 對其進行 checkout 操作(撤銷對文件本身的修改)
  • git commit --amend: 修改提交歷史信息
  • git rebase --continue/git push: 同步
關注公衆號 全棧101,只談技術,不談人生

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章