最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Most efficient way to set style using pure javascript? - Stack Overflow

programmeradmin2浏览0评论

What is the most efficient way to set multiple styling on elements in javascript?

for (i=0;i<=lastSelector;i++) {
var e = mySelector[i],
v = 'opacity 1s';
e.style.WebkitTransition = v;
e.style.MozTransition = v;
e.style.OTransition = v;
e.style.MsTransition = v;
e.style.transition = v;
e.style.opacity = 0;
};

What is the most efficient way to set multiple styling on elements in javascript?

for (i=0;i<=lastSelector;i++) {
var e = mySelector[i],
v = 'opacity 1s';
e.style.WebkitTransition = v;
e.style.MozTransition = v;
e.style.OTransition = v;
e.style.MsTransition = v;
e.style.transition = v;
e.style.opacity = 0;
};
Share Improve this question asked Jan 5, 2012 at 13:28 HakanHakan 3,88514 gold badges47 silver badges66 bronze badges 2
  • 3 If v is static, I would use a class and only add the class to the element. – Felix Kling Commented Jan 5, 2012 at 13:31
  • FelixKling, good point! In this case I will not have acess to CSS files :) – Hakan Commented Jan 5, 2012 at 13:34
Add a ment  | 

3 Answers 3

Reset to default 6

Pretty much that, you could use a stacked assignment:

for (i=0;i<=lastSelector;i++) {
  var e = mySelector[i];
  e.style.WebkitTransition =
    e.style.MozTransition =
      e.style.OTransition =
        e.style.MsTransition =
          e.style.transition =
            'opacity 1s';
  e.style.opacity = 0;
}

Since there are several of these properties where we have vendor-specific versions, you might consider a reusable function that does this, e.g.:

function setMultiVendorProp(style, propName, value) {
    // Set the non-vendor version
    style[propName] = value;

    // Make first char capped
    propName = propName.substring(0, 1).toUpperCase() + propName.substring(1);

    // Set vendor versions
    style["Webkit" + propName] = value;
    style["Moz" + propName] = value;
    style["O" + propName] = value;
    style["Ms" + propName] = value;

    // Done
    return value;
}

Or using the dashed style instead, since we're already using strings rather than identifiers:

function setMultiVendorProp(style, propName, value) {
    // Set the non-vendor version
    style[propName] = value;

    // Set vendor versions
    style["-webkit-" + propName] = value;
    style["-moz-" + propName] = value;
    style["-o-" + propName] = value;
    style["-ms-" + propName] = value;

    // Done
    return value;
}

Then:

for (i=0;i<=lastSelector;i++) {
  var e = mySelector[i];
  setMultiVendorProp(e.style, "transition", "opacity 1s");
  e.style.opacity = 0;
}

Side notes:

  • There's no ; after the closing } in a for statement.
  • var anywhere in a function is function-wide, so declaring var within non-function blocks inside the function is (slightly) misleading to the reader of the code; details: Poor, misunderstood var

You could try this:

var i,
    es,
    v = 'opacity 1s';
for (i=0;i<=lastSelector;i++) {
    es = mySelector[i].style;

    es.WebkitTransition = v;
    es.MozTransition = v;
    es.OTransition = v;
    es.MsTransition = v;
    es.transition = v;
    es.opacity = 0;
};

There's no need to set v = 'opacity 1s' every time you go through the loop, just set it once before the loop. And as long as we're moving the declaration of v note that JS only has function scope so declaring variables in a loop doesn't actually limit their scope to that loop.

Maybe in a function:

function setStyles(styles, element, value)
{
    for(var i=0,l=styles.length;i<l;i++)
        {
            if(p in element.style)
                element.style[p] = value;
        }
    };
}

So you can call:

var s = ['WebkitTransition','MozTransition','OTransition','MsTransition','transition'];
for (i=0;i<=lastSelector;i++) {
    var e = mySelector[i],
    v = 'opacity 1s';
    setStyles(s,e,v);
    e.style.opacity = 0;
};
发布评论

评论列表(0)

  1. 暂无评论