<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="./jquery.js"></script><style> *{ margin: 0; padding: 0; box-sizing: border-box; } #box{ width: 1280px; height: 720px; position: absolute; top: 50%; left: 50%; margin-top: -360px; margin-left: -640px; box-shadow: 0 0 10px rgba(0,0,0,.5); } #boxInner{ width: 100%; height: 100%; position: relative; } #divBox{ width: 200px; height: 200px; position: absolute; top: 64px; left: 128px; background-color: olivedrab; } .inner{ width: 100%; height: 100%; position: relative; } .bot{ width: 14px; height: 14px; background-color: red; position: absolute; } .bot1{ left: -14px; top: -14px; } .bot2{ left: 50%; margin-left: -7px; top: -14px; } .bot3{ top: -14px; right: -14px; } .bot4{ top: 50%; margin-top: -7px; left: -14px; } .bot5{ top: 50%; margin-top: -7px; right: -14px; } .bot6{ left: -14px; bottom: -14px; } .bot7{ left: 50%; margin-left: -7px; bottom: -14px; } .bot8{ right: -14px; bottom: -14px; } .rotate{ width: 14px; height: 14px; background-color: black; position: absolute; top: 50%; margin-top: -7px; right: -30px; }</style>
</head>
<body>
<div id="box"> <div id="boxInner"> <div id="divBox"> <div class="inner"> <div id="tl" class="bot bot1"></div> <div id="tm" class="bot bot2"></div> <div id="tr" class="bot bot3"></div> <div id="ml" class="bot bot4"></div> <div id="mr" class="bot bot5"></div> <div id="bl" class="bot bot6"></div> <div id="bm" class="bot bot7"></div> <div id="br" class="bot bot8"></div> <div class="rotate"></div> </div> </div> </div></div><script>$(function(){ $('#divBox').on('mousedown',function(e){ e.stopPropagation(); e.preventDefault() $(this).css('cursor','move'); let isMove = true; let x = e.clientX; let y = e.clientY; let l = parseInt($(this).css('left')); let t = parseInt($(this).css('top')); let moveEvent = null; $('#box').on('mousemove',function(ev){ moveEvent = ev; if(!isMove){ return } ev.stopPropagation() ev.preventDefault(); let nx = ev.clientX; let ny = ev.clientY; let nl = nx-(x-l); let nt = ny-(y-t); $('#divBox').css({ top: nt+'px', left: nl+'px' }) }) $('#box').on('mouseup',function(event){ event.preventDefault(); isMove = false; $('#divBox').css('cursor','auto'); $(this).off(event) $(this).off(moveEvent) return false; }) }) $('.bot').on('mousedown',function(e){ e.stopPropagation() e.preventDefault(); let isScale = true; let rect = document.getElementById('divBox').getBoundingClientRect(); let oldWidth = $('#divBox').width(); let oldHeight = $('#divBox').height(); let oldX = e.clientX; let oldY = e.clientY; let oldLeft = parseInt($('#divBox').css('left')); let oldTop = parseInt($('#divBox').css('top')); let centerX = rect.left+rect.width/2; let centerY = rect.top + rect.height / 2; let moveEvent = null; let w,h,t,l; let ceterIns = GetDistance(centerX,centerY,oldX,oldY); let angle = parseFloat($('#divBox')[0].dataset.angle) || 0; let jd = (angle*180/Math.PI)<0?360+(angle*180/Math.PI):(angle*180/Math.PI); let hd = jd*Math.PI/180; let _id = $(this).attr('id'); $('#box').on('mousemove',function(ev){ moveEvent = ev; if(!isScale){ return } let newIns = GetDistance(centerX,centerY,ev.clientX,ev.clientY); let ins = GetDistance(oldX,oldY,ev.clientX,ev.clientY) let isScaleBig = (newIns-ceterIns>=0)?true:false;//判断放大还是放大 let dx = isScaleBig?ins:-ins; switch (_id){ case 'tl': var radioHd = 45*Math.PI/180; var dxx = dx*Math.sin(radioHd); var dl = dxx/2*(Math.sin(hd)-Math.cos(hd)-1); var dh = dxx/2*(Math.cos(hd)+Math.sin(hd)+1); w = oldWidth+dxx; h = oldHeight+dxx; l = oldLeft+dl; t = oldTop-dh; break; case 'tm': var dh = dx-((dx/2)-(dx/2)*Math.cos(hd)); var dl = ((dx/2)*Math.sin(hd)); w = oldWidth; h = oldHeight+dx; l = oldLeft+dl; t = oldTop-dh break; case 'tr': var radioHd = 45*Math.PI/180; var dxx = dx*Math.sin(radioHd); var dh = dxx/2*(Math.cos(hd)-Math.sin(hd)+1); var dl = dxx/2*(Math.sin(hd)+Math.cos(hd)-1); w = oldWidth+dxx; h = oldHeight+dxx; l = oldLeft+dl; t = oldTop-dh; break; case 'ml': var dh = (dx/2)*Math.sin(hd); var dl = dx-(dx/2-(dx/2)*Math.cos(hd)); w = oldWidth+ dx; h = oldHeight; l = oldLeft-dl; t = oldTop- dh; break; case 'mr': var dh = (dx/2)*Math.sin(hd); var dl = (dx/2)-((dx/2)*Math.cos(hd)); w = oldWidth+ dx; h = oldHeight; l = oldLeft-dl; t = oldTop+ dh; break; case 'bl': var radioHd = 45*Math.PI/180; var dxx = dx*Math.sin(radioHd); var dl = dxx/2*(Math.sin(hd)+Math.cos(hd)+1); var dh = dxx/2*(Math.sin(hd)-Math.cos(hd)+1); w = oldWidth+dxx; h = oldHeight+dxx; l = oldLeft-dl; t = oldTop-dh; break; case 'bm': var dh = (dx/2)-(dx/2)*Math.cos(hd); var dl = ((dx/2)*Math.sin(hd)); w = oldWidth; h = oldHeight+dx; l = oldLeft-dl; t = oldTop- dh; break; case 'br': var radioHd = 45*Math.PI/180; var dxx = dx*Math.sin(radioHd); var dl = dxx/2*(Math.sin(hd)-Math.cos(hd)+1); var dh = dxx/2*(Math.sin(hd)+Math.cos(hd)-1); w = oldWidth+dxx; h = oldHeight+dxx; l = oldLeft-dl; t = oldTop+dh; break; default:break; } $('#divBox').css({ top: t+'px', left: l+'px', width: w+'px', height: h+'px' }) }) $('#box').on('mouseup',function(event){ event.preventDefault(); isScale = false; $(this).off(event); $(this).off(moveEvent); return false; }) }) $('.rotate').on('mousedown',function(e){ e.stopPropagation() e.preventDefault(); let rect = document.getElementById('divBox').getBoundingClientRect(); let centerX = rect.left+rect.width/2; let centerY = rect.top + rect.height / 2; let isMove = true; $('#divBox')[0].dataset.centerX = centerX; $('#divBox')[0].dataset.centerY = centerY; $('#divBox')[0].dataset.angle = getDragAngle(e); $('#box').on('mousemove',function(ev){ moveEvent = ev; if(!isMove){ return } let angle = getDragAngle(ev); // let jd = angle*180/Math.PI; // console.log(jd) $('#divBox').css({ transform: `rotate(${angle}rad)` }) }) $('#box').on('mouseup',function(event){ event.preventDefault(); isMove = false; $('#divBox')[0].dataset.angle = getDragAngle(event); $(this).off(event) $(this).off(moveEvent) return false; }) }) function GetDistance( lat1, lng1, lat2, lng2){ dx = Math.abs(lat1 - lat2); dy = Math.abs(lng1 - lng2); var dis = Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2)); return parseInt(dis); } function getDragAngle(event){ var startAngle = parseFloat($('#divBox')[0].dataset.angle) || 0; var center = { x: parseFloat($('#divBox')[0].dataset.centerX) || 0, y: parseFloat($('#divBox')[0].dataset.centerY) || 0, }; var angle = Math.atan2(center.y - event.clientY, center.x - event.clientX); return angle - startAngle; }})</script>
</body>
</html>