Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
在本文中,了解如何使 HTML 圖像更適合具有響應(yīng)式尺寸和現(xiàn)代格式的用戶,而不會(huì)使您作為開發(fā)人員的生活更加困難。
假設(shè)我們只有一個(gè)從我的域加載圖像的基本網(wǎng)站。代碼可能如下所示:
<!DOCTYPE html><html><正文> <img src="https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。" ></正文></html>具有單個(gè)圖像標(biāo)記且具有 asrc和alt屬性的 HTML 文檔在技術(shù)上可以正常工作。它按預(yù)期提供圖像,但該圖像存在一些問題。
在大屏幕上,這張圖片會(huì)很好,但對于使用小屏幕設(shè)備的用戶來說,1200 像素寬的圖片意味著他們必須下載比他們需要的更大的圖片。下載可能需要更長的時(shí)間,并且可能會(huì)花費(fèi)他們的數(shù)據(jù)計(jì)劃費(fèi)用。
這第一步很關(guān)鍵,但我認(rèn)為大多數(shù)人都熟悉,所以我不會(huì)太深入。
Squoosh是一個(gè)非常棒的應(yīng)用程序,可以手動(dòng)執(zhí)行此操作。
如果圖像在您的 GitHub 存儲(chǔ)庫中,您也可以使用imgbot自動(dòng)完成。
圖像可以有一個(gè)srcset屬性,允許我們根據(jù)某些設(shè)備特征(例如設(shè)備寬度)為圖像定義多個(gè)來源。
我們可以srcset像這樣向我們的圖像標(biāo)簽添加一個(gè)屬性:
<!DOCTYPE html><html><正文> <img srcset=" https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-1080x540.png 1080w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-480x240.png 480w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-200x100.png 200w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-768x384.png 768w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png 1200w" src="https://cdn.statically.io/img/austingil.com/f=auto%2Cq=70/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。" ></正文></html>我鏈接到五個(gè)不同尺寸的五個(gè)不同圖像并定義它們相應(yīng)的視口寬度。如果我們在瀏覽器中打開我們的圖像,視覺上并沒有真正改變。但在引擎蓋下,有一些改進(jìn)。
當(dāng)我們在不同的屏幕上重新加載時(shí),打開開發(fā)工具網(wǎng)絡(luò)選項(xiàng)卡。
在大屏幕上,我們將看到像以前一樣下載了全尺寸圖像(Command-Line-Blog-Cover.png)。沒什么特別的。
但是,如果我們從 200 像素或更窄的屏幕開始,我們會(huì)加載 200x100 像素的圖像(Command-Line-Blog-Cover-200x100.png)。
對于用戶而言,該大小將變得更小更快。
僅發(fā)送較小圖像的一個(gè)問題是:如果用戶最初在小屏幕上加載頁面,然后將瀏覽器調(diào)整為更大的尺寸會(huì)發(fā)生什么?在大屏幕上拉伸小圖像會(huì)使它像素化。
屬性不會(huì)發(fā)生這種情況srcset(假設(shè)我們提供了正確的圖像),因?yàn)楫?dāng)從最小屏幕調(diào)整到最大屏幕時(shí),會(huì)根據(jù)它們的斷點(diǎn)下載新圖像。
方便的是,從大屏幕到小屏幕的另一個(gè)方向不會(huì)發(fā)生相同的行為,因?yàn)楫吘梗梢栽谳^小的屏幕上提供大圖像,并且可以縮小而不損失質(zhì)量。隨著屏幕變小,您不想下載額外的圖像,因?yàn)槟菢訒?huì)使用更多數(shù)據(jù)而沒有任何額外的好處。
這是一種非常方便的方法,可以通過節(jié)省帶寬來改善用戶體驗(yàn),并通過以正確的尺寸提供正確的圖像來提高性能,但仍有改進(jìn)的空間。
我們正在加載的圖像是 PNG,但現(xiàn)代瀏覽器支持新的圖像格式,例如WebP或AVIF。這些格式提供了更高的壓縮率而沒有明顯的數(shù)據(jù)丟失,這意味著我們可以以更小的文件大小有效地提供相同的圖像。
再一次,瀏覽器讓我們覆蓋了HTML<picture>元素。
類似于srcset屬性,圖片元素允許我們根據(jù)設(shè)備特性定義不同的圖像源來服務(wù)。
所以我們可以做一些事情,比如根據(jù)設(shè)備寬度或不同的像素密度提供不同的圖像。但是將圖片元素與屬性區(qū)分開來的一件事srcset是我們可以針對不同的 mime 類型。
如果瀏覽器支持,讓我們在示例中添加一個(gè)包含 AVIF 和 WebP 格式的圖片元素。當(dāng)然,我們還希望繼續(xù)提供響應(yīng)式版本。
<!DOCTYPE html><html><正文> <圖片> <來源 類型="圖像/avif" srcset=" https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover.avif 1200w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-1080x540.avif 1080w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-768x384.avif 768w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-480x240.avif 480w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-200x100.avif 200w" > <來源 類型="圖像/webp" srcset=" https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover.webp 1200w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-1080x540.webp 1080w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-768x384.webp 768w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-480x240.webp 480w, https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover-200x100.webp 200w" > <img src="https://cdn.statically.io/img/austingil.com/f=auto%2Cq=70/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。" > </圖片></正文></html>(我們不需要標(biāo)簽srcset,<img>因?yàn)樗梢宰鳛椴恢С值呐f瀏覽器的后備srcset。)
好的,我們有一個(gè)圖像,它只會(huì)以最小的尺寸為用戶提供最現(xiàn)代的圖像格式。
上面的代碼是不是……很漂亮?
真的讓您想向您的網(wǎng)站添加新圖像,對嗎?
正確的!?!?
不!我們做了什么!?!?
(你好黑暗,我的老朋友……)
好的,既然我們已經(jīng)解決了這個(gè)問題,很明顯,上面的解決方案并不是很好。
對于我們想要定位的每種格式和設(shè)備寬度,我們需要不同版本的圖像。在上面的示例中,這是同一圖像的11 個(gè)版本(5 個(gè) AVIF、5 個(gè) WebP、1 個(gè) PNG)。
盡管瀏覽器為我們提供了提供更好的圖像和提供更好的用戶體驗(yàn)的功能,但這是以開發(fā)人員體驗(yàn)為代價(jià)的。
(誰愿意付錢?不是我!)
我們可以在上傳圖像以生成不同的格式和大小時(shí)自動(dòng)執(zhí)行該過程,然后將這些詳細(xì)信息存儲(chǔ)在數(shù)據(jù)庫中。有一些工具可以提供幫助,例如sharp,但這仍然需要大量工作。我很少看到人們這樣做,因?yàn)橐垂ぷ髁刻螅此麄兏静豢紤]。
我的建議是外包。
今天我將使用 Akamai 圖像和視頻管理器,因?yàn)樗俏易钍煜さ姆?wù),盡管還有其他人做同樣的工作。主要目標(biāo)是在不讓開發(fā)人員發(fā)瘋的情況下為用戶提供最佳圖像。
我已經(jīng)設(shè)置了一個(gè)圖像管理器的實(shí)例。
要從我的域中添加圖像,我只需將“圖像”前綴添加到常規(guī)圖像 URL。所以“austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png”變成了“images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png”。
沒什么太有趣的。
但是讓我們回到我們的代碼,去掉<picture>元素,替換舊的 URL,看看我們能做什么:
<!DOCTYPE html><html><正文> <img srcset=" https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover-1080x540.png 1080w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover-480x240.png 480w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover-200x100.png 200w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover-768x384.png 768w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png 1200w" data-fr-src="https://cdn.statically.io/img/austingil.com/f=auto%2Cq=70/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。" ></正文></html><picture>與將元素與 AVIF 和 WebP一起使用相比,我認(rèn)為沒有人會(huì)抱怨這一點(diǎn)。這肯定是少了一些工作,但是結(jié)果呢?
如果我重新加載頁面,我們可以看到相同的圖像出現(xiàn)(“Command-Line-Blog-Cover.png”),但如果我們查看響應(yīng)標(biāo)題,事情會(huì)變得有點(diǎn)有趣。
盡管請求是針對 PNG 圖像的,但響應(yīng)實(shí)際上是發(fā)送 WebP 數(shù)據(jù)。這導(dǎo)致圖像尺寸更小,這意味著只需打開圖像管理器,我就已經(jīng)為我的用戶節(jié)省了帶寬,而無需做任何事情。
我們已經(jīng)改進(jìn)了格式,但是響應(yīng)式圖像大小呢?
我仍然將srcset屬性設(shè)置為在小屏幕上提供小圖像,在大屏幕上提供大圖像。但是這個(gè)系統(tǒng)仍然依賴于提供五種不同分辨率的五種不同的圖像。
還是很痛的。
僅提供上傳功能就可以成為一項(xiàng)重要功能,更不用說調(diào)整大小和存儲(chǔ)不同的圖像了。對我們來說幸運(yùn)的是,因?yàn)槲覀冋谑褂脠D像管理器,我們實(shí)際上可以使這個(gè)過程變得更簡單。
我實(shí)際上將多次引用同一個(gè)圖像,而不是使用五個(gè)不同大小的圖像。但我將附加一個(gè)查詢字符串參數(shù),該參數(shù)明確定義我想要定位的大小。
<!DOCTYPE html><html><正文> <img srcset=" https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png?imwidth=1080 1080w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png?imwidth=480 480w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png?imwidth=200 200w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png?imwidth=768 768w, https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png 1200w" src="https://cdn.statically.io/img/austingil.com/f=auto%2Cq=70/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。" ></正文></html>請注意,現(xiàn)在每個(gè)圖像 URL 都轉(zhuǎn)到相同的“Command-Line-Blog-Cover.png”文件,但其中一些imwidth附加了一個(gè)額外的查詢字符串。
如果我像以前一樣在這個(gè)小屏幕上重新加載并調(diào)整到更大的屏幕,我們會(huì)看到類似的行為。不同尺寸的不同圖像被加載到它們各自的屏幕尺寸中。
但是這里有一個(gè)很大的區(qū)別:我們不必創(chuàng)建、上傳和管理五張不同大小的不同圖像,我們只需要擔(dān)心一張圖像。通過 queer 字符串參數(shù)生成不同的大小。
與其他情況相比,它的工作量要少得多,尤其是在您使用基于組件的框架時(shí)。
但我們可以做的工作更少!
我們可以回到只使用圖像 URL,并讓圖像管理器為我們選擇合適的尺寸。
為了展示它,我喜歡在新標(biāo)簽而不是網(wǎng)站中打開圖像。將鼠標(biāo)懸停在瀏覽器選項(xiàng)卡上會(huì)顯示圖像的尺寸,1200x600px。
如果我打開我的開發(fā)工具,我可以轉(zhuǎn)到Elements 選項(xiàng)卡并模擬不同的設(shè)備,例如 iPhone SE:
現(xiàn)在,當(dāng)我重新加載時(shí)會(huì)發(fā)生一些有趣的事情。
盡管 URL 完全相同,但我可以看到圖像大約是一半大小。將鼠標(biāo)懸停在標(biāo)簽上可確認(rèn)尺寸為 640x320 像素。
最好的部分是什么?確定要提供哪個(gè)圖像的所有工作都是在我(開發(fā)人員)無需做任何事情的情況下進(jìn)行的。每次請求都會(huì)自動(dòng)發(fā)送設(shè)備特征,并且 Image Manager 會(huì)以更小的圖像進(jìn)行響應(yīng)。
老實(shí)說,我實(shí)際上無法解釋它是如何工作的。這很神奇,而且超級酷,讓我的生活更輕松,讓我的用戶生活得更好。
(如果你真的很好奇它是如何工作的,請?jiān)?Twitter 上聯(lián)系我,我會(huì)為你找出答案。)
如果您是 Akamai 客戶并且您沒有使用此功能,您應(yīng)該立即使用它!
我還想為非 Akamai 客戶的人們分享一些替代方案。有兩個(gè)開源項(xiàng)目看起來提供了類似的功能,盡管我沒有親自使用過它們。
其中之一稱為imgproxy。另一個(gè)稱為Thumbor。只要您習(xí)慣使用 Docker,它們看起來都很容易安裝。
我真的很喜歡Linode的廉價(jià)、強(qiáng)大的 VP。
我是 DIY 方法的忠實(shí)擁護(hù)者,但我認(rèn)為它并非沒有缺點(diǎn)(我的意思是,除了設(shè)置和維護(hù)之外)。我不確定這些服務(wù)在哪里托管圖像。如果它們與安裝托管在同一臺(tái)服務(wù)器上,則可能存在兩個(gè)問題。
也就是說,我認(rèn)為它仍然值得一試。
如果你確實(shí)讓它工作并且你喜歡它,請回來告訴我它是怎么回事。什么進(jìn)展順利,什么沒用,什么很棒,和/或缺少什么?
好吧,這就是我今天為你準(zhǔn)備的全部內(nèi)容。我們介紹了處理圖像的不同選項(xiàng)及其優(yōu)缺點(diǎn)。我們從<img>一個(gè)src屬性開始,添加一個(gè)srcset屬性,然后<picture>使用不同的<source>標(biāo)簽,最終把它全部燒掉,回到只是屬性,但合并了圖像管理器<img>。src
換句話說,這是一個(gè)非常迂回的旅程:
<! – 壞 – ><img src="https://austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。">對此:
<! – 好 – ><img data-fr-src="https://images.austingil.com/wp-content/uploads/Command-Line-Blog-Cover.png" alt="命令行終端和舊電腦,背景中有靛藍(lán)色筆觸。">多么虎頭蛇尾。
可能本來可以節(jié)省時(shí)間,然后說“改善圖像的第一步:使用圖像管理器”,但其中的樂趣在哪里?我也喜歡挖掘原因。
我們甚至沒有涉及諸如延遲加載、解碼或獲取優(yōu)先級之類的內(nèi)容,但這些內(nèi)容更具上下文和細(xì)微差別,而上面的建議幾乎是全面的。
無論如何,我希望您喜歡它,并且希望您實(shí)施其中一些解決方案,因?yàn)榘l(fā)送具有現(xiàn)代格式的較小圖像是使互聯(lián)網(wǎng)成為更快、更環(huán)保的地方的好方法。
者:Javan
轉(zhuǎn)發(fā)鏈接:http://www.javanx.cn/20190321/css-skill/
嘍大家好,我是胖達(dá)。本期視頻來看看路徑相關(guān)的內(nèi)容。我們知道在網(wǎng)頁中存在很多的圖片,如果把這些圖片和html文檔放在一起,這樣不光不美觀,管理起來也非常不方便。通常會(huì)新建一個(gè)專門用來管理圖像資源的文件夾,當(dāng)需要查找圖像的時(shí)候就會(huì)選擇使用路徑的方式來指定圖像文件的位置。
路徑的類型又分為兩種,第一種是相對路徑,第二種是絕對路徑。今天先來了解一下相對路徑。相對路徑是相對于當(dāng)前文件的位置來表示資源,也就是圖片位置的路徑表達(dá)方式。簡單來說就是圖片相對于當(dāng)前html文檔的位置。這里把相對路徑的分類給大家列出來了,一個(gè)一個(gè)往下看。
·首先是同級路徑。同級路徑不需要在html里面寫任何符號,只需要將文件名寫到html屬性里就可以了。在代碼里看一下,這里有一個(gè)image,點(diǎn)jpg的圖片和html文檔處于同一級,所以在html的屬性里直接寫image,點(diǎn)jpg保存一下看看效果。
可以看到現(xiàn)在圖片是正常展示的,同級路徑下只需要在html屬性里完整填寫圖像文件的名稱就可以了。
·再來看第二個(gè)下級路徑。當(dāng)圖像文件位于html文件下一集時(shí),需要在html屬性里完整填寫同級文件夾的名稱,然后斜杠寫出對應(yīng)圖片文件的名稱。
→首先打開資源文件夾,在這里新增一個(gè)images的文件夾。將image圖片文件復(fù)制一份放到images文件夾里。
→打開vscode,新建一個(gè)gtml文檔,這里新增一個(gè)image標(biāo)簽。
→在左側(cè)資源管理器中剛剛新增的images文件夾已經(jīng)顯示出來了,打開以后會(huì)發(fā)現(xiàn)里面有一個(gè)image,點(diǎn)jpg的圖片。把這個(gè)路徑寫一下,在src屬性里面寫入位于當(dāng)前html文件同級的images文件夾的名稱,使用符號斜杠找到image,點(diǎn)gpg,看一下效果。此時(shí)圖片也完整顯示出來了。
→如果在amager四文件夾里還有一個(gè)amager四文件夾,下級路徑又該怎么寫?在amager文件夾里再新建一個(gè)文件夾,打開vscod,在左側(cè)的資源管理器中a major s文件夾下面又新增了一個(gè)a major s文件夾,在這里面又放了一張圖片。
這張圖片應(yīng)該怎樣讓它展示出來?一起來看一下。
→首先找到同級的images文件夾,使用符號斜杠,此時(shí)vscode會(huì)提供給兩個(gè)選項(xiàng),一個(gè)是imagers文件夾,另一個(gè)是imager.gpg。選擇imagers,imagers文件夾里面的imager.gpg的文件了,保存一下看看效果。
在瀏覽器中這兩張圖片都完美的展現(xiàn)出來了。
最后來看一下相對路徑里面的。上級路徑使用的符號是點(diǎn)點(diǎn)杠。上級路徑又應(yīng)該怎么理解?也就是圖像文件是位于當(dāng)前這個(gè) hd ml文件的上一集。
在練習(xí)文件夾里新增一個(gè)名為 hd ml的文件夾,打開vs code,選擇剛剛新增的文件夾,選擇新建文件,這里需要新增一個(gè) hd ml文檔。在當(dāng)前 hd ml文檔中,如果想要調(diào)用上一級的 image 點(diǎn) j p g 的圖片應(yīng)該怎么做?在 sr c 屬性里面使用點(diǎn)點(diǎn)杠。
這里 vs code提供了上一集路徑中存在的文件,選擇 image 點(diǎn) j p g,在瀏覽器中看下效果,此時(shí)圖片也是正常顯示的。如果hd ml文件藏得更深一些,把當(dāng)前的文件復(fù)制一份,新增一個(gè)hd ml文件夾,將復(fù)制的文檔粘貼一下,打開剛剛復(fù)制的文檔,修改sr c屬性里面的值,使用點(diǎn)點(diǎn)杠。
此時(shí)是沒有找到 amage 點(diǎn) j p g 的文件,這個(gè)時(shí)候就需要重復(fù)剛剛的操作,點(diǎn)點(diǎn)杠就能找到需要到的 amage 點(diǎn) jbg 的文件了,保存一下看看效果。這里可以看到圖片還是正常顯示出來了。
本期視頻主要了解了相對路徑的三種分類,一個(gè)是同級路徑,一個(gè)是下級路徑,還有一個(gè)是上級路徑。希望小伙伴們下來可以好好練習(xí)一下,這對于后期的內(nèi)容非常重要。下期再來聊聊絕對路徑。本期的內(nèi)容到此結(jié)束,感謝觀看,下期再見。
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。