- 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