酷毙的html标签编辑器
心血来潮,写了这个玩具,以后有时间会逐步完善功能,作为前端的自由编辑工具,还是很好玩的。
function insertStyleSheet(styles, styleId) { if (!document.getElementById(styleId)) { var style = document.createElement("style"); style.id = styleId; (document.getElementsByTagName("head")[0] || document.body).appendChild(style); if (style.styleSheet) { //for ie style.styleSheet.cssText = styles; } else {//for w3c style.appendChild(document.createTextNode(styles)); } } } insertStyleSheet("html{cursor:text;*cursor:auto;width:100%;height:100%;margin:0;padding:0;}body{width:100%;height:100%;margin:0;padding:0;}.myFrame{box-shadow:0 0 18px #090;}", "myFrameStyle"); var myDrag = {}; myDrag.originX = myDrag.originY = myDrag.left = myDrag.top = myDrag.mousedown = 0; myDrag.option = "d"; myDrag.cursor = "default"; //本方法经过一定优化,相对减少系统消耗 function setCursor(e, d) { var o = myDrag.currObj; if (o) { d = d || 3; var w = o.outerWidth() , h = o.outerHeight() , x = o.offset().left , y = o.offset().top; if((x - e.pageX) > d || (y - e.pageY) > d || (e.pageX - x - w) > d || (e.pageY - y - h) > d){ $('body').css("cursor", 'default'); myDrag.option = 'd'; return false;//目标外围 } if((e.pageX - x) > d && (e.pageY - y) > d && (x + w - e.pageX) > d && (y + h - e.pageY) > d){ //$('body').css("cursor", 'move'); myDrag.option = 'm'; return false;//目标外围 } var l = Math.abs(e.pageX - x) , t = Math.abs(e.pageY - y) , r = Math.abs(x + w - e.pageX) , b = Math.abs(y + h - e.pageY); if(l < d && t < d){ $('body').css("cursor", 'se-resize'); myDrag.option = 'lt'; return false;//目标左上角 } if(r < d && b < d){ $('body').css("cursor", 'se-resize'); myDrag.option = 'rb'; return false;//目标右下角 } if(r < d && t < d){ $('body').css("cursor", 'ne-resize'); myDrag.option = 'rt'; return false;//目标右上角 } if(l < d && b < d){ $('body').css("cursor", 'ne-resize'); myDrag.option = 'lb'; return false;//目标左下角 } if(l < d){ $('body').css("cursor", 'w-resize'); myDrag.option = 'l'; return false;//目标左 } if(r < d){ $('body').css("cursor", 'w-resize'); myDrag.option = 'r'; return false;//目标右 } if(t < d){ $('body').css("cursor", 's-resize'); myDrag.option = 't'; return false;//目标上 } if(b < d){ $('body').css("cursor", 's-resize'); myDrag.option = 'b'; return false;//目标下 } } } function dragDom(e) { if (myDrag.option == 'm') { myDrag.left += e.pageX - myDrag.originX; myDrag.top += e.pageY - myDrag.originY; myDrag.currObj.css({ top: myDrag.top, left: myDrag.left }); } else { if (myDrag.option != "d") { var o = myDrag.currObj; if (myDrag.option == "l") { myDrag.left += e.pageX - myDrag.originX; o.css({ left: myDrag.left }) .width(o.width() - e.pageX + myDrag.originX); } if (myDrag.option == "t") { myDrag.top += e.pageY - myDrag.originY; o.css({ top: myDrag.top }).height(o.height() - e.pageY + myDrag.originY); } if (myDrag.option == "r") { o.width(o.width() + e.pageX - myDrag.originX); } if (myDrag.option == "b") { o.height(o.height() + e.pageY - myDrag.originY); } if (myDrag.option == "lt") { myDrag.top += e.pageY - myDrag.originY; myDrag.left += e.pageX - myDrag.originX; o.css({ top: myDrag.top }).css({ left: myDrag.left }) .height(o.height() - e.pageY + myDrag.originY) .width(o.width() - e.pageX + myDrag.originX); } if (myDrag.option == "rb") { o.height(o.height() + e.pageY - myDrag.originY) .width(o.width() + e.pageX - myDrag.originX); } if (myDrag.option == "lb") { myDrag.left += e.pageX - myDrag.originX; o.css({ left: myDrag.left }) .height(o.height() + e.pageY - myDrag.originY) .width(o.width() - e.pageX + myDrag.originX); } if (myDrag.option == "rt") { myDrag.top += e.pageY - myDrag.originY; o.css({ top: myDrag.top }) .height(o.height() - e.pageY + myDrag.originY) .width(o.width() + e.pageX - myDrag.originX); } } } } $(document).on("click", function (e) { var obj = e.originalEvent.srcElement; var o = $(obj); if ('myFrame' != o.attr('class') && !o.is('body')) { if (myDrag.currObj) { $(myDrag.currObj).css('border', myDrag.border); } o.css('position', 'relative').parent().css('position', 'relative'); myDrag.currObj = o; myDrag.border = o.css('border'); o.css('border', '1px dashed red'); } else { if (myDrag.currObj) { $(myDrag.currObj).css('border', myDrag.border); myDrag.currObj = null; } } e.stopPropagation(); }).on("mousedown", function (e) { if (myDrag.option != "d") { myDrag.mousedown = 1; var o = myDrag.currObj; if (myDrag.option == "m") { o.css("cursor", 'move'); } myDrag.left = o.css("left") == 'auto' ? 0 : parseInt(o.css("left")); myDrag.top = o.css("top") == 'auto' ? 0 : parseInt(o.css("top")); myDrag.originX = e.pageX; myDrag.originY = e.pageY; } e.stopPropagation(); }).on('mousemove', function (e) { if (myDrag.mousedown == 0) { if (myDrag.currObj) { setCursor(e,5); } } else { dragDom(e); } myDrag.originX = e.pageX; myDrag.originY = e.pageY; e.stopPropagation(); }).on('mouseup', function (e) { myDrag.originX = myDrag.originY = myDrag.left = myDrag.top = myDrag.mousedown = 0; if (myDrag.option == "m") { $(myDrag.currObj).css("cursor", 'default'); } e.stopPropagation(); }).on('keydown', function (e) { if (myDrag.currObj) { var o = myDrag.currObj; switch (e.which) { case 46 :{ if (confirm('Are you sure to delete it?')) { o.parent().append(o.children()); o.remove(); } } break; case 37: { myDrag.left -= 1; o.css({ left: myDrag.left }); } break; case 38: { myDrag.top -= 1; o.css({ top: myDrag.top }); } break; case 39: { myDrag.left += 1; o.css({ left: myDrag.left }); } break; case 40: { myDrag.top += 1; o.css({ top: myDrag.top }); } break; default: break; } return false; } e.stopPropagation(); });