zoukankan      html  css  js  c++  java
  • 一个很简单的淡入淡出相册(转)

    不知题目是否妥当,总之就是在相册中使用fade效果,让图片切换变得非常自然舒服。

    添加样式,目标是让所有图片像叠罗汉一样摞在一起。

    01.#album{
    02.  position:relative;
    03.  border:10px solid #000;
    04.  90px;
    05.  height:120px;
    06.  overflow:hidden;
    07.}
    08.#album img{
    09.  position:absolute;
    10.  top:0;
    11.  left:0;
    12.}

    下面详细讲解一下淡入谈出相册的运作。尽管相册有许多相片,每次运行都是执行两张相片的透明度设置。并且当上面一张(我们看到的那张)正准备淡出时,下面那张已淡入得差不多。换言之,我们要想办法错开两张图片的出场时间。由于淡入淡出(fade)其实是透明特效加display的切换,如何取得opacity样式值呢?要知道,设置样式与获取样式,完全不是一回事。获取样式远比设置样式复杂,如果不是内联样式,在IE中就要调用currentStyle加遍历父级元素。一个取巧的办法,就是不要在获取opacity中下工夫,直接设置一个自定义属性opacity(非style.opacity),每次执行透明度设置时用这个opacity赋值,并每次一点点改变这个opacity的值。正在淡出的图片对象的opacity呈递减状态,反之亦然。

    01.var album = function(el){
    02.  var node = (typeof el == "string")? document.getElementById(el):el;
    03.  var images = node.getElementsByTagName("img");
    04.  var length = images.length;
    05.  for(var i=1;i<length;i++) images[i].opacity = 0;//为所有图片设置一个自定义属性opacity
    06.  images[0].opacity = 0.99;
    07.  var current = 0;
    08.  (function(){
    09.    setTimeout(function(){
    10.      var cOpacity = images[current].opacity,
    11.      next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张
    12.      var nOpacity = images[next].opacity;
    13.      cOpacity-=.05;
    14.      nOpacity+=.05;
    15.      images[current].opacity = cOpacity;
    16.      images[next].opacity = nOpacity;
    17.      images[next].style.display = "block";//确保肯定有一张图片是可见的
    18.      setOpacity(images[current]);
    19.      setOpacity(images[next]);
    20.      if(cOpacity<=0) {
    21.        images[current].style.display = "none";
    22.        current = next;
    23.        setTimeout(arguments.callee,1000);
    24.      }else{
    25.        setTimeout(arguments.callee,50);
    26.      }
    27.    },100)
    28.  })()
    29.}
    30.var setOpacity =function(obj) {
    31.  if(obj.opacity>.99) {
    32.    obj.opacity = .99;
    33.  }
    34.  obj.style.opacity = obj.opacity;
    35.  obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")";
    36.}

    ablum函数中的闭包相当于:

    01.var repeat = function(){
    02.  setTimeout(function(){
    03.    //*************略*************
    04.    if(cOpacity<=0) {
    05.      images[current].style.display = "none";
    06.      current = next;
    07.      setTimeout(repeat,1000);
    08.    }else{
    09.      setTimeout(repeat,50);
    10.    }
    11.  },100)
    12.  repeat();

    闭包让我们少写许多东西,程序变得更紧凑。我们甚至可以搞个点击停顿效果,不过说实话,只是个假象而已,只能让它多停留两秒。你多点击几下,这张图片就静止久一点。我可不想点击一下整个相册就不动了。

    01.var album = function(el){
    02.  var node = (typeof el == "string")? document.getElementById(el):el;
    03.  var images = node.getElementsByTagName("img");
    04.  var length = images.length;
    05.  var current = 0;
    06.  for(var i=1;i<length;i++){
    07.    images[i].opacity = 0;//为所有图片设置一个自定义属性opacity
    08.    images[i].onclick = (function(i){//点击停顿效果
    09.      return function(){
    10.        current = i + 1;
    11.        if(current > 3)
    12.          current = 3
    13.      }
    14.    })(i);
    15.  }
    16.  images[0].opacity = 0.99;
    17.  (function(){
    18.    setTimeout(function(){
    19.      var cOpacity = images[current].opacity,
    20.      next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张
    21.      var nOpacity = images[next].opacity;
    22.      cOpacity-=.05;
    23.      nOpacity+=.05;
    24.      images[current].opacity = cOpacity;
    25.      images[next].opacity = nOpacity;
    26.      images[next].style.display = "block";//确保肯定有一张图片是可见的
    27.      setOpacity(images[current]);
    28.      setOpacity(images[next]);
    29.      if(cOpacity<=0) {
    30.        images[current].style.display = "none";
    31.        current = next;
    32.        setTimeout(arguments.callee,1000);
    33.      }else{
    34.        setTimeout(arguments.callee,50);
    35.      }
    36.    },100)
    37.  })()
    38.}
    39.var setOpacity =function(obj) {
    40.  if(obj.opacity>.99) {
    41.    obj.opacity = .99;
    42.  }
    43.  obj.style.opacity = obj.opacity;
    44.  obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")";
    45.}

    好了本文就到止了,简单的结构层与表现层注定了行为层不会有多大作为。相册如果要做得很漂亮,通常需要动用到定义列表与伪类,随之而来的是几百行javascript代码,显然这与我的题目不符。另,基于时间轴来编写代码太考验人的思维能力,没有可视化界面吓跑一堆人,都跑去做Flash了。


    来源:http://www.cnblogs.com/rubylouvre/archive/2009/09/14/1566157.html
  • 相关阅读:
    rbd-mirror新功能
    ceph查询rbd的使用容量(快速)
    Ceph Bluestore首测
    让磁盘硬盘灯常闪定位盘
    aa
    地理围栏
    Can't connect to MySQL server on localhost (10061)解决方法
    经典智力题
    MEF程序设计指南
    ESRI.ArcGIS.AnalysisTools.Erase 结果是空?
  • 原文地址:https://www.cnblogs.com/luluping/p/1567542.html
Copyright © 2011-2022 走看看