整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          前端技巧:使用Promise精確獲取網絡圖片尺寸

          現代前端開發中,動態加載圖片尺寸及其寬高比是一項基本而重要的技能。它不僅有助于提升頁面的響應速度和用戶體驗,還能在進行布局設計時提供更大的靈活性。本文將介紹如何使用JavaScript實現一個高效的方法loadImageSize,以異步方式準確獲取網絡圖片的寬度、高度和寬高比。

          基本概念

          Promise是JavaScript中用于處理異步操作的重要概念。它代表一個尚未完成但預期將會完成的操作。通過Promise,我們可以組織代碼以更直觀地處理異步事件,如圖片加載。圖片的寬度、高度和縱橫比(寬度除以高度的比值)是基本的圖形屬性,對于許多應用場景如布局和響應式設計至關重要。

          實現loadImageSize方法

          我們提供的loadImageSize方法使用Promise來加載圖片并獲取其尺寸和縱橫比。該方法接收一個圖片URL作為參數,并返回一個對象,其中包含圖片的寬度、高度和縱橫比。

          const loadImageSize = (url: string) => {
            return new Promise<{ width: number, height: number, aspectRatio: number }>((resolve, reject) => {
              const img = new Image();
              img.onload = () => {
                const aspectRatio = img.width / img.height;
                resolve({ width: img.width, height: img.height, aspectRatio });
              };
              img.onerror = reject;
              img.src = url;
            });
          }

          步驟分解

          1. 創建Image對象:這是Web API的一部分,允許我們創建一個圖片實例。
          2. 使用onload事件監聽器:當圖片加載完成時,觸發onload事件,并執行回調函數。在回調中,我們可以安全地訪問圖片的寬度和高度屬性。
          3. 計算縱橫比:通過寬度除以高度得到。
          4. 使用onerror處理加載錯誤:如果圖片無法加載,onerror事件被觸發,Promise被拒絕。
          5. 設置圖片的src屬性:這一步開始圖片的加載過程。

          使用示例

          下面是如何使用loadImageSize方法的示例:

          loadImageSize('https://example.com/image.jpg')
            .then(({ width, height, aspectRatio }) => {
              console.log(`Width: ${width}, Height: ${height}, Aspect Ratio: ${aspectRatio}`);
            })
            .catch(error => {
              console.error('Failed to load image:', error);
            });

          這段代碼展示了如何處理異步返回的圖片尺寸信息及錯誤處理。

          性能優化建議

          雖然異步加載圖片提供了許多優勢,但我們仍然需要考慮如何優化性能。預加載關鍵圖片或使用圖片懶加載技術可以進一步提升頁面的加載速度和用戶體驗。

          常見問題及解決方案

          在使用loadImageSize方法時,可能會遇到跨域圖片的問題。為了解決這個問題,我們可以設置Image對象的crossOrigin屬性。此外,要避免內存泄露,確保不再需要的Image對象能夠被垃圾回收。

          總結

          通過本文的介紹,我們學會了如何使用JavaScript以及Promise異步處理機制,有效地加載并獲取網絡圖片的尺寸和寬高比。這不僅能優化頁面加載性能,還能提升用戶體驗。希望讀者能夠通過實踐掌握這一技能,并在日常開發中加以應用。

          如果喜歡,可以點贊收藏,關注喲~

          用方案

          1、設置根 font-size:625%(或其它自定的值,但換算規則 1rem 不能小于 12px)

          2、通過媒體查詢分別設置每個屏幕的根 font-size

          3、CSS 直接除以 2 再除以 100 即可換算為 rem

          優:有一定適用性,換算也較為簡單。

          劣:有兼容性的坑,對不同手機適配不是非常精準;需要設置多個媒體查詢來適應不同手機,單某款手機尺寸不在設置范圍之內,會導致無法適配。

          網易方案

          1、拿到設計稿除以 100,得到寬度 rem 值

          2、通過給 html 的 style 設置 font-size,把 1 里面得到的寬度 rem 值代入x document.documentElement.style.fontSize =document.documentElement.clientWidth / x + ‘px‘;

          3、設計稿 px/100 即可換算為 rem

          優:通過動態根 font-size 來做適配,基本無兼容性問題,適配較為精準,換算簡便。

          劣:無 viewport 縮放,且針對 iPhone 的 Retina 屏沒有做適配,導致對一些手機的適配不是很到位。

          手淘方案

          1、拿到設計稿除以 10,得到 font-size 基準值

          2、引入 flexible

          3、不要設置 meta 的 viewport 縮放值

          4、設計稿 px/ font-size 基準值,即可換算為 rem

          優:通過動態根 font-size、viewpor、dpr 來做適配,無兼容性問題,適配精準。

          劣:需要根據設計稿進行基準值換算,在不使用 sublime text 編輯器插件開發時,單位計算復雜。

          、PX\EM\PT單位介紹

          px單位名稱為像素,相對長度單位,像素(px)是相對于顯示器屏幕分辨率而言的國內推薦;

          em單位名稱為相對長度單位。相對于當前對象內文本的字體尺寸,國外使用較多;


          pt單位名稱為點(Point),絕對長度單位一般老版本的table使用長度大小單位但是現在基本上沒有使用。

          html單位簡短介紹:

          Px 像素Pixel;相對長度單位。

          Pt 點(Point);絕對長度單位

          Em 相對長度單位,這里emhtml標簽"EM"拼寫完全相同,而這里em作為單獨文本單位。

          1. 以前IE無法調整那些使用px作為單位的字體大小,但現在幾乎IE都支持 在這里也推薦使用PX作為單位;

          2. 國外的大部分網站能夠調整的原因在于其使用了em作為字體單位;

          3. Firefox能夠調整px和em,但是96%以上的中國網民使用IE瀏覽器(或內核)。

          px像素(Pixel)。相對長度單位。像素px是相對于顯示器屏幕分辨率而言的,QQ截圖也是使用PX作為長度寬度單位。

          em是相對長度單位。相對于當前對象內文本字體寸。如當前對行內文本的字體尺寸未被人為設置,則相對于瀏覽器的默認字體尺寸。

          二、html單位對比案例

          1、簡單小例:

          Width:300px 寬度為300像素

          Width:300pt 寬度為300點

          Width:300em 寬度為300相對長度

          以上我們設置相同數值的不同單位實例

          2、對文字設置不同長度em px pt單位看看效果:

          CSS代碼:

          1. .divcss5-px{ font-size:12px}
          2. .divcss5-pt{ font-size:12pt}
          3. .divcss5-em{ font-size:2em}

          HTML代碼:

          1. < span>divclass="divcss5-px"<我是divcss5</>div<
          2. < span>divclass="divcss5-pt"<我是divcss5</>div<
          3. < span>divclass="divcss5-em"<我是divcss5</>div<

          3、單位長度對比說明圖


          html px pt em單位案例對比圖

          三、em與px換算

          任意瀏覽器的默認字體高度16px(16像素)。所有未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。為了簡化font-size的換算,需要在css中的body選擇器中聲明font-size=62.5%,這就使em值變為 16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說只需要將你的原來的px數值除以10,然后換上em作為單位就行了。

          12px相當于9pt長度;

          12px相當于0.75em長度;

          9pt相當于0.75em長度;

          一般我們使用em換算px較多

          高級em與px換算:

          任意瀏覽器的默認字體高度16px(16像素)。所有未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。為了簡化font-size的換算,需要在css中的body選擇器中聲明font-size=62.5%,這就使em值變為 16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說只需要將你的原來的px數值除以10,然后換上em作為單位就行了。

          具體使用時候:

          我們在對全體html標簽聲明初始一次font-size=62.5%

          如:

          *{font-size=62.5%}

          即可此后面布局可依據以下技巧進行設置em單位

          font-size:1.2em等于font-size:12px

          font-size:1.4em等于font-size:14px

          以此類推相當于初始font-size=62.5%后,em與px單位就只有10倍差距,以便方便計算與設置em長度數值使用。

          四、em單位有如下特點:

            1. em的值并不是固定的;

            2. em會繼承父級元素的字體大小。

          我們在寫CSS的時候如果要用em為單位,需要注意兩點:

            1. body選擇器中聲明Font-size=62.5%;

            2. 將你的原來的px數值除以10,然后換上em作為單位;

            3. 重新計算那些被放大的字體的em數值。避免字體大小的重復聲明。

            也就是避免1.2 * 1.2= 1.44的現象。比如說你在#content中聲明了字體大小為1.2em,那么在聲明的字體大小時就只能是1em,而不是1.2em, 因為此em非彼em,它因繼承#content的字體高而變為了1em=12px。

            但是12px漢字例外,就是由以上方法得到的12px(1.2em)大小的漢字在IE中并不等于直接用12px定義的字體大小,而是稍大一點。這個問題 Jorux已經解決,只需在body選擇器中把62.5%換成63%就能正常顯示了。原因可能是IE處理漢字時,對于浮點的取值精確度有限。不知道有沒有其他的解釋。

          五、推薦網頁單位

          所以為了單位換算錯誤推薦使用PX(像素)作為網頁制作單位

          以上為大家介紹了px em pt單位,及換算方式,一般現在我們使用長度單位都以px為長度單位。這里我們也推薦使用以px(像素)為網頁的尺寸長度單位,符合瀏覽器的像素單位,同時也為了方便計算長度尺寸。

          關于px pt em單位總結

          1)、推薦px像素為單位:通常我們使用px(像素為單位)較多,其次是em單位,平時推薦大家以px為單位;

          2)、我們的顯示屏分辨率以px像素為單位;

          3)、我們QQ截圖時候也是以px像素單位。


          主站蜘蛛池模板: 制服丝袜一区在线| 国产成人一区二区三区视频免费 | 精品一区二区久久| 国产精品亚洲一区二区无码| 亚洲日韩AV一区二区三区中文| 在线精品一区二区三区电影 | 亚洲国产日韩在线一区| 丰满人妻一区二区三区免费视频| 欧洲精品码一区二区三区免费看| 99偷拍视频精品一区二区| 怡红院AV一区二区三区| 精品视频一区二区| 日本一区二区在线| 国产福利微拍精品一区二区 | 一区二区在线观看视频| 国产精品美女一区二区视频 | 成人精品一区二区电影| 91精品一区二区三区在线观看| 亚欧色一区W666天堂| 极品尤物一区二区三区| 国产高清视频一区二区| 日韩精品无码一区二区视频| 人妻无码一区二区不卡无码av| 亚洲中文字幕乱码一区| 无码欧精品亚洲日韩一区夜夜嗨| 一区二区三区无码视频免费福利| 国产av一区二区三区日韩| 九九无码人妻一区二区三区| 男人免费视频一区二区在线观看 | 国产精品无码一区二区三区不卡 | 国产福利电影一区二区三区久久久久成人精品综合 | 国产成人欧美一区二区三区| 波多野结衣中文字幕一区二区三区| 精品一区二区在线观看| 乱色精品无码一区二区国产盗| 高清一区二区三区免费视频| 亚洲综合无码一区二区痴汉| 国产一区二区三区精品久久呦| 久久se精品一区二区| 国产无人区一区二区三区| 国产91精品一区二区麻豆网站|