1. const css = (el, attr) => {
    2. let transformAttr = ['rotate', 'rotateX', 'rotateY', 'rotateZ', 'skewX', 'skewY', 'scale', 'scaleX', 'scaleY',
    3. 'translateX', 'translateY', 'translateZ'
    4. ];
    5. const type = o => {
    6. let str = Object.prototype.toString.call(o);
    7. return str.match(/\[object (.*)\]/)[1].toLowerCase();
    8. }
    9. //true => 获取 false => 设置
    10. const getOrSet = type(attr) == 'object' ? false : true; //用来检测用户到底要做哪种操作
    11. if (getOrSet) {
    12. // 要做的事情是获取(第二个参数为字符串)
    13. if (transformAttr.includes(attr)) { //如果为真的话代表要获取css3的属性
    14. return transform();
    15. } else {
    16. // 获取css2的属性
    17. return parseFloat(getComputedStyle(el)[attr]);
    18. }
    19. } else {
    20. // 要做的事情是设置(第二个参数为对象)
    21. const attrKeys = Object.keys(attr); // 把用户要设置的属性名存到一个数组里
    22. for (let v of attrKeys) {
    23. el.style[v] = v == 'opacity' ? attr[v] : attr[v] + 'px';
    24. }
    25. // 设置css3的属性
    26. transform(attrKeys); // 把用户要设置的所有属性的名字做为参数传进去
    27. }
    28. // 获取以及设置css3的属性
    29. function transform(attrKeys) {
    30. // el.transform={}; // 用来存储用户已经设置过的所有css3的属性
    31. if (!el.transform) { // 如果是第一次进来的话,元素身上是没有这条属性的,那就给它一个
    32. el.transform = {}
    33. }
    34. // 获取
    35. if (getOrSet) { // 此时用户传的第二个参数为字符串
    36. // 如果用户没有设置过某个属性,那去获取的时候就会得到一个undefined。解决的方案就是,需要判断一下这条属性有没有被设置过,如果没有被设置过的话,就需要给他返回一个默认值
    37. if (!Object.keys(el.transform).includes(attr)) { // 如果这个条件不成立就代表没有设置过
    38. if (attr == 'scale') { // 因为scale与其它属性的默认值是不一样的,所以判断
    39. return 1;
    40. } else {
    41. return 0;
    42. }
    43. }
    44. return el.transform[attr];
    45. }
    46. // 当代码走到这里的时候,代表是要设置属性
    47. for (let v of attrKeys) { // 这一步是把用户要设置的所有属性存到el.transform
    48. el.transform[v] = attr[v];
    49. }
    50. // 下面才是真正给元素身上添加属性
    51. /*
    52. rotate deg
    53. skew deg
    54. scale
    55. translate px
    56. */
    57. let str = ''; // 用来拼接所有要设置的属性(transform) transform: rotate(60deg) scale(2) translateY(100px);
    58. for (let v in el.transform) {
    59. switch (v) {
    60. case 'rotate':
    61. case 'rotateX':
    62. case 'rotateY':
    63. case 'rotateZ':
    64. case 'skewX':
    65. case 'skewY':
    66. str += v + `(${el.transform[v]}deg) `;
    67. break;
    68. case 'scale':
    69. case 'scaleX':
    70. case 'scaleY':
    71. str += v + `(${el.transform[v]}) `;
    72. break;
    73. case 'translateX':
    74. case 'translateY':
    75. case 'translateZ':
    76. str += v + `(${el.transform[v]}px) `;
    77. break;
    78. }
    79. }
    80. el.style.transform = str;
    81. }
    82. }