var zIndex = 0;
var flag = 0;
var programNum = 0;
$(document).on('click','.dragBox',function(ev){
ev.stopPropagation();
$(".dragBox").removeClass('focusActive');
$(".textModel").addClass('textBorder');
$(this).addClass('focusActive');
if($(this).find('.editText').length==0){
$('.editText').attr('contenteditable',false);
}else{
$('.editText').attr('contenteditable',true);
}
})
//删除当前拖拽层
function removeDrag() {
$(".focusActive").remove();
hideContextMenu();
}
//置于顶层
function moveUpDrag() {
$(".focusActive").css('z-index',zIndex++);
hideContextMenu();
}
//置于底层
function moveDownDrag() {
$(".focusActive").css('z-index',0);
hideContextMenu();
}
function hideContextMenu() {
$('.contextMenu').hide();
}
$(document).click(function(){
$(".dragBox").removeClass('focusActive');
$(".textModel").addClass('textBorder');
$('.editText').attr('contenteditable',false);
hideContextMenu();
})
$(document).on('contextmenu','.imgModel',function (ev) {
if($(this).hasClass('focusActive')){
$('#imgContextMenu').show();
$('#imgContextMenu').css({
left:ev.clientX + 'px',
top:ev.clientY+ 'px',
})
return false;
}
})
function createImg(){
var timeStamp = getFullTime();
programNum++;
var imgStr = `<div class="dragBox imgModel" dragType="imgModel" id="program`+programNum+`">
<span class="r"></span>
<span class="l"></span>
<span class="rm"></span>
<span class="lm"></span>
<span class="t"></span>
<span class="b"></span>
<span class="tm"></span>
<span class="bm"></span>
<span class="br"></span>
<span class="bl"></span>
<span class="tr"></span>
<span class="tl"></span>
<div class="dragImgList"><img src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/730-350-0.jpg"></div>
</div>`;
$('#dragWrap').append(imgStr);
$('.dragBox').removeClass('focusActive');
$('#program'+programNum).addClass('focusActive');
dragCanvas('#program'+programNum,'add');
}
function createVideo(){
var timeStamp = getFullTime();
programNum++;
var imgStr = `<div class="dragBox VideoModel" dragType="VideoModel" id="program`+programNum+`">
<span class="r"></span>
<span class="l"></span>
<span class="rm"></span>
<span class="lm"></span>
<span class="t"></span>
<span class="b"></span>
<span class="tm"></span>
<span class="bm"></span>
<span class="br"></span>
<span class="bl"></span>
<span class="tr"></span>
<span class="tl"></span>
<video preload="auto" style="height: 100%; 100%">
<source src="http://114.247.181.27:8888/video/resource_1534917786698.mp4" type="video/mp4">
<source src="http://114.247.181.27:8888/video/resource_1534917786698.mp4" type="video/ogg">
Your browser does not support the video tag.
</video>
</div>`;
$('#dragWrap').append(imgStr);
$('.dragBox').removeClass('focusActive');
$('#program'+programNum).addClass('focusActive');
dragCanvas('#program'+programNum,'add');
}
function createText(){
var timeStamp = getFullTime();
programNum++;
var imgStr = `<div class="dragBox textModel" dragType="textModel" id="program`+programNum+`">
<span class="r"></span>
<span class="l"></span>
<span class="rm"></span>
<span class="lm"></span>
<span class="t"></span>
<span class="b"></span>
<span class="tm"></span>
<span class="bm"></span>
<span class="br"></span>
<span class="bl"></span>
<span class="tr"></span>
<span class="tl"></span>
<div class="editText" contenteditable="true"; style="margin: 20px;outline:none;">这是一段可编辑的段落。请试着编辑该文本。</div>
</div>`;
$('#dragWrap').append(imgStr);
$('.dragBox').removeClass('focusActive');
$('#program'+programNum).addClass('focusActive');
dragCanvas('#program'+programNum,'add');
}
function getFullTime(){
var oDate = new Date();
return ('' + oDate.getFullYear() + bzero(oDate.getMonth()+1) + bzero(oDate.getDate()) + bzero(oDate.getHours())+ bzero(oDate.getMinutes()) + bzero(oDate.getSeconds()));
}
function bzero(num){
return num > 9 ? num : '0' + num;
}
function dragCanvas(dragParent,type){
var dragParent = document.querySelector(dragParent);
if(type=='add'){
dragParent.style.zIndex = zIndex++;
}else{
zIndex = $("#dragWrap .dragBox").last().css('z-index');
dragParent.style.zIndex = zIndex++;
}
var aSpan = dragParent.getElementsByTagName('span');
for (var i = 0; i < aSpan.length; i++) {
dragFn(aSpan[i],dragParent);
}
new ChildDrag(dragParent);
}
function dragFn(obj,parent) {
obj.onmousedown = function (ev) {
var oEv = ev || event;
oEv.stopPropagation();
var oldWidth = parent.offsetWidth;
var oldHeight = parent.offsetHeight;
var oldX = oEv.clientX;
var oldY = oEv.clientY;
var oldLeft = parent.offsetLeft;
var oldTop = parent.offsetTop;
var ratio = oldWidth/oldHeight
console.log(ratio);
document.onmousemove = function (ev) {
var oEv = ev || event;
oEv.stopPropagation()
var changeX = oEv.clientX - oldX;
var changeY = oEv.clientY - oldY;
var L = parent.offsetLeft-1;
var T = parent.offsetTop-1;
var canvasSpace = document.getElementById('dragWrap');
var limit = false;
var maxTop = canvasSpace.clientHeight - parent.offsetHeight;
var maxLeft = canvasSpace.clientWidth - parent.offsetWidth;
var maxHeight = canvasSpace.clientHeight - maxTop;
if (obj.className == 'tl') {
if(L>0 && T>0 || L<=0 && changeX>0 || T<=0 && changeY>0){
parent.style.left = oldLeft + changeX + 'px';
parent.style.top = oldTop + changeX/ratio + 'px';
parent.style.width = oldWidth - changeX + 'px';
parent.style.height = oldHeight - changeX/ratio+'px';
}
limitSpace(parent,'tl');
}else if (obj.className == 'bl') {
// if(!limitSpace(parent) || changeX>0 ){
// parent.style.width = oldWidth - changeX + 'px';
// parent.style.height = oldHeight - changeX/ratio+'px';
// parent.style.left = oldLeft + changeX + 'px';
// }
if(L>0 && T<maxTop || L<=0 && changeX>0 || T<=maxTop && changeY>0 && changeX>0){
parent.style.width = oldWidth - changeX + 'px';
parent.style.height = oldHeight - changeX/ratio+'px';
parent.style.left = oldLeft + changeX + 'px';
}
limitSpace(parent,'bl');
}else if (obj.className == 'tr') {
if(T<=0 && changeY>0 || T>0 && L<=maxLeft || changeX<0){
parent.style.top = oldTop - changeX/ratio + 'px';
parent.style.width = oldWidth + changeX + 'px';
parent.style.height = oldHeight + changeX/ratio+'px';
}
limitSpace(parent,'tr');
}else if (obj.className == 'br') {
if(L>=maxLeft && changeX<0 || T<=maxTop && L<=maxLeft || T<=maxTop && changeY<0){
parent.style.width = oldWidth + changeX + 'px';
parent.style.height = oldHeight + changeX/ratio+'px';
}
limitSpace(parent,'br');
}else if (obj.className == 't' || obj.className == 'tm') {
if(T>0 || T<=0 && changeY>0){
parent.style.top = oldTop + changeY + 'px';
parent.style.height=oldHeight - changeY+'px';
}
limitSpace(parent,'tm');
}else if (obj.className == 'b' || obj.className == 'bm') {
if(T<=maxTop || T>=maxTop && changeY<0){
parent.style.height = oldHeight + changeY+'px';
}
var str = limitSpace(parent,'bm');
}
else if (obj.className == 'l' || obj.className == 'lm') {
if(L>0 || L<=0 && changeX>0){
parent.style.left = oldLeft + changeX + 'px';
parent.style.height = oldHeight + 'px';
parent.style.width = oldWidth - changeX + 'px';
}
limitSpace(parent,'lm');
}
else if (obj.className == 'r' || obj.className == 'rm') {
if(L<maxLeft || L>=maxLeft && changeX<0){
parent.style.height = oldHeight + 'px';
parent.style.width = oldWidth + changeX + 'px';
}
limitSpace(parent,'rm');
}
};
document.onmouseup = function () {
document.onmousemove = null;
};
return false;
};
}
function limitSpace(parent,type){
var canvasSpace = document.getElementById('dragWrap');
var L = parent.offsetLeft;
var T = parent.offsetTop;
var limit = false;
if (L <= 0){
L = 0;
limit = true;
} else if(L >= canvasSpace.offsetWidth - parent.offsetWidth){
L = canvasSpace.offsetWidth - parent.offsetWidth;
limit = true;
}
if (T <= 0){
T = 0;
limit = true;
} else if(T >= canvasSpace.clientHeight - parent.offsetHeight){
T = canvasSpace.clientHeight - parent.offsetHeight;
if(type.indexOf('b')!=-1){
//return 'blimit'
}
limit = true;
}
parent.style.left = L + 'px';
parent.style.top = T + 'px';
//return limit;
}
function extend(obj1,obj2){
for(attr in obj2){
if(obj2 && obj2.hasOwnProperty(attr)){
obj1[attr] = obj2[attr];
}
}
}
function Drag(obj){
this.obj = obj;
this.disX = 0;
this.disY = 0;
this.init();
this.canvasSpace = document.getElementById('dragWrap');
}
Drag.prototype.init=function(){
var This = this;
this.obj.onmousedown = function(ev){
$(".dragBox").removeClass('focusActive');
$(this).addClass('focusActive');
var ev = ev || event;
This.fnDown(ev);
document.onmousemove = function(ev){
var ev = ev || event;
This.fnMove(ev);
};
document.onmouseup = function(){
This.fnUp();
};
console.log(ev.target.className=='editText')
if(ev.target.className=='editText'){
}else{
return false;
}
};
return this;
};
Drag.prototype.fnDown=function(ev){
this.disX = ev.clientX - this.obj.offsetLeft;
this.disY = ev.clientY - this.obj.offsetTop;
$(this.obj).removeClass('textBorder');
};
Drag.prototype.fnMove = function(ev){
this.obj.style.left =ev.clientX-this.disX+'px';
this.obj.style.top =ev.clientY-this.disY+'px';
};
Drag.prototype.fnUp = function(){
document.onmousemove = null;
document.onmouseup = null;
};
function ChildDrag(obj){
Drag.call(this,obj);
}
extend(ChildDrag.prototype , Drag.prototype);
ChildDrag.prototype.fnMove = function(ev){
var L = ev.clientX - this.disX;
var T = ev.clientY - this.disY;
if (L <= 0){
L = 0;
} else if(L>this.canvasSpace.clientWidth-this.obj.offsetWidth){
L = this.canvasSpace.clientWidth-this.obj.offsetWidth;
console.log(this.canvasSpace.clientWidth)
}
if (T <= 0){
T = 0;
} else if(T>this.canvasSpace.clientHeight-this.obj.offsetHeight){
T = this.canvasSpace.clientHeight-this.obj.offsetHeight;
}
this.obj.style.left = L + 'px';
this.obj.style.top = T + 'px';
}
html结构
<!-- 内容区域 -->
<style>
html,body{-overflow-y: hidden;}
</style>
<link rel="stylesheet" href="./static/css/common/drag.css">
<script src="./static/js/common/drag.js"></script>
<div class="tpl-content-wrapper active" style="background: #fff;display: flex;position: relative ">
<div id="programLeft"></div>
<div id="programMain">
<div class="am-u-sm-12 am-u-md-12 am-u-lg-12 bgf" id="createType" style="display: flex;">
<div id="titlebar" class="am-cf" style="padding:0.166rem;margin: auto">
<div class="am-fl itemBox">
<div class="item picture" id="text" type="picture" @click.stop="createText()">
<span class="am-icon-text-height am-icon-md" style="color: #707070;"></span>
<label style="color: #707070;">文本</label>
</div>
</div>
<div class="am-fl itemBox" @click.stop="createImg()">
<div class="item picture" id="picture" type="picture">
<span class="am-icon-image am-icon-md"></span>
<label style="color: #707070;">图片</label>
</div>
</div>
<div class="am-fl itemBox" @click.stop="createVideo()">
<div class="item video" id="video" type="video">
<span class="am-icon-film am-icon-md"></span>
<label style="color: #707070;">视频</label>
</div>
</div>
<div class="am-fl itemBox" @click.stop="saveHtml()">
<div class="item video" type="video">
<span class="am-icon-save am-icon-md"></span>
<label style="color: #707070;">保存</label>
</div>
</div>
<div class="am-fl itemBox" @click.stop="preview()">
<div class="item video" type="video">
<span class="am-icon-eye am-icon-md"></span>
<label style="color: #707070;">预览</label>
</div>
</div>
<div class="am-fl itemBox" @click.stop="publish()">
<div class="item video" type="video">
<span class="am-icon-cloud-upload am-icon-md"></span>
<label style="color: #707070;">发布</label>
</div>
</div>
</div>
</div>
<div id="dragWrap">
</div>
<ul id="imgContextMenu" class="contextMenu">
<li onclick="moveUpDrag()">置于顶层</li>
<li onclick="moveDownDrag()">置于底层</li>
<li onclick="removeDrag()">删除</li>
</ul>
</div>
<div id="programRight"></div>
</div>
css样式
.dragBox {
position: absolute;
top: 1px;
left: 1px;
width: 500px;
background: #fff;
cursor: move;
}
/*四边*/
.dragBox .t,
.dragBox .b,
.dragBox .l,
.dragBox .r {
position: absolute;
z-index: 1;
background:#666;
}
.dragBox .l,
.dragBox .r {
width: 1px;
background: #08a1ef;
height: 100%;
cursor: col-resize;
}
.dragBox .t,
.dragBox .b {
width: 100%;
height: 1px;
background: #08a1ef;
cursor: row-resize;
}
.textBorder{
border: 1px solid #08a1ef;
}
.dragBox .t {
top: 0;
}
.dragBox .b {
bottom: 0;
}
.dragBox .tm {
top: -5px;
left: 50%;
margin-left: -5px;
}
.dragBox .bm {
bottom: -5px;
left: 50%;
margin-left: -5px;
}
.dragBox .l {
left: 0;
}
.dragBox .rm {
right: -5px;
top: 50%;
margin-top: -5px;
}
.dragBox .lm {
left: -5px;
top: 50%;
margin-top: -5px;
}
.dragBox .r {
right: 0;
}
/*四角*/
.dragBox .rm,
.dragBox .lm,
.dragBox .tm,
.dragBox .bm,
.dragBox .tl,
.dragBox .bl,
.dragBox .br,
.dragBox .tr {
width: 9px;
height: 9px;
position: absolute;
background: #CCC;
z-index: 2;
border: 1px solid #08a1ef;
background-color: #fff;
/*cursor: nwse-resize*/
}
.dragBox .tl{
cursor: nw-resize
}
.dragBox .bl{
cursor: sw-resize
}
.dragBox .br{
cursor: se-resize
}
.dragBox .tr{
cursor: ne-resize
}
.dragBox .tm{
cursor: n-resize
}
.dragBox .bm{
cursor: s-resize
}
.dragBox .rm{
cursor: w-resize
}
.dragBox .lm{
cursor: e-resize
}
.dragBox .tl,
.dragBox .bl {
left: -5px;
}
.dragBox .tr,
.dragBox .br {
right: -5px;
}
.dragBox .br,
.dragBox .bl {
bottom: -5px;
}
.dragBox .tl,
.dragBox .tr {
top: -5px;
}
.dragBox img{
width: 100%;
height: 100%;
display: block;
}
.dragBox span{
display: none;
}
.focusActive span{
display: block;
}