2011年1月18日

推荐两个firefox插件:LiveHTTPHeaders抓包;RefControl插件构造referrer值,附其它经典插件

使用LiveHTTPHeaders插件获取referrer参数值

先安装一个firefox抓包插件LiveHTTPHeaders(http://livehttpheaders.mozdev.org/installation.html

LiveHTTPHeaders可以抓取http,https的数据链接,包括get和post,一个很不错的插件。安装好插件后,重启 FireFox,打开下载页面,运行LiveHTTPHeaders抓包(工具->Live HTTP Headers),然后再点击下载,不一会,包就抓好了。

突破防盗链方法有很多,可以用asp、PHP、vbs或使用改包NC提交都可以。这里介绍的是一种比较简便的方法,使用Firefox自定义 referer插件来突破。首先我们应该先抓包,看看下载时的referrer参数值是什么。

==========================]

使用RefControl插件构造referrer值

接着到http://www.blogjava.net/baicker/archive/2008/04/08/191485.html安装Firefox自定义referer插件RefControl,同样安装好之后,重启Firefox,运行RefControl,单击"添加站点"按钮,在站点中输入

为每个网站定制送出的 HTTP Referer。

你先建立一个网站列表,定制的 Referer 可以被发送到其中每个网站。你可以选择无条件或者只在第三方请求时发送此 Referer。此外,你还可以指定处理列表以外网站的默认行为。

[要是上次找到这个插件就好了,省得我一遍一遍地用nc修改referer提交
很多防盗链和防本地提交是依靠用户浏览器自动提交数据中的referer字段判断的,用这个插件就能突破了。
如果是用flashget下载的话,firefox的about:config中有个flashgot.fakeReferrer字段(应该是装了 firefox的flashgot插件才有的),字面判断也是这个作用(未测试)]

-----------------------其它插件:-------------------------------

1、抓包利器 httpWatch 开始支持FireFox

2、FireBug

  
Firebug是firefox下的一个插件,能够调试所有网站语言,如Html,Css等,但FireBug最吸引我的就是javascript调试功能,使用起来非常方便,而且在各种浏览器下都能使用(IE,Firefox,Opera, Safari),简直难以置信。除此之外,其他功能还很强大。比如html,css,dom的察看与调试,网站整体分析等等。总之就是一整套完整而强大的 WEB开发工具。做的太牛了。再有就是开源的,前途不可限量阿。
  Firebug官网:http://getfirebug.com/
  在javascript中支持断点调试,在css的查看中对属性值更改会马上看到效果(也算是对css的调试吧),而且可以方便的看到是哪个css,功能是强大的没的说!在控制台还会像终端一样的输出运行的异步请求啊,哪个地方解析的时候出错了,开启方便,在开启以后可以用直接打开编辑器编辑对应的文件。
  总体的印象是简约而不简单!十分适合编程人员使用!

破解图片防盗链有绝招

现在各大网站的软件不但使用盗链措施,而且图片也防止别人引用。新浪博客、网易相册、百度空间都是这样。
转引别人的文章还得把图片先下载下来再传到自己空间里,然后再插入到日志里,真累死人!况且当自己的空间太小,放不了这么多图片怎么办?
另外当别人用在他自己网站上的破解代码失效时,你所引用的图片就告不能显示,全是叉叉,哈哈,干瞪眼去吧你!
下面的这段代码可破解这种图片盗链,可以说能从根本上进行破解!因为破解代码就在你的网站根目录,其中奥妙就不用我说了吧?
将下面代码另存为 ytu.asp 存放到你的网站根目录。

2011年1月5日

CSS3&HTML5各浏览器支持情况一览表

CSS3&HTML5各浏览器支持情况一览表

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=707

CSS3性质(CSS3 Properties)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
RGBA Y Y Y Y Y Y Y Y Y Y N N N
HSLA Y Y Y Y Y Y Y Y Y Y N N N
Multiple Backgrounds Y Y N Y Y Y N N Y Y N N N
Border Image Y Y N Y Y Y N N Y Y N N N
Border Radius Y Y N Y Y Y Y N Y Y N N N
Box Shadow Y Y N Y Y Y N N Y Y N N N
Opacity Y Y Y Y Y Y Y Y Y Y N N N
CSS Animations Y N N Y Y N N N N Y N N N
CSS Columns Y Y N Y Y Y Y N N Y N N N
CSS Gradients Y Y N Y Y Y N N N Y N N N
CSS Reflections Y N N Y Y N N N N Y N N N
CSS Transforms Y Y N Y Y Y N N Y Y N N N
CSS Transforms 3D Y N N Y Y N N N N Y N N N
CSS Transitions Y N N Y Y N N N Y Y N N N
CSS FontFace Y Y Y Y Y Y N Y Y Y Y Y Y

CSS3选择器(CSS3 Selectors)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
CSS3: Begins with Y Y Y Y Y Y Y Y Y Y N Y Y
CSS3: Ends with Y Y Y Y Y Y Y Y Y Y N Y Y
CSS3: Matches Y Y Y Y Y Y Y Y Y Y N Y Y
CSS3: Root Y Y Y Y Y Y Y Y Y Y N N N
CSS3: nth-child Y Y Y Y Y Y N Y Y Y N N N
CSS3: nth-last-child Y Y Y Y Y Y N Y Y Y N N N
CSS3: nth-of-type Y Y Y Y Y Y N Y Y Y N N N
CSS3: nth-last-of-type Y Y Y Y Y Y N Y Y Y N N N
CSS3: last-child Y Y Y Y Y Y Y Y Y Y N N N
CSS3: first-of-type Y Y Y Y Y Y N Y Y Y N N N
CSS3: last-of-type Y Y Y Y Y Y N Y Y Y N N N
CSS3: only-child Y Y Y Y Y Y Y Y Y Y N N N
CSS3: only-of-type Y Y Y Y Y Y N Y Y Y N N N
CSS3: empty Y Y Y Y Y Y Y Y Y Y N N N
CSS3: target Y Y Y Y Y Y Y Y Y Y N N N
CSS3: enabled Y Y Y Y Y Y Y Y Y Y N N N
CSS3: disabled Y Y Y Y Y Y Y Y Y Y N N N
CSS3: checked Y Y N Y Y Y Y N Y Y N N N
CSS3: not Y Y Y Y Y Y Y Y Y Y N N N
CSS3: General Sibling Y Y Y Y Y Y Y Y Y Y N Y Y

HTML5 web应用(HTML5 Web Applications)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Local Storage Y Y N Y Y Y N N Y Y N N Y
Session Storage N Y N Y N Y Y N Y Y N N Y
Post Message Y Y Y Y Y Y Y Y Y Y N N N
Offline Applications Y Y N Y N Y Y N N Y N N N
Workers Y Y N Y Y Y N N N Y N N N
Query Selector Y Y Y Y Y Y N Y Y Y N N N
Web Database Y N N Y Y N N N Y Y N N N
GeoLocation N Y N N N Y N N N N N N N

HTML5嵌入内容(HTML5 Embedded Content)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Canvas Y Y Y Y Y Y Y Y Y Y N N N
Canvas Text Y Y N Y Y Y N N Y Y N N N
Audio Y Y N Y Y Y N N Y Y N N N
Video Y Y N Y Y Y N N Y Y N N N

HTML5音频编码(HTML5 Audio Codecs)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Audio: ogg Y Y N Y Y Y N N Y N N N N
Audio: mp3 N N N N N N N N N Y N N N
Audio: wav N Y N Y N Y N N Y Y N N N
Audio: AAC Y N N N Y N N N Y N N N N

HTML5视频编码(HTML5 Video Codecs)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Video: ogg Y Y N Y Y Y N N Y N N N N
Video: H.264 N N N N N N N N N N N N N

HTML5表单输入框(HTML5 Forms Inputs)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Form: Search Y N N Y Y N N N N Y N N N
Form: Phone Y N N Y Y N N N N Y N N N
Form: URL Y N Y Y Y N N Y Y Y N N N
Form: Email Y N Y Y Y N N Y Y Y N N N
Form: DateTime Y N Y N N N N Y Y N N N N
Form: Date Y N Y N N N N Y Y N N N N
Form: Month Y N Y N N N N Y Y N N N N
Form: Week Y N Y N N N N Y Y N N N N
Form: Time Y N Y N N N N Y Y N N N N
Form: LocalTime Y N Y N N N N Y Y N N N N
Form: Number Y N Y Y Y N N Y Y Y N N N
Form: Range Y N Y Y Y N N Y Y Y N N N
Form: Colour Y N N N Y N N N N N N N N

HTML5表单属性(HTML5 Forms Attributes)

平台 MAC WIN
浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE
版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8
Form: Autocomplete N N Y N N N N Y Y N N N N
Form: Autofocus Y N Y Y Y N N Y Y Y N N N
Form: List N N Y N N N N Y Y N N N N
Form: Placeholder Y N N Y Y N N N N Y N N N
Form: Min Y N Y N Y N N Y Y N N N N
Form: Max Y N Y N Y N N Y Y N N N N
Form: Multiple Y Y N Y Y Y N N N Y N N N
Form: Pattern Y N Y N Y N N Y Y N N N N
Form: Required Y N Y N Y N N Y Y N N N N
Form: Step Y N Y N N N N Y Y N N N N

本文数据由http://findmebyip.com/提供。

如果您发现文章中有表述不准确或是有相关问题需要交流可以通过评论或是去这里进行提问交流。
原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=707



HTML CSS列表元素ul,ol,dl的研究与应用

HTML CSS列表元素ul,ol,dl的研究与应用

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=489

一、可以看做废话的前言
HTML列表元素(如ol,ul,dl)等在现下的网站开发制作中有着非常广泛的应用,然而,它们的在不同浏览器下的脾气却不一样。本文就是分析这些列表元素的基本特性,在不同浏览器下的各类兼容性问题,以及介绍一些常见的应用等。

对初学者或是有一定CSS方面经验的同行们应该会有帮助的。

二、HTML中可用的列表元素
1、无序列表:ul
无序列表是最常使用的列表,下图显示了无序列表在不同浏览器下的显示:
不同浏览器下无序列表的表现

demo页面

正如上面显示的,无序列表在不同浏览器下的默认设置是由些许差异的。当然,在如今实际的网站项目上是很少看到没有任何修饰的无序列表了。其中原因之一就是CSS的重置(css reset),已经将无序列表默认的列表项目符号,margin或padding都去掉了。

无序列表的一些特定的css属性有list-style-type,list-style-position,和list-style-image。这些属性设置了列表项目符号的类型,标记的位置,以及使用图片代替标记。这三个属性可以使用list-style进行合并缩写。

list-style-type属性可以设置为一些不同的值,下面图表展示的就是部分值的页面效果:
list-style-type不同值的表现

依赖于用户的浏览器及操作系统,某些list-style-item值可能不能正确显示,通常默认为十进制数值,用无需列表实现递增数值是不推荐的,因为这样“无序列表”其本身的语义已经不复存在了。

list-style-position针对于列表标记的位置,可以被设置为outside(默认)或是inside。如果list-style-image被设置的话,其也会影响图片的位置。

list-style-image属性可以给无序列表一个自定义的独一无二的表现,不幸的是,在IE下使用此方法添加项目编号是bug多多,故很少被使用。一个更好的解决方法是添加background image到列表的li元素上,并相应的调整background image的位置,并设置为no-repeat。在maxdesign.com上,已经通过分步讲解演示了这个方法,而且在所有的浏览器下都工作良好。

2、有序列表:ol
有序列表在当列表项目的每个列表项目前面需要一个递增值的时候使用(例如1,2,3等)。有序列表的列表类型list-style-type可以被设置为任何在无序列表下可以设置的值。在大部分情况下,有序列表要么前面是个递增数值,要么前面没有任何标记。不建议使用有序列表实现类似于无序列表的表现。因为这样,有序列表本身的语义已经不正确了。
有序列表使用的实例截图

3、定义列表:dl
定义列表用来标记已经定义的列表项,它们包括定义标题(dt)以及定义本身(dd)。定义列表项目没有必要完全匹配,下面的代码在严格的XHTML下是完全合法的:

<dl>
<dt>无线音乐咪咕汇 </dt>
<dt>哥本哈根会议</dt>
<dd>《十月围城》</dd>
</dl>

这样,您可以在单个dd下面使用多个dt,也可以在单个dt下面使用多个dd。

定义列表的视觉显示,默认情况下,各个浏览器的显示几乎是一致的,如下图所示:
dl定义列表在Firefox下的显示

demo页面

上图对应的HTML代码如下:

 <dl> <dt>标题 </dt> <dd>这里是定义的内容 </dd> </dl><br /> <dl><br />     <dt>热门电影 </dt><br />     <dd>十月围城 </dd> <dd>刺陵 </dd> <dd>三枪拍案惊奇 </dd> <dd>阿凡达 </dd><br /> </dl><br /> <dl><br />     <dt>热点关注 </dt><br />     <dd>股市 </dd> <dd>房价 </dd> <dd>元旦 </dd> <dd>曹操墓 </dd><br /> </dl><br />

4、过时淘汰的列表:menu&dir
<menu>和<dir>元素,从技术上说,也可以称为“HTML列表”,但它们在XHTML中已过时淘汰了,所以这里不详细讨论它们。

5、HTML5中的列表
在HTML中,无序列表基本上保持不变,虽然似乎现在它被简称为“列表”,新的

ol元素有轻微的改变,它获得了两个新属性:reversed,这是一个布尔值,用来表示列表是上升还是下降;start,这是个整数,用以宣告有序列表的起点。

此外,<figure>和<details>元素将被增加,它们会有子元素,其中包括<dt>和<dd>元素。

更多关于HTML5方面的知识可以参见淘宝空雁 揭秘HTML5和CSS3【珍珠奶茶帮】的这篇文章。另外您还可以点击这里查看在线的ppt。

三、浏览器差异
下面展示的都是一些比较常见的且明显的浏览器差异。

1、列表元素添加display:block后
在Internet Explorer 8, Opera 9, Chrome, Firefox 2 & 3, and Safari下,添加display:block会让有序或无序列表中li元素的项目编号消失。
display:block让Firefox3下列表符号消失

但在IE6和IE7下,添加display:block项目符号依旧存在:
IE7下li设置display:block后

demo页面

2、列表项目添加float:left
在IE6和IE7下,给列表项目(没有其他样式)添加float:left将会使列表项水平对齐,同时项目符号(或项目编号)消失。如下图所示,截自IE7浏览器
IE7浮动使项目符号消失

IE8和其他所有浏览器下,列表项会水平对齐,但是项目符号(或项目编号)仍然可见。
Firefox下浮动不会影响列表符号的显示

demo页面

当列表项浮动的时候,我们必须记住另外一个要点,就是列表容器(ul元素)在内部仅有浮动元素时会死翘翘,这在所有的浏览器下都会以相同的方式发生,添加overflow:hidden是解决此问题的方法之一。

为了能在不同浏览器下达到大致相同的float:left效果,最好的方法是是使用display:inline。

3、IE下有“Layout”的有序列表
在IE6和IE7下,如果有序列表中的列表项有“Layout”,则有序列表的数值将不会增加,显示为“1”,如下图所示:

li haslayout后在IE6和IE8下的对比表现

demo页面

hasLayout属性不能被直接设置,但是如果一个元素设置了宽高,浮动,绝对定位等待就会改变haslayout。

4、IE6&IE7下的padding及margin
在大部分的浏览器下,为了移除项目符号或项目编号,让内容左侧对齐显示,需要设置左padding为0,但是这在IE6和IE7下并不管用,在IE6,7下需要设置左margin为0取而代之。见下图:
IE6下padding-left为0不起作用

demo页面

5、在所以浏览器下实现一致的列表样式
为了避免在不同浏览器下处理列表样式的时候出现问题,最好的方法是使用在前面提到的CSS的重置(css reset),css reset几乎可以将浏览器所有默认设置差异设置为最小,并允许所有浏览器下都在同样的基础上工作。虽然某些样式下依然存在差异,但是它们不会被当作一个难点来处理了。

另外,正如前面提到了,最好完全避免使用list-style-image属性,而以设置background代替,这是一个跨浏览器的,易于维护的无序列表的自定义符号解决方法。

四、一些实例与应用
1、导航条
迄今为止,无序列表最常见的用途就是导航条,无论是水平的还是垂直的,自从基于表的布局已经过时,无序列表已经被当作导航元素的基础被广泛的应用,原因如下列表所示:

•无序列表属于block水平的元素,不需要再在外面包裹一个div以应用background或其他图形扩展。
•当样式被禁用的时候,列表样式会从容的降级,保持其本来样式,可确保导航项与页面其他内容表现的不一样。
•尽管无序列表不会仅是一个简单的列表,要添加诸如<a>标签之类的元素,但是额外的<li>元素会使导航栏以更灵活的形式表现。
•导航分为列表和/或副列表,允许使用辅助的技术(如屏幕阅读器),用户可以很轻松地跳过整个导航条。

例如:采用jQuery实现的LavaLamp特效菜单
火焰灯特效菜单

2、下拉菜单
例如前段时间我制作的一个下拉菜单实例:jQuery之使用slideToggle实现垂直下拉菜单

效果demo

3、照片显示
HTML列表标签ul,li提供了有效的方式显示照片列表,原因与上面导航条提到的一样。下面就是一些以ul,li 标签为HTML基础的的照片画廊或是照片显示组件。

jCarousel
jCarousel照片切换传送jQuery插件提供了可自定义的jQuery功能,使用了无序列表,可以以多种不同的方式显示传送效果。我已经将此插件翻译成中文,您可以狠狠地点击这里:jCarousel中文demo首页

InnerFade – jQuery
innerfade插件能让任意列表形式的内容依次淡入淡出切换显示,或是上下切换显示。内容可以是文字,图片等。支持各式标签,列表标签ul,li或是div,p标签都可以。

可以非常轻松的实现诸如新闻或公告内容的自动随机切换显示,或是图片幻灯片的播放显示等。下图展示的是图片幻灯片切换的过渡阶段:
图片淡入淡出过渡显示

此插件demo狠狠地点击这里: InnerFade demo页面

4、代码高亮
许多博客和教程网站含有JavaScript高亮代码的都是转换pre元素或textarea元素为有序列表,如下面的截图。其中有名的一款代码高亮插件是Alex Gorbatchev’s SyntaxHighlighter

下为类似高亮插件的效果截图:
高亮代码截图

您可以点击这里预览效果(demo页面展示的是jQuery cookie插件代码)。

5、博客评论
博客评论,包括这些WordPress驱动的站点,以有序列表构建,提供非常灵活的样式选项,并奠定了评论嵌套的基础。下图截自腾讯CDC T.d 昨天发布的The Story of Mr.Gray — Web 交互设计“灰色”的8类应用一文评论部分。
WordPress评论截图

6、商品列表
最典型的代表莫过于淘宝网首页的“宝贝类目”一栏的万千商品类目的显示:
淘宝网首页定义列表与商品类目

从截图可以看出,这里类目的显示使用的是dl,dt,dd定义列表实现的。

7、其他
列表元素的其他应用还有很多,例如多图片上传的进度条,CSS步骤菜单,重叠菜单等等。这里就不一一展示了。

五、可有可无的总结
HTML标签元素就是砖砖瓦瓦,看上去很一般,但是到了优秀的设计师手里和优秀的工人那里就会发挥出无限的潜力与魅力,于是有了我们多姿多彩的互联网。列表元素也是如此,虽然还有几十更多的用途和技术可以在本文中讨论,但是本文展示的一些东西以让我们彻底的了解HTML中列表标签元素的的概貌,帮助您用列表这类砖瓦构建出漂亮的“互联网建筑”。

六、参考阅读与延伸阅读
The Listamatic
CSS Design: Taming Lists
CSS Lists on W3Schools
Definition lists – misused or misunderstood?
CSS-Styled Lists: 20+ Demos, Tutorials and Best Practices
List Elements on Sitepoint’s HTML Reference

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=489



CSS工具之CSS重置(CSS Reset)

CSS工具之CSS重置(CSS Reset)

样式重置的目的是减少浏览器的不一致性,例如line-height,margin,标题的font-size大小等等。样式重置经常在CSS框架中出现。

这里的重置样式故意写的很一般,例如没有为body元素设置任何颜色或是背景之类,我并不建议您就拿这个重置样式应用在您自己的项目中,它应该被调整,修改,扩展以符合您自己的特定的重置基准。例如填写您自己喜欢的网页链接颜色等等。

换句话说,这仅仅是个很简单初级的引导,不是一个独立的不可操作的黑盒子。

以下代码随便用,随便您怎么复制粘贴,修改都没有关系。

参考自:http://meyerweb.com/eric/tools/css/reset/

css代码:
/* v1.0 | 20080212 */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } /* remember to define focus styles! */ :focus { outline: 0; } /* remember to highlight inserts somehow! */ ins { text-decoration: none; } del { text-decoration: line-through; } /* tables still need 'cellspacing="0"' in the markup */ table { border-collapse: collapse; border-spacing: 0; }


CSS border三角、圆角图形生成技术简介

CSS border三角、圆角图形生成技术简介

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=794

一、前言

利用CSS的border属性可以生成一些图形,例如三角或是圆角。纯粹的CSS2的内容,没有兼容性的问题,我之前在纯CSS实现各类气球泡泡对话框效果一文中算是比较详细的讲述了CSS border属性生成三角的原理,以及实例。我觉得此技术相当实用的,故本文再次简单叙述一下,另外,本文还将展示可能并不为众人所知的CSS border圆角生成技术。好了,裹脚布的话就不说了,直接进入正题。

二、CSS border生成三角技术简介

效果抢鲜
下图为使用CSS的border属性实现的三角效果:
相邻边框显示的效果 张鑫旭-鑫空间-鑫生活

.test{width:0; height:0; border-width:20px 10px; border-style:solid; border-color:#ff3300 #ff3300 #ffffff #ffffff;}

如何实现的,为何会有这样的效果,不急,take it easy!

梯形图案
看下面这段样式:

.test{width:10px; height:10px; border:10px solid; border-color:#ff3300 #0000ff #339966 #00ff00;}

当某个div应用了上面这个样式后,结果会如何?见下图(截自Firefox3.5,IE浏览器有细节上的差异):
Firefox浏览器下边框交界处的显示 张鑫旭-鑫空间-鑫生活

更进一步 – 部分边框透明
现在,设想一下,如果我们现在只保留一个一个上边框,其余边框均transparent透明(或与背景色同色),那么是不是就只显示一个上面红色的边框了,我们测试下,与上面类似的代码,只是修改下其余三个边框的颜色。

.test{width:10px; height:10px; border:10px solid; border-color:#ff3300 #ffffff #ffffff #ffffff;}

结果如下图(截自Firefox3.5):
边框色域背景色一致后的效果 张鑫旭-鑫空间-鑫生活

得到的是一个梯形。

从梯形到三角
上面的是梯形,我要想得到一个三角图案该怎么办呢?显然,很简单,把div的高宽都变成0,只留一边,不就是三角了吗?如下代码:

.test{width:0; height:0; border:10px solid; border-color:#ff3300 #ffffff #ffffff #ffffff;}

结果如下(依旧截图自Firefox3.5):
高宽置0后的显示 张鑫旭-鑫空间-鑫生活

从等腰直角三角形到普通等腰三角
上图为等腰直角三角形,之所以为等腰直角,是因为所有的边框宽度是一样的,如果我们将边框宽度设置为不同,那会怎样?则会形成等腰三角形。如下代码:

.test{width:0; height:0; border-width:20px 10px; border-style:solid; border-color:#ff3300 #ffffff #ffffff #ffffff;}

得到的结果如下图:
边框大小不一致后的显示 张鑫旭-鑫空间-鑫生活

从等腰到不等腰
我们可以不局限于保留一条边框,我们可以保留两条,于是我们可以告别等腰,得到更加锐利的三角,正如一开始所展示的那个三角:

.test{width:0; height:0; border-width:20px 10px; border-style:solid; border-color:#ff3300 #ff3300 #ffffff #ffffff;}

相邻边框显示的效果 张鑫旭-鑫空间-鑫生活

实际的应用
关于应用,不多说,直接看图:

邻边边框尖角使用效果图 张鑫旭-鑫空间-鑫生活

说明:
以上的测试代码纯粹为了说明原理,所以使用#ffffff白色边框,通过于背景融合来隐藏边框。在实际的操作中,应该使用transparent透明属性,例如border-color:#ff3300 #ff3300 transparent transparent;,这同样会有问题,IE6浏览器不支持transparent透明属性,不过没有关系,就border生成三角技术而言,直接设置对应的透明边框的border-style属性为dotted或是dashed即可解决这一问题,为什么使用dotted和dashed可以修复此问题呢?您有兴趣可以参见默尘的这篇文章Dotted&Dashed终极分析及IE6透明边框

三、CSS border圆角生成技术简介

我看圆角
一提到圆角,我脑中闪过的词就是“定位”,“嵌套”,“模拟”,“渐进增强”,“滥用”。定位,也就是切四个角上下左右定位,这是淘宝首页的做法,但是面对IE6的奇偶bug只能当作看客;使用“嵌套”则不会有此问题,“嵌套”分图片背景嵌套和CSS边框嵌套,使用图片嵌套则图片的重用性,大小优化有待加强,边框嵌套则技术实现上有些难度;或使用“渐进增强”,CSS3 border-radius属性,而不要去鸟IE这类自我感觉良好的浏览器;或是学习Google使用CSS模拟,而一般的CSS模拟都是使用左右边框+背景色的方式1像素1像素的拼合成的。这类方法各有优缺点,需根据实际情况采用。对于满眼圆角的设计图我是很不喜欢的,该用则用,切勿为了圆角而圆角。

border圆角图案生成法
这里介绍的实现圆角的得到与上面提到的都是不一样的,虽然也属于CSS模拟的范畴,但是其高效的程度确实相当惊人的,可谓最佳实践之一。

我们先看看效果,见下图,截自Firefox3.6:

border属性生成圆角 张鑫旭-鑫空间-鑫生活

上述效果的实现仅仅使用了三个标签,如下代码:

HTML:
<div class="box"><br />    <div class="top"></div><br />    <div class="center">我是一只小小鸟、小小鸟!</div><br />    <div class="bot"></div><br /></div>

CSS:

.box{width:500px;}<br />.top{border-bottom:3px solid; border-top-color:#cc0000; border-bottom-color:#cc0000; border-left:3px dotted transparent; border-right:3px dotted transparent;}<br />.center{padding:10px 20px; color:white; font-size:14px; background:#cc0000;}<br />.bot{border-top:3px solid; border-top-color:#cc0000; border-bottom-color:#cccccc; border-left:3px dotted transparent; border-right:3px dotted transparent;}<br />

我们看看这段代码在IE6下的效果:

IE6下border属性生成圆角 张鑫旭-鑫空间-鑫生活

这里的高效在于,仅仅使用了一层标签就模拟了3像素的圆角,按照曾经我对CSS圆角模拟的理解,模拟1像素的圆角需要一层标签(background+borderLeft+borderRight),两像素的需要两层标签,三像素的需要三层标签。

有点神奇,但是就像看刘谦的魔术一样,说穿了也就那么回事,其实这里的圆角模拟在本文的上面已经展示了,就是这样图片:

边框色域背景色一致后的效果 张鑫旭-鑫空间-鑫生活

您可能会疑问,是不是搞错图片啦,这显然不是一个模样的,非也非也,就本质上而言,圆角的实现与上面的梯形图就是同样的东西。现在,盯着上面这张图,我们想象一下,用力的想象,用想花姑娘的那番劲头想象——上面的梯形宽度越来越宽(不是拉伸),一直宽到500像素,是不是与上面实现的圆角的下边缘一致啊?

也就是说,那个含有“我是一只小小鸟……”文字的圆角图形是有一个上梯形+矩形+下梯形组成的。参见下面的分离效果图:

圆角上下分离示意图 张鑫旭-鑫空间-鑫生活

您可以狠狠地点击这里:CSS border圆角生成demo

局限性
人无完人,金无足赤,此方法虽然简洁高效,兼容性上佳,但是依然有局限性,在实现实色背景的圆角效果时,此方法可谓首选;如果是纯粹的圆角边框,此方法也可以实现,需要用到边框重叠,但是标签数几乎要翻倍,其权衡效用将大打折扣,反不如其他圆角方法来的实在。

四、结语

如果在web制作中,需要用的一些直接可以使用CSS+单标签模拟的图片,我的建议是“毫不犹豫使用CSS模拟”,例如实色的三角,或是实现实色的圆角效果,这可以说是最高效,最利于扩展维护的前端实现方法了。我们需要开阔的思维,而不要仅仅局限于眼前的技术,武侠中所谓的“无招胜有招”还是有着一定的哲学道理的,长远来看,意识与海纳百川的心态比当下的一点技术更来得重要。我还羽翼未丰,青涩稚嫩,诚惶诚恐不敢随性多说。不管怎样,希望本文的内容能够对您的学习有所帮助,如果您发现文章中有表述不准确之处,欢迎指正。

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=794



我是如何对网站CSS进行架构的

我是如何对网站CSS进行架构的

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=944

一、写在前面的

都是自己积累形成的一些东西,可能带有明显的个人印记。不是专业内容,不是权威指南,只是展示一点自己的观点,借此希望能与各位优秀的同行交流看法,见解。以得到进步与提高。

二、我所知的一些过往的做法

关于如何处理网站的CSS,各个网站做法都不一样,这随着网站的性质及大小不同,公司前人留下的规范不同,以及CSS工程师的眼界不同而有所不同。由于我从业经历有限,所知甚浅,只能说些肤浅业余的内容,不准确之处欢迎指出。

就CSS文件而言,有的网站分为header.css, body.css, footer.css,不做评价;
有的分为reset.css, main.css, content.css,不做评价;
有的分为common.css,然后每个种类的页面一个CSS,例如home.css(主页), album.css(相册页面),message.css(站内信页面),blog.css(日志页面)等,不做评价;
有的分为base.css,然后每个活动页面一个单独的CSS,等,不做评价;
还有的直接将CSS嵌在页面中,而非外部链接调用,不做评价。

这些不同的处理方法,没有什么正确与错误之分,只有适合不适合。每种方法都有其存在的道理,所以我是没有资格做任何评价的。

就每个CSS文件的内容而言,一般都会有一段长长的CSS reset(样式重置),然后就是有着统一前缀,命名较长的样式内容,就像人人网的部分样式截图:
人人网长命名的CSS代码 张鑫旭-鑫空间-鑫生活

使用长命名,统一的父级命名避免样式冲突时无可厚非的。确实!曾经我也如此。

三、我是如何对网站CSS进行架构的

首先关于CSS文件,我一般只使用一个文件,这无关于网站的大小,网站越大,某种意义上我这种做法的优势与潜力就会体现的越明显。我这种单CSS文件的做法适合于web2.0的网站,例如像是SNS网站(开心、人人、白社会),嘀咕网,虾米网,凡客这类网站,如果是门户网站,sorry,铁定不适合。

让网站单CSS谁都会,关键是为何可以使用单CSS文件,这个CSS文件不会很大吗,如果一个网站有400个页面,那么这个CSS文件岂不要数百K。非也,在网站页面风格一致,在web系统结构良好的情况下,CSS文件可以控制的非常小,而且高性能,同时页面扩展性也非常好。下面就开始一点一点的展示,内容较多,需要慢慢来~~

1、整体概述

页面布局与文章内容显示需要,我将整体架构做成了一张图片,见下图:
张鑫旭的CSS架构内容示意图 张鑫旭-鑫空间-鑫生活

2、关于CSS reset
CSS reset(css重置)基本上是不需要的,至少可以说80%的的CSS reset都是没有必要的,反而增加了页面CSS 的overwrite,尤其像开心网*{margin:0;}这样子业余的做法更是要不得(反而破坏了很多UI的兼容性,比如说单复选框等)。我不是一概鄙弃CSS reset,有些常用标签我也是会简单重置一下的,而且会避免overwrite(样式重写),以保证样式最精简,渲染最高效。如下代码示例:

body{
line-height:1.4;
background:white;
}
body,input,textarea,select{
font-size:12px;
color:#333;
font-family:arial;
}
body,h1,h3,h4,p,ul,ol{
margin:0;
}
ul,ol{
padding-left:0;
list-style-type:none;
}
/*image with no-border*/
a img{border:0;}

这就是我全部的CSS reset。就这些就足够了,我是没有遇到什么兼容性的问题,不要盲从于一些主流的做法,就这些,足够了。

3、关于CSS通用样式库
我在“CSS样式分离之再分离”一文中曾提到过CSS通用样式库。所谓CSS通用样式库就是可以在任何网站使用的CSS样式库。“CSS样式分离之再分离”一文中仅仅展示了CSS同样样式库的一部分,完整的通用样式库如下(您可以根据自己的喜好重命名或是添加删除部分样式):

.l{float:left;}.r{float:right;}.cl{clear:both;}<br />.n{font-weight:normal; font-style:normal;}.b{font-weight:bold;}.i{font-style:italic;}<br />.fa{font-family:Arial;}.fg{font-family:Georgia;}.ft{font-family:Tahoma;}.fl{font-family:Lucida Console;}.fs{font-family:'宋体';}.fw{font-family:'微软雅黑';}<br />.tc{text-align:center;}.tr{text-align:right;}.tl{text-align:left;}<br />.tdl{text-decoration:underline;}.tdn,.tdn:hover,a.tdl:hover{text-decoration:none;}<br />.g0{color:#000000;}.g3{color:#333333;}.g6{color:#666666;}.g9{color:#999999;}.red{color:red;}.wh{color:white;}<br />.f0{font-size:0;}.f10{font-size:10px;}.f12{font-size:12px;}.f13{font-size:13px;}.f14{font-size:14px;}.f16{font-size:16px;}.f20{font-size:20px;}.f24{font-size:24px;}<br />.vm{vertical-align:middle;}.vtb{vertical-align:text-bottom;}.vt{vertical-align:top;}.vn{vertical-align:-2px;}.vimg{margin-bottom:-3px;}<br />.m0{margin:0;}.ml1{margin-left:1px;}.ml2{margin-left:2px;}.ml5{margin-left:5px;}.ml10{margin-left:10px;}.ml20{margin-left:20px;}.mr1{margin-right:1;}.mr2{margin-right:2px;}.mr5{margin-right:5px;}.mr10{margin-right:10px;}.mr20{margin-right:20px;}.mt1{margin-top:1;}.mt2{margin-top:2px;}.mt5{margin-top:5px;}.mt10{margin-top:10px;}.mt20{margin-top:20px;}.mb1{margin-bottom:1px;}.mb2{margin-bottom:2px;}.mb5{margin-bottom:5px;}.mb10{margin-bottom:10px;}.mb20{margin-bottom:20px;}.ml-1{margin-left:-1px;}.mt-1{margin-top:-1px;}<br />.p1{padding:1px;}.pl1{padding-left:1px;}.pt1{padding-top:1px;}.pr1{padding-right:1px;}.pb1{padding-bottom:1px;}.p2{padding:2px;}.pl2{padding-left:2px;}.pt2{padding-top:2px;}.pr2{padding-right:2px;}.pb2{padding-bottom:2px;}.pl5{padding-left:5px;}.p5{padding:5px;}.pt5{padding-top:5px;}.pr5{padding-right:5px;}.pb5{padding-bottom:5px;}.p10{padding:10px;}.pl10{padding-left:10px;}.pt10{padding-top:10px;}.pr10{padding-right:10px;}.pb10{padding-bottom:10px;}.p20{padding:20px;}.pl20{padding-left:20px;}.pt20{padding-top:20px;}.pr20{padding-right:20px;}.pb20{padding-bottom:20px;}<br />.rel{position:relative;}.abs{position:absolute;}<br />.dn{display:none;}.db{display:block;}.dib{-moz-inline-stack:inline-block; display:inline-block;}.di{display:inline;}<br />.ovh{overflow:hidden;}.ovs{overflow:scroll;}.vh{visibility:hidden;}.vv{visibility:visible;}<br />.lh14{line-height:14px;}.lh16{line-height:16px;}.lh18{line-height:18px;}.lh20{line-height:20px;}.lh22{line-height:22px;}.lh24{line-height:24px;}<br />.fix{*zoom:1;}.fix:after,.fix:before{display:block; content:"clear"; height:0; clear:both; overflow:hidden; visibility:hidden;}.z{_zoom:1;}<br />

上面的样式是有简单的分类的,某种意义上讲,CSS库与js库属于类似的东西。

关于此样式库,您可以直接在您的页面头部&head>标签内嵌入如下代码:

<link rel="stylesheet" href="http://www.zhangxinxu.com/study/css/zxx.lib.css" type="text/css" />

如果您想下载此CSS文件,您可以狠狠地点击这里:zxx.lib.css(右键-[目标|链接另存为])。您可以随意修改,如果能保留我的一个个人信息,那真是感激不尽~~

4、网站CSS样式库
这里的样式是根据当前实际的项目内容指定的。例如,文字链接颜色是什么,文字链接经过的样式是什么;一些常用的背景色样式,常用的边框样式等,以及一些高宽等。按照我的经验,网站CSS样式库又可以架构为以下几部分:
①网站常见颜色,尤其是链接色
②网站常见背景色(我习惯用bg+颜色前2字母表示,例如.bgf7表示background:#f7f7f7;)
③网站常见边框色,这里类似于CSS 通用库中的margin属性,需拆分,例如.bbdd表示border-bottom:1px solid #ddd;每人的命名习惯不一样,但是尽量简单为好,甚至您可以像Google一样,直接两个字母(大小写混搭)表示。另外,一定要告知设计师,边框取色不宜多,不能凭感觉,要有所牺牲,也就是如果之前使用了#cecece的边框色,后面的即使使用#d0d0d0更好看,请使用#cecece代替,这就是团队协作。
④网站遗留的单margin属性,例如,某一div留白较大,有个单独的margin-top:35px的属性,ok,这个属性请放在网站CSS样式库中,以.mt35{margin-top:35px;}保留,以供之后类似布局或需要的地方使用。
⑤网站遗留的单padding属性,例如,双栏自适应布局时,无论是浮动自适应,还是绝对定位自适应,都需要使用padding-left值,此时的padding-left多单样式,可抽取出来,以网站样式库的形式存在。记住,是单属性,且不可从通用元素中抽取单独的padding值,否则是给自己挖火坑。
⑥网站遗留的width属性,在流体布局思想下,宽度是有限的,是珍贵的,需好好利用。
⑦网站常用的一些height属性,指一些高度值,例如height:18px; height:20px; height:24px; height:50px; height:100px; height:200px;等。

记住一个原则:网站通用的元素(按钮,导航,选项卡的)的样式千万不能分离作为网站的CSS样式库。

5、网站通用小图标样式集
小图标的样式合并是普遍处理的较好的,由于其规律可循,所以经常在CSS文件较上的位置看到有关小图标的CSS合并样式,这在SNS网站中很是常见。一般合并样式部分样式为{background:url(xx.png) no-repeat;},分离部分的样式是{background-position:x, y;},就实现而言,我觉得没有多少说头,只是命名有些自己的见解。在小图标样式命名的时候,我的建议是不要关联图片的内容,比如说一个相册的下图标,不应该使用iAlbum这样的命名。原因有三:
1. 思考图片的命名杀死n多脑细胞
2. 命名较长,占用字节数,也就是CSS文件大小
3. 也是最重要的,后期的维护。设想下,如果日后相册的图标不再被使用了,原来相册图标的位置可以被其他小图标(如RSS小图标)替换吗?理论上可以,实际上,我们除了必要的html替换,还需要重新修改图标样式的命名,即iAlbum→iRss的命名,而往往取而代之的做法是直接在后面添加新的图标。

我目前的做法是使用一个不常用的标签作为网站的小图标专用标签,例如s标签,或是u标签,我习惯将小图标单独为一个小图标Sprite,每个图标放在20*20像素的格子中。在这种情况下,我都是使用矩阵命名法。命名只关联位置,例如,我使用u标签作为整个网站的小图标专用标签,则按照图标的位置(假设一行20个图标),我会依次命名为:u00,u01,u02…u019,u10,u11,…u119…。这种命名的好处是不用关心到底哪个位置是那个图标,不用担心命名冲突,在小图标位置以及内容更换的情况下也无需重命名。
小图标矩阵命名法 张鑫旭-鑫空间-鑫生活

例如,上图中标注的u113的意思其实是u(1,13),这种小图标命名的方法我称之为“小图标矩阵命名法”。此命名略有不足在于在使用小图标时需要打开源文件或通过注释准确查询到对应的class。

6-10、网站通用样式
这里的“网站通用样式”可以说与“网站通用样式库”最为对立的两部分。网站通用样式专指“独立元素”的通用样式,所谓“独立元素”指的是网站通用的导航,菜单,按钮,选项卡,文本框装饰,图片装饰,圆角处理等等。这些“独立元素”的样式千万不能对其进行分离并归入“网站通用样式库”中,否则,日后会给你留下无尽的痛苦的!

我几乎从不对按钮或是导航进行定宽,都是宽度自适应,这样,可以大大节约Sprite背景图片以及CSS代码的成本。以前多有探讨,这里不多说了。

网站通用样式的代码量在整个CSS文件中所占据的比重是相当大的,如果您的CSS文件中发现CSS通用样式只占整个CSS文件的一小部分,尤其网站项目较大时,那就需要引起警惕,可能最后的结果就是CSS文件超负荷,最后反而一团糟。

11、网站公共结构样式
所谓“网站的结构样式”主要指的是最外框div的样式,一般限制网站的宽度(960~990不等),还有就是网站的分栏布局样式,这里的样式仅仅针对主体结构,例如left_part,或是right_part;还包括网站的头部的一些公用结构,底部的样式结构等。

我是强烈建议公共结构仅仅定宽定高,设置浮动属性,切不可在结构样式上添加margin或是padding属性,这会使网站的公共结构的重用性大大降低!

12、单页面的精细结构
如果上述11项您都架构的非常好,那么您在编写每个具体页面的时候,就会非常轻松,非常迅速。因为80%~90%的样式都可以从上面11项中直接拿来用(上述11项全部都是网站公用样式)。

对于中型大型网站,我们可能要花3~4天甚至更多的时间分析页面设计图,处理CSS Sprite,架构网站的CSS,这段时间不写任何页面,就是处理网站(可以说是)唯一的CSS文件。所谓“磨刀不误砍柴功”,站在整站的角度上去思考CSS是非常重要的,这可以让你避免迷路,有助于写出精简高效的样式代码。

当我们把1-11项都完成了,就开始着手写页面了,这时候,整个网站的页面基本上都在你脑中了,您在下手的时候就会清除:我现在做的是哪个页面,在整个网站中扮演着什么样的地位,这个页面的CSS对整个网站的CSS有什么影响,这里的样式该怎么处理(分离,合并还是独立)等。

一般而言,就我个人经验,每个页面,即使这个页面看上去很复杂,其代码开销也是非常小的。其新增的代码开销去处有三处:一是分离一些样式归入“网站CSS样式库”中;二是凡事使用的CSS Sprite的样式与其他样式进行合并;三就是一些精细的复杂的样式,这些就是CSS文件的架构的最后一部分“单页面的精细结构了”,何为单页面的精细结构,如下图的样式,就可以说是精细结构,需要独立出来新写样式(可适当分离,注意“适当”一词):
精细结构 张鑫旭-鑫空间-鑫生活

例如上图鼠标经过后显示,红色虚框样式,剪刀,粗边框投影,最优惠标示,一些按钮等就属于精细结构,我们需要在页面上单独写一个样式。虽然理论上,我们使用分离也是可以实现这个效果的,但是此时html代码的开销实在太大,根本就不适合使用分离,这里就该老老实实的写样式。这里的写法,命名都应该跟随内容而不是属性本身。我们可以在单一类别的页面使用同样的前端的前缀避免样式冲突等~~

四、关于适用性

有些东西虽然看上去好,但是却不适用。通过上述的CSS架构,我可以把网站的样式控制地非常的精简与高效(当然,需要设计师与后台工程师的通力配合),但是,对于别人,套用此架构可能就没有这样的效果,可能反而会更糟。前面也提到了,这种架构是我自己摸索出来的,是根据自己的写法,布局思想,甚至性格等形成的,带有明显的个人印记。

比方说,我是个推崇自适应布局(流体布局)的人,是个十足的自适应控,但是,有很大一部分同行是固定布局(像素级兼容,有计算)。固定布局固然有其优点,但是其CSS代码的消耗量以及页面的扩展性我是很诟病的,显然,这是无法应用到我这里的架构中的。

其次,不少CSS刚入门的页面开发工程师对CSS属性理解不够透彻,常会写一些没有必要的冗余代码。对于他们而言,但CSS文件的架构确实很吃力。

说实话,我对自己的这个CSS架构的适应性都不看好,一是自己在表达方面的火候欠缺,没有很好的展示架构的精髓,二是因为此架构本身需要有很多的控制,这种控制受制于设计师,网站页面架构,CSS工程师自身的功力,一旦样式泛滥,这种架构也就毫无意义,反而弄巧成拙;但是,一旦控制下来,那么网站就CSS性能这块保证领先,而这些需要优秀的有眼界的CSS工程师来掌控,需要优秀的设计师,程序员通力协作。虽然全然套用我展示的这套架构会由于不熟悉或是掌控不够而产生问题,但是,里面一些概念,一些思想应该能有一定的启示作用的,这也是本文的意义所在了。

我只是个初出茅庐的小生,我知道,很多真正功力深厚的前端开发人员有着更好的更广泛适应的前端架构,如果您有幸来到这里,欢迎分享您的一些见解与认识。还有,文中若有您觉得不合理的观点,也非常欢迎通过评论或是邮件(zhangxinxu@zhangxinxu.com)的方式进行指正。我们需要在不断的交流中提高的。

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=944

(本篇完)



小tip:iframe高度动态自适应

小tip:iframe高度动态自适应

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=1294

一、前言碎碎念

我从来对iframe就没有什么好感,对其基本上是不屑一顾。但是人在江湖,身不由己。经理发话,新功能使用iframe实现,没办法,只好折腾,两大烦人的东西,一是带遮罩的弹框提示,而是iframe高度问题。前一个烦人的问题使用其他形式的提示来规避,后一人扰人的问题确实没有什么经验,花了点时间折腾了下,基本上实现了效果,跨域没问题,兼容性也没问题,于是,写个小文备忘下,下次再使用的时候就到这儿拷贝核心代码。

口碑UED有篇大米的“再谈iframe自适应高度”一文,可以看看,虽然貌似兼容性没有个调调。此文评论有个如下的链接地址:http://css-tricks.com/examples/iFrameResize/crossdomain.php,跨域且比较兼容的iframe高度定时自动变化的demo,但是,此demo中的js像个老太太一样啰哩吧嗦,裹脚布般又臭又长,于是,对js脚本重新修身整形,把老太太变成了苗条妙龄少女。

二、原理简述

本文展示的实现方法需要父页面和框架子页面相互配合。框架页面的任务就是向父页面传递其高度值,父页面的任务就是获取这个高度,然后改变iframe的高度。这个道理不难理解,儿子想买双增高鞋,但是由于没有经济实力买不起,于是就告诉他的老爸:“老爸,我要买双40码的增高20厘米的增高鞋”,老爸收到了这个信息,就可以掏钞票给儿子买鞋让儿子增高。

关键是这个讯息如何传递。因为这个老爸是后爸(跨域),儿子心理上有障碍,说不出口。这时候,就需要媒介来帮忙传递讯息,例如儿子的偶噶桑(お母さん)。那么,在本文中,这个协助传递高度信息的媒介是什么呢?答案就是地址栏的锚点。如下图:
锚点传递iframe高度值 张鑫旭-鑫空间-鑫生活

将高度以如下锚点形式传递:

#height=372

iframe页面内部通过window.top.location属性修改父页面的地址栏地址,从而将带有高度值的地址传递过去。地址栏地址在只增加锚点的情况下是不会刷新页面的、或是产生跳转什么的。

在父页面,需要设定一个定时器,例如每200毫秒去获取iframe的高度,如果高度改变,则取修改iframe的高度。您可以会对此做法的效率有所疑问,根据大米的测试,同时开5个窗口(IE6、IE7、FF、Opera、Safari)执行这个代码,不会对CPU有什么影响,甚至调整到2ms,也没影响(基本维持在0%占用率)。所以,对于效率基本上不用担心。

三、iframe页面跳转和无跳转实例

通过window.top.location修改父页面的地址栏地址,而不刷新页面,显然是需要得知父页面的页面绝路地址的。同样可以通过window.top.location获取,一了百了。

于是,父子在地址栏和锚点媒介帮助下打情骂俏,产生交流与互动,实现高度自适应的交互。

以下就是实例了。

您可以狠狠地点击这里:iframe高度动态自适应demo(无跳转)

你可以继续狠狠地点击这里:iframe高度动态自适应demo(跳转)

这两个实例父页面的js代码和iframe页面中的都是一样的,所以,统一展示,如下:

首先是子页面,子页面的任务就是传递高度而已,假设现在已经得到iframe当前的页面高度是1294(单位像素,省略)。则核心部分的js代码就是:

<span style="color: green;">//此处window.top.location获取主页面地址的方法有跨域权限的问题,替代方法参见下面的补充。<br />//或者这里直接使用死地址,即hostUrl = "http://www.host.com/",这是没有任何跨域的问题的。</span><br />var hostUrl = window.top.location.toString().split("#")[0];<br />if (hostUrl) {<br />    hostUrl += "#height=" + 1294;<br />    window.top.location = hostUrl;<br />}<br />

补充于2010-12-08
根据evonli的建议与提醒,iframe页面的高度传递不需要上面这么多代码,直接改变hash就可以了,如下:

window.top.location.hash = "#height=" + 1294;

但是,在IE浏览器下(以及Chrome下),貌似此方法,不支持跨域的情况(会报权限错误)。看来可能还是得使用iframe的src传递父页面地址,后者是通过cookie,或者其他形式,或是是写死的页面地址等形式。

目前看来,貌似只有(window.top.location = 父页面地址 + 锚点)无兼容性问题,且支持跨域。所以,我开始理解为何crossdomain.php父页面的地址要通过iframe的src地址传递的了。但是,此方法似乎只适用于iframe页面无跳转的情况。因为发生跳转后,iframe地址就变了。

通过iframe传递父页面地址方法类似下面的代码,其中iframe指iframe的DOM对象。

var href = window.location.href, index = href.indexOf("#");<br />if (index !== -1) {<br />    href = href.slice(0, index);<br />}<br />iframe.src = iframe.src + "#" + href;<br />

iframe子页面可以通过:

window.location.hash.slice(1);<br />

获得父页面的地址栏的绝对地址。然后,就是改变父页面的地址:

var hostUrl = window.location.hash.slice(1);<br />hostUrl += "#height=" + 1294;<br />window.top.location = hostUrl;<br />

//zxx:补充内容结束

下面是改变iframe的高度值, 理论上,则iframe以通过锚点附了高度值的url地址应该类似下面,http://www.google.com#height=1294,于是工作很简单,就是得到这个1294就可以了,于是有类似下面的代码:

var iframeHeight = function() {<br />    var hash = window.location.hash.slice(1);<br />    if (hash && /height=/.test(hash)) {<br />        iframe.height = hash.replace("height=", "");<br />    }<br />    setTimeout(iframeHeight, 200);<br />};<br />iframeHeight();<br />

最后就有类似下面的效果,默认iframe高度120:
iframe默认高度 张鑫旭-鑫空间-鑫生活

点击iframe页面中的“显示图片”按钮后,很快的,iframe高度自动跟随增加,如下图所示:
iframe高度增加后 张鑫旭-鑫空间-鑫生活

四、开心网的做法

开心网第三方开发的组件也是以iframe框架的形式嵌入的。其高度自适应实现原理大致如下。

内嵌的iframe动态生成一个以开心网提供的页面地址的高宽为0且隐藏的iframe,此iframe页面地址与开心网主页面是同域的,于是,其中iframe页面内部的脚本就可以对主页面进行操作了(动态改变第三方iframe的高度)。
开心网iframe高度原理 张鑫旭-鑫空间-鑫生活

var t = document.createElement("div");<br />t.innerHTML = '<iframe style="display:none;" src="http://www.kaixin001.com/interface/domain_proxy.php? para=1294&type=3'" scrolling="no" height="0" width="0"></iframe>';<br />document.body.appendChild(t.firstChild);<br />

五、结语

本着简单示范的目的,文中展示的代码算是相对比较简洁的。但是,实际使用的时候,要考虑一些细节,或是性能上的调整。例如,缓存当前高度,只有高度改变才去修改iframe的高度(这个实例中并没有体现)。

总的来说应该是相当易懂的。window.top.location为中介,iframe把高度亦锚点的形式告知父页面,父页面通过此高度修改iframe的高度值。寥寥十几行js代码,没有什么复杂逻辑和处理,一些简单的字符串处理。

最后,对iframe基本上没有什么研究,所以文中可能有表述不准确的地方,或是实现方法上有潜在问题,欢迎大家指正,不甚感谢。就这些。

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=1294

------------------------------------------

demo:




代码


HTML代码:

<span class="paren xml-tagangle"><</span><span class="keyword xml-tag xml-tag-open">iframe</span> <span class="builtin xml-attribute">id</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>testIframe<span class="after">"</span></span> <span class="builtin xml-attribute">frameborder</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>0<span class="after">"</span></span> <span class="builtin xml-attribute">scrolling</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>no<span class="after">"</span></span> <span class="builtin xml-attribute">src</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>iframe-page-no-fresh.html<span class="after">"</span></span> <span class="builtin xml-attribute">width</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>100%<span class="after">"</span></span> <span class="builtin xml-attribute">height</span><span class="undefined"></span><span class="operator">=</span><span class="string"><span class="before">"</span>120<span class="after">"</span></span><span class="paren xml-tagangle">></span><span class="paren xml-tagangle"></</span><span class="keyword xml-tag xml-tag-close">iframe</span><span class="paren xml-tagangle">></span>

JS代码:

<span class="comment comment-line"><span class="before">//</span>高度自适应</span><br /><span class="operand keyword">var</span> <span class="operand">iframe</span> <span class="operator">=</span> <span class="operand builtin">document</span>.<span class="operand">getElementById</span><span class="paren">(</span><span class="string"><span class="before">"</span>testIframe<span class="after">"</span></span><span class="paren">)</span>;<br /><span class="operand keyword">var</span> <span class="operand defun">iframeHeight</span> <span class="operator">=</span> <span class="operand keyword">function</span><span class="paren">(</span><span class="paren">)</span> <span class="paren">{</span>    <br />    <span class="operand keyword">var</span> <span class="operand">hash</span> <span class="operator">=</span> <span class="operand builtin">window</span>.<span class="operand">location</span>.<span class="operand">hash</span>.<span class="operand">slice</span><span class="paren">(</span><span class="operand">1</span><span class="paren">)</span><span class="comma">,</span> <span class="operand">h</span>;<br />    <span class="operand keyword">if</span> <span class="paren">(</span><span class="operand">hash</span> <span class="operator">&&</span> <span class="regexp"><span class="before">/</span>height=<span class="after">/</span></span>.<span class="operand">test</span><span class="paren">(</span><span class="operand">hash</span><span class="paren">)</span><span class="paren">)</span> <span class="paren">{</span><br />        <span class="operand">h</span> <span class="operator">=</span> <span class="operand">hash</span>.<span class="operand">replace</span><span class="paren">(</span><span class="string"><span class="before">"</span>height=<span class="after">"</span></span><span class="comma">,</span> <span class="string"><span class="before">"</span><span class="after">"</span></span><span class="paren">)</span>;<br />        <span class="operand">iframe</span>.<span class="operand">height</span> <span class="operator">=</span> <span class="operand">h</span>;<br />    <span class="paren">}</span><br />    <span class="operand">setTimeout</span><span class="paren">(</span><span class="operand">iframeHeight</span><span class="comma">,</span> <span class="operand">200</span><span class="paren">)</span>;<br /><span class="paren">}</span>;<br /><span class="operand">iframeHeight</span><span class="paren">(</span><span class="paren">)</span>;<br /><br />