- From: Kang-Hao (Kenny) Lu <kanghaol@oupeng.com>
- Date: Fri, 25 Oct 2013 23:39:08 +0800
- To: John Hax <johnhax@gmail.com>
- CC: 一丝 <yiorsi@gmail.com>, Leo Deng <myst.dg@gmail.com>, W3C HTML5 中文興趣小組 <public-html-ig-zh@w3.org>
(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"? 如果是这样,那这跟我原先想的 1 不太一样,再来列一次,这次只管写的部分 了,加入读的部分产生的排列组合太多: 1) image.src 设值总是更新图片,完全不管 .srcset 的设值存在与否,也不 管 @src、@srcset 是什么。 2) image.src 设值在后面没有 .srcset 设值的情况总是更新图片,不管 @src、@srcset 是什么。 3) image.src 设值只更动 @src。 > 对于不用srcset的页面来说,1的方案不会有任何影响。 > 对于用srcset的html,但使用老的不支持srcset的库。库只修改src,固然一旦 > 修改src就失去了srcset作用,但至少功能能保持预想的方式。 > 最后,使用支持srcset的库。脚本要改变图片,只操作srcset,不操作src。 这里有个问题,照 1) 跟你说 “只操作srcset” 的逻辑,如果你用的库的情形是 HTML <img src=xxx srcset=xxx /> + 不支持 srcset 的 JS 库 1 设置了 .src + 支持 srcset 的 JS 库 2 设置了 .srcset 那这个时候 JS 库 2 会不起作用。支持 .srcset 的 JS 库的完整正确写法是 img.src = null;† img.srcset = 新值; ,要不就是赌不会连续用到两个改 .src/.srcset 的库(实际上这种情况的确很少)。 > @src是给不支持srcset的fallback。 这是一种想法。不过 Wikipedia 的做法是把 1x 的 .png 放到 @src 里,@srcset 没有 1x 的 .png: <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 的图像。 > 这里的要点是,html因为是静态的,需要同时写srcset和src,但是脚本不需要 > 同时写入。 是。但是比起 1) 提案要求的 if ('srcset' in img) img.srcset = newSrcSet; else img.src = newSrcFallback; 写法,2) 提案要求的 img.src = newSrcFallback; img.srcset = newSrcSet; 少了两行,虽然顺序要求的确有点坑。 > 注意1和2的差别是:方案1的img.src永远override > @srcset和@src,所以不存在优先级问题;方案2的src和srcset属性是和@src和 > @srcset对应的,就产生了优先级、顺序之类的问题。 别忘了方案 1) 也覆盖 .srcset 了。 > “我”是指开发者。我说的意思是,开发者不知道当前处于哪种状态。因为看 > src和srcset是不知道那是被覆盖的值还是默认的@attr的值,因此无法确定此刻 > 到底是什么优先级或顺序。也就是这个行为是只写的。这跟input的脏值标记不 > 一样,因为input不存在优先级问题,开发者是不需要知道是否处于脏值的。开 > 发者最多需要知道值是否改变,拿input.value比较input.defaultValue就可以 > 了。而img不行,开发者非常可能需要知道当前到底是src起作用,还是srcset起 > 作用。 为什么开发者需要知道当前到底是src起作用,还是srcset起作用?还有为什么 1) 的提案可以帮助开发者知道到底是src起作用还是srcset起作用?我看不是很懂这 一段,这一段好像跟 .src 的读取行为比较有关? †这部分有争议,不过为了避免把这个讨论弄得更乱,分下一篇吧。 以上 Kenny -- Web Specialist, Opera Sphinx Team, Oupeng Browser, Beijing Try Sphinx: http://sphinx.oupeng.com/
Received on Friday, 25 October 2013 15:40:10 UTC