JavaScript Fader

Beispiel: ohne großes Framework
fader.htm HTML (5,67 kByte) 04.04.2021 17:35
<!DOCTYPE html >
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Fader</title>
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: " />
    <style type="text/css">
      body {margin:0; padding:0;}
.fader {position:absolute; top:0; left:0; margin:0; padding:0; width:100%; height:100%; overflow:hidden;}
    </style>
    <script type="text/javascript">
      /* <![CDATA[ */
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function(callback){
            window.setTimeout(callback, 1000 / 60);
          };
})();

function getOpacity(el, def) {
  var result;
  var style=document.defaultView.getComputedStyle(el, null);
  if ('opacity' in style) {
    result = style.opacity;
  } else if ('MozOpacity' in style) {
    result = style.MozOpacity;
  } else if ('filter' in style) {
    var match = style.filter.match(/alpha\(opacity=([\d.]+)\)/);
    if (match) {
      result = String(match[1] / 100);
    }
  };
  result = parseInt(result);
  if (!isNaN(result)) result = def;
  return result;
}
function setOpacity(el, val) {
  el.style.opacity = val;
  el.style.MozOpacity = val;
  el.style.filter = "alpha(opacity=" + (val*100) + ")";
}
function animate(elem, attr, dest, callback) {
  var from, attribute = attr, to = dest, fc = callback, el = elem;
  if (attribute == 'opacity') {
    from = parseInt(getOpacity(el, (to == '0' ? '1' : '0')));
  } else {
    if (el.style.getPropertyValue) {
      from = parseInt(el.style.getPropertyValue(attribute));
    } else {
      from = parseInt(el.style.getAttribute(attribute));
    }
  };
  if (from == to) return;
  var start = Date.now();
  var output = document.getElementById('output');
  var tick = function() {
    var t = Math.min(1, ((Date.now() - start) / 1000));
    var eased = t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1;
    var val = (eased * (to - from)) + from;
    if (attribute == 'opacity') {
      setOpacity(el, val);
    } else {
      if (el.style.setProperty) {
        el.style.setProperty(attribute, val + "px");
      } else {
        el.style.setAttribute(attribute, val + "px");
      }
    };
    if (t<1) {
      window.requestAnimFrame(tick);
    } else {
      if (fc) fc();
    }
  };
  tick();
}

function getElementsByClassName(searchClass, tagName, domNode) {
  if (domNode == null) domNode = document;
  if (tagName == null) tagName = '*';
  var el = new Array();
  var tags = domNode.getElementsByTagName(tagName);
  var tcl = " "+searchClass+" ";
  for(var i=0,j=0; i<tags.length; i++) {
    var test = " " + tags[i].className + " ";
    if (test.indexOf(tcl) != -1) {
      el[j++] = tags[i];
    }
  };
  return el;
}

function getChildNodes(parentElement, tagName) {
  var childs = parentElement.childNodes;
  var children = [];
  for (var i=0; i<childs.length; i++) {
    if (((childs[i].nodeType == 1) ? childs[i].tagName.toLowerCase() : '') == tagName) {
      children.push(childs[i]);
    }
  };
  return children;
}

function jsFader(){
  this.obj = null;
  this.items = [];
  this.currentFade = 0;
}
jsFader.prototype = {
  fit: function(el) {
    var img = el || this.items[this.currentFade];
    if ((img.width / img.height) >= (this.obj.offsetWidth / this.obj.offsetHeight)) {
      img.style.width = 'auto';
      img.style.height = '100%';
      img.style.top = '0';
      img.style.left = -Math.floor((img.width - this.obj.offsetWidth) / 2) + 'px';
    } else {
      img.style.width = '100%';
      img.style.height = 'auto';
      img.style.top = -Math.floor((img.height - this.obj.offsetHeight) / 2) + 'px';
    }
  },
  fade: function() {
    var self = this;
    var last = this.items[this.currentFade];
    this.currentFade = this.items[this.currentFade+1] ? this.currentFade+1 : 0;
    var el = this.items[this.currentFade];
    this.fit(this.items[this.currentFade]);
    animate(el, 'opacity', '1');
    animate(last, 'opacity', '0');
    setTimeout(function() {self.fade();}, 3000);
  },
  init: function(fader) {
    var self = this;
    this.obj = fader;
    this.items = getChildNodes(fader, "img");
    for (var i=0; i<this.items.length; i++) {
      this.items[i].style.position = "absolute";
      this.items[i].style.top = "0px";
      this.items[i].style.left = "0px";
      this.fit(this.items[i]);
      if (i==0) {
        setOpacity(this.items[i], 1);
      } else {
        setOpacity(this.items[i], 0);
      }
    }
    setTimeout(function() {self.fade();}, 3000);
    if (window.addEventListener) {
      window.addEventListener('resize', function(event) {self.fit();});
    } else if (window.attachEvent) {
      window.attachEvent('onresize', function(event) {self.fit();});
    } else {
      window['onresize'] = function(event) {self.fit();};
    }
  }
}
function init() {
  var faderList = getElementsByClassName("fader", "div");
  for (var i=0; i<faderList.length; i++) {
    var fader = new jsFader();
    fader.init(faderList[i]);
  };
}

function ready(f){/complete|loaded/i.test(document.readyState)?f():setTimeout("ready("+f+")",9)}
ready(init);
/* ]]> */
    </script>
  </head>
  <body>
    <div class="fader"><img src="/media/IMG_6867.jpg" /><img src="/media/IMG_6868.jpg" /><img src="/media/IMG_6869.jpg" /><img src="/media/IMG_6870.jpg" /><img src="/media/IMG_6871.jpg" /><img src="/media/IMG_6872.jpg" /></div>
  </body>
</html>

Author: , published: , last modified:

Kontakt

Udo Schmal

Udo Schmal
Softwareentwickler
Olvengraben 41
47608 Geldern
Nordrhein-Westfalen
Germany





+49 2831 9776557
+49 1575 0663676
+49 2831 1328709
SMS
WhatsApp

Instagram Profile
vCard 3.0

Service Infos

CMS Info Product Name:
UDOs Webserver
Version:
0.5.0.101
Description:
All in one Webserver
Copyright:
Udo Schmal
Compilation:
Sun, 18. Jul 2021 17:42:24
Development Info Compiler:
Free Pascal FPC 3.3.1
compiled for:
OS:Linux, CPU:x86_64
System Info OS:
Ubuntu 20.04.2 LTS (Focal Fossa)
Hardware Info Model:
Hewlett-Packard HP Pavilion dv7 Notebook PC
CPU Name:
Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz
CPU Type:
x86_64, 1 physical CPU(s), 2 Core(s), 4 logical CPU(s), 1121.995 MHz