const css = (el, attr) => {let transformAttr = ['rotate', 'rotateX', 'rotateY', 'rotateZ', 'skewX', 'skewY', 'scale', 'scaleX', 'scaleY','translateX', 'translateY', 'translateZ'];const type = o => {let str = Object.prototype.toString.call(o);return str.match(/\[object (.*)\]/)[1].toLowerCase();}//true => 获取 false => 设置const getOrSet = type(attr) == 'object' ? false : true; //用来检测用户到底要做哪种操作if (getOrSet) {// 要做的事情是获取(第二个参数为字符串)if (transformAttr.includes(attr)) { //如果为真的话代表要获取css3的属性return transform();} else {// 获取css2的属性return parseFloat(getComputedStyle(el)[attr]);}} else {// 要做的事情是设置(第二个参数为对象)const attrKeys = Object.keys(attr); // 把用户要设置的属性名存到一个数组里for (let v of attrKeys) {el.style[v] = v == 'opacity' ? attr[v] : attr[v] + 'px';}// 设置css3的属性transform(attrKeys); // 把用户要设置的所有属性的名字做为参数传进去}// 获取以及设置css3的属性function transform(attrKeys) {// el.transform={}; // 用来存储用户已经设置过的所有css3的属性if (!el.transform) { // 如果是第一次进来的话,元素身上是没有这条属性的,那就给它一个el.transform = {}}// 获取if (getOrSet) { // 此时用户传的第二个参数为字符串// 如果用户没有设置过某个属性,那去获取的时候就会得到一个undefined。解决的方案就是,需要判断一下这条属性有没有被设置过,如果没有被设置过的话,就需要给他返回一个默认值if (!Object.keys(el.transform).includes(attr)) { // 如果这个条件不成立就代表没有设置过if (attr == 'scale') { // 因为scale与其它属性的默认值是不一样的,所以判断return 1;} else {return 0;}}return el.transform[attr];}// 当代码走到这里的时候,代表是要设置属性for (let v of attrKeys) { // 这一步是把用户要设置的所有属性存到el.transformel.transform[v] = attr[v];}// 下面才是真正给元素身上添加属性/*rotate degskew degscaletranslate px*/let str = ''; // 用来拼接所有要设置的属性(transform) transform: rotate(60deg) scale(2) translateY(100px);for (let v in el.transform) {switch (v) {case 'rotate':case 'rotateX':case 'rotateY':case 'rotateZ':case 'skewX':case 'skewY':str += v + `(${el.transform[v]}deg) `;break;case 'scale':case 'scaleX':case 'scaleY':str += v + `(${el.transform[v]}) `;break;case 'translateX':case 'translateY':case 'translateZ':str += v + `(${el.transform[v]}px) `;break;}}el.style.transform = str;}}
