看电影时请关灯——一个很酷的页面效果
YouTube 上的一些视频有个很酷的功能叫做”关灯”(Turn the lights down)。基本上来说,当你关灯,整个页面全部变黑,就像在电影院的效果一样。本教程将向你展示如何使用jQuery实现这个效果。
问题
正如你在演示页面看到的那样,这个实例的结构是很简单的 – 它只包括头部、视频、“关灯”链接和侧栏。在下面的代码中你将看到包含了开关转换链接的“command”层,包含视频的”movie”层以及实现侧栏的”description”层 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <div id="container"> <div id="header"> <h1>前端观察</h1> <h2>看电影时请关灯- 演示</h2> <div id="command"> <a class="lightSwitcher" href="#">关灯</a> </div> </div> <div id="movie"> <object width="420" height="363"> <param name="movie" value="http://www.tudou.com/v/kccxrpqN16w" /> <param name="allowFullScreen" value="true" /> <param name="allowscriptaccess" value="always" /> <embed src="http://www.tudou.com/v/kccxrpqN16w" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="420" height="363"></embed> </object> </div> <div id="description"> <p>一些描述或其它内容</p> </div> </div> |
CSS代码也很简单:
1 2 3 4 5 6 | body{font:13px "微软雅黑", Arial, Sans-Serif; text-align:center;margin:0;position:relative;} #container { width:960px; margin:0px auto; text-align:left; overflow:hidden;} #movie {border:solid 1px #dcdcdc; float:left; width:560px; text-align:left; margin-right:20px;} #description { float:left; width:320px;border:solid 1px #dcdcdc; padding: 10px 20px;} .lightSwitcher {background:url(light_bulb.png) no-repeat 0 0; padding: 0;text-indent:20px; outline:none; text-decoration:none;} .lightSwitcher:hover {text-decoration:underline;} |
让我们开始吧

当点击”关灯” 按钮时,我们需要将整个页面变黑——当然除了视频。这可以通过一个有半透明黑色背景的div来实现。这个div需要在它的相对定位(通常就是body)的容器内使用绝对定位,而且需要覆盖整个窗口——从左上角到右下角。
这样我们就需要在页面的最底部添加这个额外的div:
<div id="shadow"></div>这个shadow层的样式可以这样写:
1 | #shadow {background:#000;position:absolute;left:0;top:0;width:100%;z-index:100;opacity:0.80;filter: alpha(opacity = 80);zoom:1;} |
这里最重要的是z-index. 为了让它覆盖到整个页面的上面,它需要最大的z-index。但是,不管怎么样,这个嵌入的Flash元素(视频代码) 将是不会被覆盖的。将一个div定位到顶部并将其设置为100%宽度是非常简单的,但是高度怎么办呢?如果我们将这个半透明层的高度设置为100%,那么它将只有与文档高度相同的高度——如果内容比较少或屏幕比较高,内容没有完全填充整个窗口,这个半透明的层将不能将整个页面盖住,或者,如果内容过多而出现滚动条,滚动下来的内容也将不会被盖住。
让我们用jQuery来搞定:
1 2 3 | $(document).ready(function(){ $("#shadow").css("height", $(document).height()).hide(); }); |
该语句将该页面的真实高度赋值到#shadow上,并将其隐藏(当然你也可以将.hide()去掉,并在样式表里面将#shadow设置display:none)。
请注意:视频的属性设置不可以有<param name=”wmode” value=”opaque” />设置,否则,在IE6中,视频也将会被覆盖。——神飞注。
我们只希望当lightSwitcher层被点击的时候,shadow层才会显示,这样我们就需要一个点击处理程序来控制lightSwitcher:
1 2 3 | $(".lightSwitcher").click(function(){ $("#shadow").toggle(); }); |
如果你现在就运行这个页面,你会发现它已经OK了。LightSwitcher 将会切换shadow 层为可视的——“灯已经关了”。唯一的不足是点击链接本身也在“黑暗中”,而且你将不能再次点击该链接了。
解决方法也是很简单的。LightSwitcher 必须有个比shadow层更大的z-index。为了实现这一点,这个层必须“绝对”定位到一个相对定位的并且z-index大于100的容器里面:
1 2 | #command { position:relative; height:25px; display:block;} .lightSwitcher {position:absolute; z-index:102; background:url(light_bulb.png) no-repeat 0 0; padding: 0;text-indent:20px; outline:none; text-decoration:none;} |
好了,现在可以了。
如果你看了演示,你可能会注意到,当你切换开关状态的时候,链接文字和图标也改变了。这也是通过CSS和jQuery来实现的。当你关灯以后,电灯泡图标和文字改变,文字颜色也变成了黄色。我们先定义关灯状态的链接样式:
1 | .turnedOff {color:#ff0; background-position:0 -50px;} |
扩展后的点击处理程序:
1 2 3 4 5 6 7 | $(".lightSwitcher").click(function(){ $("#shadow").toggle(); if ($("#shadow").is(":hidden")) $(this).html("关灯").removeClass("turnedOff"); else $(this).html("开灯").addClass("turnedOff"); }); |
现在我们完全的实现了开关转换的功能了,最后,完整的代码将看起来是这样的:
CSS
1 2 3 4 5 6 7 8 9 | body{font:13px "微软雅黑", Arial, Sans-Serif; text-align:center;margin:0;position:relative;} #container { width:960px; margin:0px auto; text-align:left; overflow:hidden; position:relative;} #movie {border:solid 1px #dcdcdc; float:left; width:560px; text-align:left; margin-right:20px;} #description { float:left; width:320px;border:solid 1px #dcdcdc; padding: 10px 20px;} #command { position:relative; height:25px; display:block; margin: 25px 0 0 0;} .lightSwitcher ,.turnedOff{position:absolute; z-index:102;background:url(light_bulb.png) no-repeat 0 0; padding: 0;text-indent:20px; outline:none; text-decoration:none;} .lightSwitcher:hover {text-decoration:underline;} #shadow {background:#000;position:absolute;left:0;top:0;width:100%;z-index:100;opacity:0.80;filter: alpha(opacity = 80);zoom:1;} .turnedOff {color:#ff0;background-position:0 -50px;} |
jQuery
1 2 3 4 5 6 7 8 9 10 | $(document).ready(function(){ $("#shadow").css("height", $(document).height()).hide(); $(".lightSwitcher").click(function(){ $("#shadow").toggle(); if ($("#shadow").is(":hidden")) $(this).html("关灯").removeClass("turnedOff"); else $(this).html("开灯").addClass("turnedOff"); }); }); |
注:本文原作者使用一个半透明的png图片平铺来实现#shadow层的半透明效果,也可以使用RGBa背景色来实现,我这里是利用背景色的半透明(opacity)来实现的,这三种方法在非IE浏览器中的效果是一致的。但是这三种方法在IE中都需要IE的专用滤镜来实现。经过测试,演示页面在IE各版本可以正常显示,但是对于IE6,由于IE6的诡异的z-index的bug,shadow层会完全盖住视频以外的所有内容,包括切换链接。
另外,由于最近YouTuBe被GFW墙了,我将原文链接的一个YouTuBe的视频更换为土豆的一个视频,该视频为Beyond的一首不太流行但是非常好听的歌曲《完全的爱吧》,希望大家能够喜欢。

哥们,你的在国内可以上youtube吗?难道没被河蟹??
看不了,所以那个demo用的是土豆的视频。
不过这个马来西亚的不插电 倒是不错的。
老大,我在成都,最近需要弄一个前端开发的规范,可是前端观察的访问速度忽然慢下来了。
实在抱歉,国外的空间,可能不太稳定,你可以换个时间来访问。
看来我们又要想办法提速了。
恩,以前都挺快的啊。想办法提速提速,呵。
看完了要开灯啊
其实可以toggle body的背景颜色 这样不会影响用户对页面上的内容进行点击
思路不错
只能关不能开
这个遇到了著名的IE6和IE7的z-index的bug,如果需要,可以调整一下页面的代码结构。
好像和MXZCMS的play.js冲突了~应该如何解决呢