弄个表格更清楚:
@src=a @srcset=b 2x c 1x .src = d .srcset = e 2x f 1x 对应: 1x 2x @src a(1) none(1) @srcset c(5) b(5) .src d(?) none(?) .srcset f(?) e(?) 括号里是优先级。 2013/10/27 John Hax <john...@gmail.com> > > > > 2013/10/25 Kang-Hao (Kenny) Lu <kangh...@oupeng.com> > >> (2013/10/25 21:52), John Hax wrote: >> >> > 1的方法是把img.src明确为最终显示的图片,也就是排除了同时设置srcset/src >> > 的case。也就是说如果手动设置了src,就覆盖了srcset的设置。 >> >> 如果我没弄错你的意思。你的意思是在这个方法中 >> >> img.src = "picture-1.png"; >> img.srcset = "picture-2.png 2x"; >> >> 在 window.devicePixelRatio = 2 的浏览器里,因为 .src 覆盖了 .srcset 的设 >> 置,所以显示的图片是 "picture-1.png"? >> > > > 正是如此。但如果遵循我所赞同的方案,在实际开发中是这样写的: > > if ('srcset' in img) img.srcset = 'pic2.png 2x, pic1.png 1x' > else img.src = 'pic1.png' > > 所以不会出现在支持srcset的ratio为2的浏览器里显示pic1的问题。 > > > >> > 最后,使用支持srcset的库。脚本要改变图片,只操作srcset,不操作src。 >> >> 这里有个问题,照 1) 跟你说 “只操作srcset” 的逻辑,如果你用的库的情形是 >> >> HTML <img src=xxx srcset=xxx /> >> + 不支持 srcset 的 JS 库 1 设置了 .src >> + 支持 srcset 的 JS 库 2 设置了 .srcset >> >> 那这个时候 JS 库 2 会不起作用。支持 .srcset 的 JS 库的完整正确写法是 >> > > > 正是如此。这里的想法是,虽然srcset不起作用了,但是至少功能是可用的,无非是退化到只有src的情况。但反过来的情况就未必能接受了,因为它导致原本可以用的功能失效了(改变.src,图片却不变)。 > > >> >> img.src = null;† >> img.srcset = 新值; >> > >> ,要不就是赌不会连续用到两个改 .src/.srcset 的库(实际上这种情况的确很少)。 >> > > 不是赌,而是实际开发中应该不会出现这样的情况——对同一张图片同时用改.src的老的库和改.srcset的新的库。 > > 我认为实际上容易出现的情形是: > 1. 内容进化到了用@srcset,但库还是老的 > 2. 从老的库(用img.src)转换到新的库(用img.srcset) > > >> >> > @src是给不支持srcset的fallback。 >> >> 这是一种想法。不过 Wikipedia 的做法是把 1x 的 .png 放到 @src 里,@srcset >> 没有 1x 的 .png: >> > > 的确现在是可以这样的。老实说我认为这是个不好的做法。我其实认为规范应该改为有@srcset时只用@srcset而忽略@src。这样其实理解起来更简单。 > >> >> <img src="picture.png" srcset="picture-HD.png 2x" /> >> >> 不是 “不支持 @srcset 的 fallback”。fallback 的思维的写法应该是: >> >> <img src="picture.png" srcset="picture.png,picture-HD.png 2x" /> > > >> > 表面上看,这也有同样问题,脚本如果要改变fallback的值,需要 >> > setAttribute('src', value)。但是实际上是不需要设fallback的,而是写成这 >> > 样 if ('srcset' in img) img.srcset = newSrcSet; else img.src = >> > newSrcFallback 就可以了。注意这代码即使对现在的srcset实现也是对的。 >> >> 如果 newSrcSet 是 "picture-HD.png 2x" 而不是 "picture.png,picture- >> HD.png 2x",那就是错的,因为没有设置到 1px 的图像。 >> > > 确实。但是在实际当中,这不成为问题。反过来说,我想像不到有只改变2x 3x .5x的图片而不改变1x图片的需求啊。 > > >> > 这里的要点是,html因为是静态的,需要同时写srcset和src,但是脚本不需要 >> > 同时写入。 >> >> 是。但是比起 1) 提案要求的 >> >> if ('srcset' in img) >> img.srcset = newSrcSet; >> else >> img.src = newSrcFallback; >> >> 写法,2) 提案要求的 >> >> img.src = newSrcFallback; >> img.srcset = newSrcSet; >> >> 少了两行,虽然顺序要求的确有点坑。 >> > > > 代码多少不是问题。能否理解才是问题。@src和@srcset是并存关系,img.src和img.srcset却是互相覆盖的关系,怎么看都是一件奇怪的事情。 > > >> >> > 注意1和2的差别是:方案1的img.src永远override >> > @srcset和@src,所以不存在优先级问题;方案2的src和srcset属性是和@src和 >> > @srcset对应的,就产生了优先级、顺序之类的问题。 >> >> 别忘了方案 1) 也覆盖 .srcset 了。 >> > > 但是顺序是单一的: > > src > srcset > @srcset > @src > > 而方案2的顺序如何理解呢?困难得多啊。 > > >