<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      鼠標控制CSS矩陣變換示例


       

      鼠標控制CSS的transform matrix來實現縮放和移動:

       

        1 <!DOCTYPE html>
        2 <html>
        3 <head>
        4     <style>
        5         #target {
        6             width: 200px;
        7             height: 200px;
        8             background: #3498db;
        9             position: absolute;
       10             left: 50%;
       11             top: 50%;
       12             transform-origin: 0 0;
       13             cursor: grab;
       14         }
       15     </style>
       16 </head>
       17 <body>
       18     <div id="target"></div>
       19 
       20     <script>
       21         const target = document.getElementById('target');
       22         let isDragging = false;
       23         let startX, startY;
       24         let currentTX = 0, currentTY = 0;
       25         let currentScale = 1;
       26 
       27         // 鼠標按下事件(開始拖拽)
       28         target.addEventListener('mousedown', (e) => {
       29             isDragging = true;
       30             startX = e.clientX;
       31             startY = e.clientY;
       32             const matrix = parseMatrix(target.style.transform);
       33             currentTX = matrix.tx;
       34             currentTY = matrix.ty;
       35             target.style.cursor = 'grabbing';
       36         });
       37 
       38         // 鼠標移動事件(拖拽處理)
       39         document.addEventListener('mousemove', (e) => {
       40             if (!isDragging) return;
       41             
       42             const deltaX = e.clientX - startX;
       43             const deltaY = e.clientY - startY;
       44             
       45             target.style.transform = `matrix(
       46                 ${currentScale}, 0, 0, ${currentScale}, 
       47                 ${currentTX + deltaX}, ${currentTY + deltaY}
       48             )`;
       49         });
       50 
       51         // 鼠標釋放事件(結束拖拽)
       52         document.addEventListener('mouseup', () => {
       53             isDragging = false;
       54             const matrix = parseMatrix(target.style.transform);
       55             currentTX = matrix.tx;
       56             currentTY = matrix.ty;
       57             target.style.cursor = 'grab';
       58         });
       59 
       60         // 滾輪事件(縮放處理)
       61         target.addEventListener('wheel', (e) => {
       62             e.preventDefault();
       63             const factor = e.deltaY > 0 ? 0.9 : 1.1;
       64             const rect = target.getBoundingClientRect();
       65             
       66             // 計算鼠標相對元素的位置
       67             const x = e.clientX;
       68             const y = e.clientY;
       69             const localX = (x - currentTX) / currentScale;
       70             const localY = (y - currentTY) / currentScale;
       71             
       72             // 計算新的縮放比例和平移量
       73             const newScale = currentScale * factor;
       74             const newTX = x - localX * newScale;
       75             const newTY = y - localY * newScale;
       76             
       77             // 更新參數并應用變換
       78             currentScale = newScale;
       79             currentTX = newTX;
       80             currentTY = newTY;
       81             
       82             target.style.transform = `matrix(
       83                 ${newScale}, 0, 0, ${newScale}, 
       84                 ${newTX}, ${newTY}
       85             )`;
       86         });
       87 
       88         // 解析 transform matrix 的輔助函數
       89         function parseMatrix(transform) {
       90             if (!transform || transform === 'none') {
       91                 return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };
       92             }
       93             const matrix = transform.match(/matrix\(([^)]+)\)/)[1].split(/, /).map(parseFloat);
       94             return {
       95                 a: matrix[0],
       96                 b: matrix[1],
       97                 c: matrix[2],
       98                 d: matrix[3],
       99                 tx: matrix[4],
      100                 ty: matrix[5]
      101             };
      102         }
      103     </script>
      104 </body>
      105 </html>

       

      posted @ 2025-03-27 10:12  地yu荒冢  閱讀(19)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品一区二区三区激情| 国产成人精品一区二区三| 久久久亚洲欧洲日产国码αv| 久久夜色精品国产亚洲av| 国产一级小视频| 激情六月丁香婷婷四房播| 国产成人亚洲日韩欧美| 久久热这里只有精品66| 太仆寺旗| 欧美不卡无线在线一二三区观| 亚洲第一无码专区天堂 | 亚洲成人精品综合在线| 国产日韩av二区三区| 欧美日本在线一区二区三区| 久久99精品九九九久久婷婷| 99麻豆久久精品一区二区| 欧美老少配性行为| 制服丝袜人妻有码无码中文字幕| 高雄县| 免费费很色大片欧一二区| 2020国产欧洲精品网站| 免费国产午夜理论片不卡| 亚洲国产欧美在线人成aaaa| 亚洲国产精品午夜福利| 久99久热这里只有精品| 日韩精品区一区二区三vr| 国产尤物精品自在拍视频首页 | 久久婷婷成人综合色综合| 色播久久人人爽人人爽人人片av| 麻豆久久天天躁夜夜狠狠躁| 男人的天堂av社区在线| 熟女系列丰满熟妇AV| 国产偷国产偷亚洲高清午夜| 亚洲色一区二区三区四区| 日本大片在线看黄a∨免费| 绥阳县| 天堂V亚洲国产V第一次| 色九九视频| 99久久久无码国产精品动漫| 老司机午夜福利视频| 亚洲精品乱码久久久久久蜜桃 |