表达式后面的先执行

  1. translateScale.style.webkitTransform = 'translate(30px) scale(1.5)';

rotate,skew,scale,translate:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. *{margin: 0;padding: 0;}
  10. .con{
  11. width: 100px;
  12. height: 100px;
  13. border:1px solid green;
  14. display: flex;
  15. margin-bottom: 10px;
  16. }
  17. .translate-scale,.translate,.scale,.skew,.rotate{
  18. width: 50px;
  19. height: 50px;
  20. background: orange;
  21. margin: auto;
  22. line-height: 50px;
  23. text-align: center;
  24. color: #ffffff;
  25. transition: all .5s;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <h1>transform2D 变换</h1>
  31. <h3>旋转</h3>
  32. <div class="con">
  33. <div class="rotate">
  34. 旋转
  35. </div>
  36. </div>
  37. <h3>斜切</h3>
  38. <div class="con">
  39. <div class="skew">
  40. 斜切
  41. </div>
  42. </div>
  43. <h3>缩放</h3>
  44. <div class="con">
  45. <div class="scale">
  46. 缩放
  47. </div>
  48. </div>
  49. <h3>位移</h3>
  50. <div class="con">
  51. <div class="translate">
  52. 位移
  53. </div>
  54. </div>
  55. <h3>位移+缩放</h3>
  56. <div class="con">
  57. <div class="translate-scale">
  58. 位移+缩放
  59. </div>
  60. </div>
  61. <script>
  62. // 旋转
  63. var rotate = document.querySelector('.rotate');
  64. // 围绕中心点旋转,默认为顺时针
  65. rotate.addEventListener('touchstart',(e)=>{
  66. rotate.style.webkitTransform = 'rotate(90deg)';
  67. });
  68. // 斜切
  69. var skew = document.querySelector('.skew');
  70. // X,Y方向, 围绕中心点(默认)拉两个角
  71. skew.addEventListener('touchstart',(e)=>{
  72. skew.style.webkitTransform = 'skewX(30deg) skewY(45deg)';
  73. });
  74. // 缩放
  75. var scale = document.querySelector('.scale');
  76. // 传数字(无单位),基于原来的大小,围绕中心点(默认)X,Y
  77. scale.addEventListener('touchstart',(e)=>{
  78. // scale.style.webkitTransform = 'scale(2)';
  79. // scale.style.webkitTransform = 'scale(1.5,2)';
  80. scale.style.webkitTransform = 'rotate(360deg) scale(0.1)';
  81. });
  82. // 位移px,默认为 X轴
  83. var translate = document.querySelector('.translate');
  84. // X,Y可以为负值
  85. translate.addEventListener('touchstart',(e)=>{
  86. //translate.style.webkitTransform = 'translate(25px, 25px)';
  87. translate.style.webkitTransform = 'rotate(360deg) translate(-50px,50px) scale(0.1)';
  88. });
  89. // 位移+缩放
  90. var translateScale = document.querySelector('.translate-scale');
  91. // X,Y可以为负值
  92. translateScale.addEventListener('touchstart',(e)=>{
  93. // 表达式后面的先执行
  94. translateScale.style.webkitTransform = 'translate(30px) scale(2)';
  95. });
  96. </script>
  97. </body>
  98. </html>

3D变换:

位移translate,向Z轴移动-100,效果非常微弱,几乎看不出变化。
加CSS:

/ 景深 /
perspective: 50px;

  1. .con{
  2. width: 100px;
  3. height: 100px;
  4. border:1px solid green;
  5. display: flex;
  6. margin-bottom: 10px;
  7. /* 景深 */
  8. perspective: 50px;
  9. }

perspective:景深
简单来说,就是设置这个属性后,那么,就可以模拟出像我们人看电脑上的显示的元素一样。比如说, perspective:800px 意思就是,我在离屏幕800px 的地方观看这个元素。(这个属性,要设置在父元素上面)。
image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Transform</title>
  8. <style>
  9. *{margin: 0;padding: 0;}
  10. .con{
  11. width: 100px;
  12. height: 100px;
  13. border:1px solid green;
  14. display: flex;
  15. margin-bottom: 10px;
  16. /* 景深 */
  17. perspective: 50px;
  18. }
  19. .translate-scale,.translate,.scale,.skew,.rotate{
  20. width: 50px;
  21. height: 50px;
  22. background: orange;
  23. margin: auto;
  24. line-height: 50px;
  25. text-align: center;
  26. color: #ffffff;
  27. transition: all .5s;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <h1>transform3D变换</h1>
  33. <h3>旋转</h3>
  34. <div class="con">
  35. <div class="rotate">
  36. 旋转
  37. </div>
  38. </div>
  39. <h3>位移</h3>
  40. <div class="con">
  41. <div class="translate">
  42. 位移
  43. </div>
  44. </div>
  45. </body>
  46. <script>
  47. // 旋转
  48. var rotate = document.querySelector(".rotate");
  49. rotate.addEventListener("touchstart",()=>{
  50. rotate.style.WebkitTransform = "rotateZ(45deg)";
  51. })
  52. // 位移
  53. var translate = document.querySelector(".translate");
  54. translate.addEventListener("touchstart",()=>{
  55. translate.style.WebkitTransform = "translateZ(-100px)";
  56. })
  57. </script>
  58. </html>

父级和子级都有3D效果,子级的效果如果被父级覆盖,则需要在父级元素上加:

  1. transform-style: preserve-3d;
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>transform-style</title>
  8. <style>
  9. .div1{
  10. position: relative;
  11. height: 300px;
  12. width: 300px;
  13. padding:20px;
  14. border: 1px solid gray;
  15. }
  16. .div2{
  17. padding:50px;
  18. position: absolute;
  19. border: 1px solid black;
  20. background-color: green;
  21. /* 3D转换 */
  22. transform: rotateY(60deg);
  23. /* 父级 */
  24. transform-style: preserve-3d;
  25. }
  26. .div3{
  27. padding:30px;
  28. position: absolute;
  29. border: 1px solid black;
  30. background-color: orange;
  31. /* 3D转换 */
  32. transform: rotateY(-60deg);
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="div1">
  38. <div class="div2">我是div2,父级
  39. <div class="div3">div3</div>
  40. </div>
  41. </div>
  42. </body>
  43. </html>

第一个封装版本:

  1. function cssTransform(ele, attr, val){
  2. // ele:操作的元素
  3. // 运动属性
  4. // val 具体的值
  5. if(!ele.transform){
  6. ele.transform = {};
  7. }
  8. if (typeof val === 'undefined'){
  9. // 取不到值的话,给默认值
  10. if(typeof ele.transform[attr] === "undefined") {
  11. switch(attr){
  12. case 'scale':
  13. case 'scaleX':
  14. case 'scaleY':
  15. case 'scaleZ':
  16. ele.transform[attr] = 1;
  17. break;
  18. default:
  19. ele.transform[attr] = 0;
  20. }
  21. }
  22. // 取值
  23. return ele.transform[attr];
  24. }
  25. else {
  26. // 设置值
  27. ele.transform[attr] = val;
  28. let transformValue = '';
  29. for(var name in ele.transform) {
  30. switch(name){
  31. case "scale":
  32. case "scaleX":
  33. case "scaleY":
  34. case "scaleZ":
  35. transformValue += "" + name + "(" + (ele.transform[name]) + ")";
  36. break;
  37. case "rotate":
  38. case "rotateX":
  39. case "rotateY":
  40. case "rotateZ":
  41. case "skewX":
  42. case "skewY":
  43. transformValue += "" + name + "(" + (ele.transform[name]) + "deg)";
  44. break;
  45. default:
  46. transformValue += "" + name + "(" + (ele.transform[name]) + "px)";
  47. }
  48. ele.style.webkitTransform = ele.style.transform = transformValue;
  49. }
  50. }
  51. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. *{margin: 0;padding: 0;}
  10. .con{
  11. width: 100px;
  12. height: 100px;
  13. border:1px solid green;
  14. display: flex;
  15. margin-bottom: 10px;
  16. }
  17. .translate-scale,.translate,.scale,.skew,.rotate{
  18. width: 50px;
  19. height: 50px;
  20. background: orange;
  21. margin: auto;
  22. line-height: 50px;
  23. text-align: center;
  24. color: #ffffff;
  25. transition: all .5s;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <h1>transform2D变换</h1>
  31. <h3>旋转</h3>
  32. <div class="con">
  33. <div class="rotate">
  34. 旋转
  35. </div>
  36. </div>
  37. <h3>斜切</h3>
  38. <div class="con">
  39. <div class="skew">
  40. 斜切
  41. </div>
  42. </div>
  43. <script src="./transform1.0.js"></script>
  44. <script>
  45. var rotate = document.querySelector('.rotate');
  46. rotate.addEventListener('touchstart',(e)=>{
  47. cssTransform(rotate, 'rotate', 90);
  48. cssTransform(rotate, 'scale', 2);
  49. });
  50. </script>
  51. </body>
  52. </html>

注意:

定义变量时,使用一个var比使用多个var效率更高。

  1. var d =1, d1=2, d2=3;
  2. var d=1;
  3. var d1=2;
  4. var d2=3;

第二个版本:

  1. function Transform(element){
  2. var units = {},
  3. transform,
  4. transforms = {},
  5. attrs = ['scale', 'scaleX','scaleY','scaleZ', 'rotate', 'rotateX', 'rotateY', 'rotateZ','skew', 'skewX', 'skewY', 'translate', 'translateX', 'translateY', 'translateZ'];
  6. attrs.forEach(function(attr){
  7. if (attr.indexOf('scale') >= 0){
  8. units[attr] = '';
  9. // 设置默认值
  10. transforms[attr] = 1;
  11. }
  12. else {
  13. units[attr] = attr.indexOf('translate') >= 0 ? 'px' : 'deg';
  14. // 设置默认值
  15. transforms[attr] = 0;
  16. }
  17. // 在对象上定义一个属性
  18. Object.defineProperty(element, attr, {
  19. get: function(){
  20. return transforms[attr];
  21. },
  22. set: function(value){
  23. transform = '';
  24. transforms[attr] = value;
  25. attrs.forEach(function(attr){
  26. transform += attr + '(' + transforms[attr] + units[attr] + ')';
  27. });
  28. console.log(transform);
  29. element.style.transform = transform;
  30. }
  31. });
  32. });
  33. }

DOM 赋能:
Transform(rotate);

  1. <script>
  2. var rotate = document.querySelector('.rotate');
  3. rotate.addEventListener('touchstart',(e)=>{
  4. // DOM 赋能
  5. Transform(rotate);
  6. rotate.rotate = 90;
  7. var deg = rotate.rotate;
  8. console.log(deg);
  9. });
  10. </script>

image.png

移动端自定义滑动区域

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. body{
  10. margin: 0;
  11. padding: 0;
  12. }
  13. body,html{
  14. height: 100%;
  15. overflow: hidden;
  16. position: relative;
  17. }
  18. header{
  19. width: 100%;
  20. height: 40px;
  21. background: greenyellow;
  22. color: black;
  23. line-height: 40px;
  24. text-align: center;
  25. }
  26. #wrap{
  27. position: absolute;
  28. top:40px;
  29. bottom: 0;
  30. right: 0;
  31. left: 0;
  32. overflow: hidden;
  33. }
  34. #list{
  35. margin: 0;
  36. padding: 0;
  37. list-style: none;
  38. }
  39. #list li{
  40. background: #ffffff;
  41. color: #333333;
  42. height: 40px;
  43. line-height: 40px;
  44. border-bottom: 1px solid #999999;
  45. text-indent: 20px;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <header>
  51. 我是Header
  52. </header>
  53. <div id="wrap">
  54. <ul id="list"></ul>
  55. </div>
  56. <script>
  57. function $my(id){
  58. return document.getElementById(id);
  59. }
  60. function initList(){
  61. var list = $my('list');
  62. var html = '';
  63. for(var i=0; i<80; i++){
  64. html += '<li>第' + (i+1) + '个</li>';
  65. }
  66. list.innerHTML = html;
  67. }
  68. initList();
  69. var wrap = $my('wrap');
  70. var lists = $my('list');
  71. var startY = 0;
  72. lists.addEventListener('touchstart', (e)=>{
  73. startY = e.changedTouches[0].pageY;
  74. });
  75. lists.addEventListener('touchmove', (e)=>{
  76. var moveY = e.changedTouches[0].pageY;
  77. // 距离 = 起始点 - 活动点
  78. var distance = moveY - startY;
  79. if (distance < 0) {
  80. lists.style.webkitTransform = lists.style.transform =
  81. 'translateY(' + distance + 'px)';
  82. }
  83. });
  84. </script>
  85. </body>
  86. </html>