Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RETINA时代的前端优化
Search
sokamal
November 18, 2013
Programming
190
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RETINA时代的前端优化
RETINA屏幕的图片及图标处理
sokamal
November 18, 2013
More Decks by sokamal
See All by sokamal
亚马逊的快速菜单
ikamal
1
120
jQuery最佳实践
ikamal
1
110
Less_css_介绍.pdf
ikamal
1
72
Other Decks in Programming
See All in Programming
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.8k
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
200
「人を評価する AI」の設計と実装
ryoyanara
0
230
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
110
Android CLI
fornewid
0
230
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
120
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
160
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
100
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
600
Dockerfile CMD for Node.js
grazie1999
0
120
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.5k
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
Practical Orchestrator
shlominoach
191
12k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Making Projects Easy
brettharned
120
6.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Thoughts on Productivity
jonyablonski
76
5.3k
Technical Leadership for Architectural Decision Making
baasie
3
520
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Balancing Empowerment & Direction
lara
6
1.2k
Crafting Experiences
bethany
1
260
Transcript
RETINA时代的前端优化 ECD kamalyu
一,什么是Retina? “Retina”“视网膜屏”是苹果为最新的双密度的屏 幕起的名字, 其他厂商也有类似的屏幕,只是不叫这个名字。 最新的iPhone,iPad,MacBook Pro等设备用的 就是这类屏幕。
二,Retina屏幕带来了什么问题? MacBook Pro with Retina Display 显卡渲染出2880x1800个像素,其中每四个像素一组,输出原来屏幕的一个像素 显示的大小区域内的图像 用户所看到的图标与文字的大小与原来的1440x900分辨率显示屏相同,但精细度 是原来的4倍…由四个像素代替原来一个像素。
三,这个问题会影响哪些地方? 1,Favicon 2,Web Clip 3,图片 4,图标
四,怎样解决这个问题? 将原来的文件增大为原来的4倍(宽高都X2)
五,目前的几种解决方案 5.1,Favicon 默认图标是16x16,Retina屏幕需要32x32像素或者更大的。 对于IE6-10,用经典的32x32像素 ico格式图标放到网站根目录;其他浏览器可以 使用更大的比如96x96的png图标; <link rel="icon" href="path/to/favicon.png"> Favicon
的兼容问题:http://www.w3cplus.com/css/understand-the-favicon.html
5.2,Web Clip 指定几种分辨率的图片即可 <link rel="apple-touch-icon" href="touch-icon-iphone.png" /> <link rel="apple-touch-icon" sizes="72x72"
href="touch-icon-ipad.png" /> <link rel="apple-touch-icon" sizes="114x114" href="touch-icon-iphone-retina.png" /> <link rel="apple-touch-icon" sizes="144x144" href="touch-icon-ipad-retina.png" /> 生成几种分辨率图标的解决方案 http://css-tricks.com/video-screencasts/122-the-state-of-favicons/ http://msdn.microsoft.com/en-us/library/ie/gg491740%28v=vs.85%29.aspx Web Clip https://developer.apple. com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplic ations/ConfiguringWebApplications.html
5.3, 图片 5.3.1 使用两倍大的图片 <img src="my200x200image.jpg" width="100" height="100"> 这样处理最简单,也不用维护两套图片, 但是会让所有浏览器都加载大图片,
加载速度会受影响,移动网络流量也较大。
5.3.2 用 Javascript 替换图片 Retina屏幕用 Javascript 替换成大图,默认使用普通图片 <img src="low-res.png" data-src-retina="high-res.png"
alt=""> var isRetina = (window.retina || window.devicePixelRatio > 1); if(isRetina){ $('[data-src-retina]').each(function(){ $(this).attr('src',$(this).attr('data-src-retina')); }) } // 代码用到了jQuery 这样做需要维护两套图片, 普通屏幕和以前一样,加载默认图片;Retina屏幕会先加载普通图片,然后再 加载一次大图,这里只考虑了屏幕情况,也是没有考 虑移动网络。
5.3.3 服务器端方案 网页顶部用脚本取得屏幕情况,保存到 cookies <script>document.cookie='resolution='+Math.max(screen.width,screen.height)+("devicePixelRatio" in window ? ","+devicePixelRatio :
",1")+'; path=/';</script> 服务器端设置rewrite 规则,判断cookies & 服务器端图片是否存在决定返回普通 图片还是@2x图片。 RewriteCond %{REQUEST_URI} ^/assets/images #RewriteCond %{REQUEST_URI} !^/assets/images/excluded RewriteCond %{HTTP_COOKIE} resolution=([^;,]+),2 RewriteCond %{REQUEST_URI} !@2x\.(jpe?g|gif|png)$ RewriteCond %{DOCUMENT_ROOT}/$1@2x.$2 -f RewriteRule ([^.]+)\.(jpe?g|gif|png)$ $1@2x.$2 这种方法前端处理简单,只需要指定图片宽或高就可以了,判断工作全部交 给服务器,缺点是也需要维 护两套图片,判断了屏幕情况,没有考 虑移动网络。
5.3.4 未来的更好方案 最新版的webkit实现了一个新的特性 srcset属性 <img src="low-res.png" srcset="high-res.png 2x"> 普通屏幕效果 rMBP效果
srcset可以指定多个文件地址, 浏览器会根据屏幕 dpi,网络情况,加载合适的图片来显示,缺点只有一 个,目前只有webkit的nightly版本支持。 http://nightly.webkit.org/
以上几种方法对比
5.4, 图标 5.4.1 sprite图片 .content a.fav-link { background: url(sprite.png) no-repeat
0 -100px; } @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) { span.location, span.success, a.delete, .content a.fav-link { /* Reference the @2x Sprite */ background-image: url(
[email protected]
); /* Translate the @2x sprite's dimensions back to 1x */ background-size: 200px 200px; } } 放大版的雪碧图设置尺寸为正常版本的大小。 要注意每个图标的位置都要一一对应。
5.4.1 sprite图片 优点是兼容旧代码,用来支持Retina屏的新图标不会影响旧样式。 缺点很明显,要多维护一套图标,还要保证每个图标都对齐(这时有网格对齐的雪 碧图优点就突出了),雪碧图一般不会太大,对流量的影响基本可以不考虑。
5.4.2 icon font
5.4.2 icon font 优点,清晰锐利,可以设置不同颜 色,放大后不会失真,兼容性较好。 缺点,只能是单色图标。根据实践, ie8中会有锯齿,目前还没有较好的 解决方法。
RETINA时代的前端优化 Thank you ECD kamalyu