坑爹的viewport

转载自:http://hax.iteye.com/blog/978184

 

最近我做了一点儿针对手机的Web开发和相关研究。按说,Web自设计之初,就已经考虑了设备无关性。然而,现实总是不尽如人意。 

我们知道大多数网页都是针对桌面显示器开发和测试的,但是手机屏幕通常要比桌面显示器小很多,比如iPhone也就是320px。那么那些网页在手机上如何浏览呢?

一种是把网页缩放到很小,你可以看到整个网页但是看不清字了;或者只看网页的一个局部,然后上下左右移动来看其他部分。现在的手机浏览器把两种模式结合使用。(或许还有第三种——分析网页,将其中内容抽取出来,重组,然后呈现,不过这里不讨论这种方式。)

如果仅仅是出现横向滚动条,那问题倒不是很大。对于那些采用固定布局的“像素级精确设计”确实就是如此。但是使用自适应布局的网页就有问题了。比如一个三栏布局,其中一个边栏可能只有20%宽度,320px的屏幕上只有60多像素,只能放5个汉字,排版不美观不要说,如果里面有一些图片,很可能图片的宽度都超过60像素,造成overflow,从而破坏了布局。另一种常见布局方式是采用固定大小的边栏,例如240px宽,而主体部分则自适应宽度。然而对于320px的屏幕来说,本来是次要的边栏占据了3/4空间,主要部分却只有1/4空间,另外也极有可能因为内容包含图片等造成overflow。

说到这里,那些喜欢固定布局的人(比如那些热衷于960px grid排版的同志们——哦,最近淘宝升级成1000并放弃了栅格!不过那仍然是固定布局)可能要乐了,你们倡导了半天流式布局,结果在mobile设备上表现反而很糟糕,真是费力不讨好。

真正掌握CSS的同志(是的,珍稀动物!)肯定会反驳。上面这些问题其实都很容易解决。比如设定min-width。还有,适应不同屏幕大小的“正确”的方案,应该用media
query。

问题是,大多数网页没有这么做!或者说不是按照“正确”的方式写的!未必是网页作者不懂CSS,而只是他们压根没费心考虑过手机大小的屏幕(毫不惭愧的说,本人也是其中一份子)。你可以试着把桌面浏览器收缩成320px宽(或者可以试着zoom
in到300%),可以看到不少网页会发生严重的布局错乱,至少也是浏览体验上的大幅下降。为了迎合这些网页,手机浏览器厂商发明了两个viewport

简单来说,就是手机浏览器把自己冒充为拥有一个更宽的屏幕,这样页面的布局就能跟桌面浏览器一样了。不同浏览器冒充的数值不一样:iPhone是神奇的980——960它表弟;Android是保守的800——冒充一个800*600的显示器;而Windows
Phone 7则是1024——冒充一个1024*768的显示器(充分体现微软的庸俗特质)。

原本布局就是按照viewport(桌面上的浏览器窗口)大小来进行的,现在决定布局的viewport和窗口分裂了,产生了两个viewport。

两个viewport其实并不新鲜。就像前面说的,所有做固定布局的同学其实都在不自觉使用两个viewport——固定布局,其实相当于人为设定了布局viewport。

使用独立的布局viewport还有一个好处,那就是缩放变得很简单,不用引起relayout。

在浏览器的历史上,主要有两种不同的缩放方式,一种是以IE6为代表的缩放(文字大小),实质是改变root元素的字体大小。另一种是像素缩放,实质是改变CSS
pixel的大小(即1个css像素不再对应1个物理像素),或者说改变了浏览器的内部DPI。(Firefox还支持真正的字体缩放,与改变root元素的字体大小不同,它会缩放所有元素的font-size最终使用的值(used
value),因此不仅对于以em设定的字体大小有效,对于以px和pt等所有单位设定的字体大小都有效。)

在桌面浏览器上,因为缩放时viewport的物理大小是固定的,如果进行像素缩放,实际就意味着viewport以CSS
pixel计算的宽度和高度会随之改变,比如若放大到200%,CSS宽高就会缩小到原来的50%。而这必然引起relayout。

相反,在mobile浏览器上,像素缩放时,布局viewport的物理大小可随之缩放,因此其CSS宽高值是不变的,就不必引起relayout。这不仅避免了relayout的大量计算,也更符合移动设备上的用户体验(考虑一下你如何缩放地图就明白了)。

虽然两个viewport能比较好的解决在手机上浏览过往网页的问题,然而,这毕竟是一个向后看的方案,体验毕竟是受限的。想象在320宽的窗口里看960固定布局的网页,不可避免的要时常缩放和使用横向滚动条。在触摸屏上我们可以用手势来控制,会方便一点,但是仍然很麻烦。所以绝大多数移动Web开发者最终还是选择针对小屏幕(重新)进行设计。

不过一个显然的问题是,如果我的网页已经考虑了小屏幕,甚至就是专门为手机设计的,那么我其实不需要两个viewport(也不需要缩放),这时候怎么办?更一般的问题是,如果我设计的网页不是针对960或者800或者1024的呢(至少你选了960,就排除了800和1024;你选了800,就排除了960和1024;你选了1024,就排除了800和960……)?

于是Apple发明了viewport的meta标签,例如:
<meta
name=”viewport” content=”width=320,
initial-scale=1.0, minimum-scale=1.0,
maximum-scale=1.0″>

其中width表示网页的布局layout宽度。initial-scale表示初始时的缩放比例,minimum-scale和maximum-scale分别表示最小和最大缩放比例。这样,上面这个meta就表示布局宽度320像素,初始缩放为1倍(即不缩放),且禁止用户缩放(因为最大最小缩放都为1倍)——一个专为iPhone优化的网页通常就会用这样的设置。

如果你是针对960设计的,那么可以用这样一个meta:
<meta name=”viewport”
content=”width=960, initial-scale=0.33″>

这表示布局宽度为960像素,初始缩放为0.33,也就是,会缩小到大约1/3,这样正好可以在320像素的宽度里看到整个网页。你也可以不设initial-scale,因为手机浏览器大多默认会初始缩放到可容纳整个网页宽度。

嗯,看上去不错吧。

可是,说到底,手机浏览器的这种设计,实际上揭示了一个难堪的真相——你们这些网页仔,其实从来没真正做好过屏幕适应。因为一个能自动完美适应不同屏幕大小的“正确”方案,width的取值就不应该是一个固定数字。幸好,safari的工程师在发明viewport时还是给我们留了点面子,width的取值除了像320或960这样的数字,也可以是关键字device-width(其实我认为更合适的词是auto),表示采用设备宽度。

然而,历史总是杯具的重复自己。微软就又(嗯,我为什么要说“又”呢?)贡献了这样一个例子:Window Phone
7的设备宽度通常至少是480,那么按理说,如果viewport中设置了width=device-width,layout宽度应该是480像素,可是IE mobile会将viewport设为320!这是神马原因呢?

原来据说微软收集的数据表明,有大量站点使用了device-width,但是其实只为320像素宽(也就是iPhone的宽度)优化——比如直接用一个固定宽度320px的<div>将内容wrap起来!我勒个去,诸位移动Web开发者,你们有木有这么干?有木有!

那后面的故事就不用说了。微软当然是做出了一个“正确”的选择。

另外需要注意的是,width只是设置layout宽度,还要乘上缩放比例,才能得到最终的显示宽度。那么对于480像素的屏幕来说,若device-width“被320”,那initial-scale应该是1.5才能占满整个屏幕宽度。可是如前所述,针对性优化的网页会把initial-scale设成1.0!

对此微软是如何处理的呢?文档语焉不详,而其模拟器要在Windows
7上才能运行,所以我也暂时没有进行实测,不过据我推测,其initial-scale应该仍旧会保持1.0,也就是这1.5会变成额外的缩放因子。实际上其他移动浏览器已经这样做了,比如Fennec(Firefox的移动版)就是如此。Android和iPhone
4也都有类似的设计,为什么会这样?这样会不会产生新问题?留待下一篇博客再讨论。

关于判断ie版本的一段js代码


ie = (function() {
var v = 3, div = document.createElement('div'), a = div.all || [];
while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]);
return v > 4 ? v : !v;
}());

这个不同于其他用ua判断浏览器版本的方法。
div.all
all方法只有ie支持。
再利用注释的兼容性方法来判断当前是哪款ie浏览器。

js复制内容到剪贴板功能

$(document).ready(function(){
$(“#btn_copy”).click(function(){
$(“#TextArea1”).select();
copyValue(“TextArea1”);
})
})
//复制功能
function copyValue(txtid) {
if (isIE()) {
clipboardData.setData(“Text”, document.getElementById(txtid).value);
alert(“您已成功复制了CDKEY!”);
}
else {
prompt(“您的浏览器不支持自动复制,请您手动复制对话框中的内容:”,document.getElementById(txtid).value);
}
}
function isIE(number) {
if (typeof (number) != number) {
return !!document.all;
}
}

【转】网站默认图标shortcut icon和icon的区别

<link rel="shortcut icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon"><
link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">

建议包含上面两行HTML代码,可以支持ico格式的图标

然而,只有第一行是必须的,因为“shortcut icon”字符串将被多数遵守标准的浏览器识别为列出可能的关键词(“shortcut”将被忽略,而仅适用“icon”);而Internet Explorer将会把它作为一个单独的名称(“shortcut icon”)。这样做的结果是所有浏览器都可以理解此代码。只有当希望为新浏览器提供另一种备用图像(例如动画GIF)时,才有必要添加第二行。

在HTML中,link元件必须在head元件里(在<head>和</head>之间)。

对于XHTML,link必须使用“ />”结束(或“></link>”),而不可以使用“>”结束。

href可以,但不必,指向/favicon.ico的位置。它可以指向任何URL。

图像通常可以使用任何被浏览器支持的图像格式。

.ico文件格式通常可以被所有可以显示favicon的浏览器读取。

设置服务器,以发送正确的MIME标识:
ICO 文件 image/vnd.microsoft.icon(或者亦可出于兼容性原因使用image/x-icon。然而最好使用IANA注册的MIME类型,因为多数主流浏览器现在支持它)
GIF 文件 image/gif
PNG 文件 image/png

使用适当的分辨率和色深。
ICO:包括多种分辨率(最常使用的是16×16和32×32,Mac OS X有时使用64×64和128×128)以及位深(比特每像素)(多数使用4、8、24 bpp,即16、256和1600万色)。
GIF: 使用16×16,256色。
PNG: 使用16×16,256色或24位。

注意:当favicon.ico被置于文档根目录时,将会被一些不处理link元件的浏览器找到,即使没有您的站点上没有指向它的链接。

标准化

Favicon 功能最早由微软创设,而微软公司的Internet Explorer网页浏览器会对每一个网站都请求favicon。微软支持的link标签不遵从World Wide Web Consortium(W3C,万维网联盟)的HTML建议[1],因为:

rel属性必须包含一个用空格作分隔符的link类型的列表,所以一个包含两词的link类型不能被遵守标准的浏览器理解。
“.ico”文件类型(一种用于Microsoft Windows上图标的光栅格式)没有一个注册的MIME类型,而且似乎在当时也不能被多数浏览器理解。然而2003年,这一格式在IANA获得注册,其 MIME类型是image/vnd.microsoft.icon,进而消除了此问题的第一部分。
在网站上使用保留地址(reserved location)与Architecture of the World Wide Web(互联网的结构)矛盾,同时被认为是link squatting(链接劫持)或URI squatting(URI劫持)。

Mozilla 浏览器通过一种遵从Web标准的方法添加了对favicon的支持。它采用rel=”icon”并允许网络设计人员添加任何支持的图像格式的 favicon。例如<link rel=”icon” type=”image/png” href=”/path/image.png”>。后来鉴于此功能将被用于所有新内容,多数浏览器都对此功能增加了支持。

关于div遮盖flash的问题总结

首先说ff和chrom,这两个浏览器实际上是可以根据正常逻辑解决遮盖问题,所以一般来说正常操作就好。

兼容上主要是ie产生的问题。当flash的wmode属性为Transparent 问题并不是很大,一般逻辑仍然能解决。

但是如果你引用的flash没写参数,或者参数不是Transparent的时候,ie就会认为flash在最上面。

ps:一些flash的wmode必须使用window属性,以保证输入法和flash的速度。

解决方法:

iframe>flash一句话解决问题。

只要在flash和div中间再加一个iframe就可以解决覆盖的问题。

但是有个问题需要注意,iframe遮在flash上面的效果是,iframe与flash交叉的部分会透明掉。

也就是说你的div必须是个矩形,如果是个不规则图形,flash上会有透明的地方。

情况就是这样,希望对你有帮助。

HTML5 Pack for Dreamweaver CS5——HTML5开发工具

下载地址:http://www.xyhtml5.com/html5-development-tools.html

出了5.5这个补丁不建议再用,会影响自动排版的规则!

Dreamweaver CS5和HTML5 Pack

安装 HTML5 Pack 之后,可以在 Dreamweaver CS5 中使用以下特性和支持:

HTML5 代码提示

HTML5 代码提示与 Dreamweaver 中的其他代码提示相似。在 Code 视图中,开始输入感兴趣的标记,Dreamweaver 会提供代码提示。

除了提示新的 HTML5 标记之外,Dreamweaver 还为现有标记提供新属性和值代码提示(例如,input 标记的新属性和值)。

CSS3 支持和代码提示

除了 HTML5 代码提示之外,HTML5 Pack 还在 Dreamweaver CS5 中添加 CSS3 代码提示。新的代码提示并不支持每个 CSS3 选择器和属性,而是只支持 W3C 规范中当前完成的选择器和属性。

另外,这个扩展包含对 –moz、-webkit 和 -o CSS 属性的基本支持。

多屏幕预览和媒体查询支持

Multiscreen Preview (File > Multiscreen Preview) 可以按三种不同的屏幕大小预览正在编辑的页面:手机大小、书写板大小和桌面。

预览所用的手机、书写板和桌面尺寸设置为默认大小,但是可以通过单击 Multiscreen Preview 面板中的 Viewport Sizes 按钮方便地调整这些大小。

确定目标设备的尺寸之后,可以通过在 HTML 页面中添加媒体查询为不同大小的设备指定不同的样式。通过单击 Multiscreen Preview 对话框中的 Add Media Queries 按钮添加媒体查询。通过图形化界面添加和读取媒体查询的功能是对 Dreamweaver CS5 的重大改进。通过使用不同的媒体查询,可以让页面在手机、书写板设备和标准桌面浏览器中显示不同的外观。

Live 视图中的 video audio 标记支持

video 和 audio 标记是新的 HTML5 标记,可以用它们在浏览器中直接播放视频和音频文件,而不需要外部插件或播放器。从本质上说,有了 HTML5,浏览器就变成了播放器。这个功能需要安装 QuickTime。

Webkit(Live 视图的显示引擎)已经更新了,如果有适当的标记,就可以在 Live 视图中播放视频和音频。另外,Live 视图中会显示一些(并非所有)CSS3 属性。

HTML5 初学者布局

这个扩展安装两个使用 HTML5 语法的新布局,让开发人员更容易开始使用 HTML5 布局。

可以通过 New Document 对话框 (File > New) 使用这些布局和其他 CSS 布局。

Design 视图中更好的显示

在过去,当 Dreamweaver 无法识别某个标记时,会简单地忽略它,这导致 Design 视图无法准确地反映设计的最终效果。对于 HTML5 标记,Design 视图已经改进了,它会留出相关内容占据的区域,让您能够更好地了解此内容如何影响页面布局的其余部分。

IE6,IE7下图片缩放失真解决方法

  1. 通过加载微软urn:schemas-microsoft-com:vml命名空间中的VML技术来实现失真的处理,看下面代码。
  2. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
  3. <!–[if IE 6]>
  4. <html xmlns=”http://www.w3.org/1999/xhtml” xmlns:v=”urn:schemas-microsoft-com:vml”>
  5. <![endif]–>
  6. <htmlxmlns=”http://www.w3.org/1999/xhtml”>
  7. <metahttp-equiv=”Content-Type”content=”text/html; charset=utf-8″/>
  8. <head>
  9. <title>VML</title>
  10. <!–[if IE 6]>
  11. <style type=”text/css”>
  12. .vml{ behavior: url(#default#VML);}
  13. .iefix {display:none!important;}
  14. </style>
  15. <![endif]–>
  16. <styletype=”text/css”>
  17. img.iefix {-ms-interpolation-mode: bicubic;}
  18. </style>
  19. </head>
  20. <body>
  21. <!–[if IE 6]>
  22. <v:image src=”1.jpg” class=”vml” style=”width:500px;height:400px;display:block” />
  23. <![endif]–>
  24. <imgsrc=”1.jpg”class=”iefix”style=”width:500px;height:400px;display:block”/>
  25. </body>
  26. </html>

关于IE中弹出框内文本焦点问题

直接使用$.focus()在ie中往往不好用,根本不知道光标定位到哪里去了,当前遇到的弹出框是用ajax读取出来的,同事给了一个解决方案,解决了。

今天有人问我,我又给忘了,在这里记录一下。

focusSta = obj . focusSta ? parseInt(obj.focusSta) : 0;

if(focusSta === 1){

var item = document.getElementById(‘commentContent_’+uniqueId);

if(item){

if($.browser.msie){

item.value = “&nbsp”;

item.focus();

item.value = ”;

item.select();

}else{

item.focus();

}

}

}

为什么这么写我是说不清,知道的跟一下帖子…