You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
snabbdom/modules/style.js

51 lines
1.5 KiB
JavaScript

var raf = requestAnimationFrame || setTimeout;
var nextFrame = function(fn) { raf(function() { raf(fn); }); };
function setNextFrame(obj, prop, val) {
nextFrame(function() { obj[prop] = val; });
}
function updateStyle(oldVnode, vnode) {
var cur, name, elm = vnode.elm,
oldStyle = oldVnode.data.style || {},
style = vnode.data.style || {};
for (name in style) {
cur = style[name];
if (name !== 'remove' &&
cur !== oldStyle[name]) {
if (name[0] === 'd' && name[1] === '-') {
setNextFrame(elm.style, name.slice(2), cur);
} else {
elm.style[name] = cur;
}
}
}
}
function applyRemoveStyle(vnode, rm) {
var s = vnode.data.style;
if (!s || !s.remove) return;
var cur, name, elm = vnode.elm, idx, i = 0, maxDur = 0,
compStyle, style = s.remove;
var applied = [];
for (name in style) {
applied.push(name);
elm.style[name] = style[name];
}
if (applied.length > 0) {
compStyle = getComputedStyle(elm);
var dels = compStyle['transition-delay'].split(', ');
var durs = compStyle['transition-duration'].split(', ');
var props = compStyle['transition-property'].split(', ');
for (; i < applied.length; ++i) {
idx = props.indexOf(applied[i]);
if (idx !== -1) maxDur = Math.max(maxDur, parseFloat(dels[idx]) + parseFloat(durs[idx]));
}
setTimeout(rm, maxDur * 1000); // s to ms
} else {
rm();
}
}
module.exports = {create: updateStyle, update: updateStyle, remove: applyRemoveStyle};