Skip to content

Instantly share code, notes, and snippets.

@d3ep4k
Last active January 27, 2024 07:24
Show Gist options
  • Save d3ep4k/27f1c76a90757a30d8aa to your computer and use it in GitHub Desktop.
Save d3ep4k/27f1c76a90757a30d8aa to your computer and use it in GitHub Desktop.
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.resize-drag{
z-index:200;
position:absolute;
border: 2px dashed #ccc;
}
.out-container-content ,.container-content{
background-color: #fafcaa;
height: 340px;
}
#btnInsertImage{
margin-bottom:10px;
}
</style>
<script src="http://code.interactjs.io/interact-1.2.4.min.js"></script>
</head>
<body>
<button id="btnInsertImage" onclick="insertImage()">Insert Image</button>
<div class="container-wrap">
<div class="container-content" contenteditable="true">This is the content of the container. The content is provided along with the image.
The image will be moved around and resized as required. The image can move within the boundary of the container.</div>
</div>
<button id="btnSubmit" onclick="dataTransfer()">Submit</button>
<div class="out-container-wrap">
</div>
<script>
function resizeMoveListener(event){
var target = event.target,
x = (parseFloat(target.dataset.x) || 0),
y = (parseFloat(target.dataset.y) || 0);
// update the element's style
target.style.width = event.rect.width + 'px';
target.style.height = event.rect.height + 'px';
// translate when resizing from top or left edges
x += event.deltaRect.left;
y += event.deltaRect.top;
updateTranslate(target,x,y);
}
function dragMoveListener (event) {
var target = event.target,
// keep the dragged position in the data-x/data-y attributes
x = (parseFloat(target.dataset.x) || 0) + event.dx,
y = (parseFloat(target.dataset.y) || 0) + event.dy;
updateTranslate(target,x,y);
}
function updateTranslate(target, x, y){
// translate the element
target.style.webkitTransform =
target.style.transform =
'translate(' + x + 'px, ' + y + 'px)';
// update the position attributes
target.dataset.x = x;
target.dataset.y = y;
}
</script>
<script>
function insertImage(){
var $img = document.createElement('img');
$img.setAttribute('src','http://www.nationalprayerchapel.com/wp-content/uploads/2012/02/apple-logo-64x64.gif?294f74');
$img.setAttribute('class','resize-drag');
document.querySelector(".container-wrap").appendChild($img);
var rect = document.querySelector(".container-wrap").getBoundingClientRect();
$img.style.left = rect.left;
$img.style.top = rect.top;
}
function dataTransfer(){
//cleanup
var $out = document.querySelector(".out-container-wrap");
while ($out.hasChildNodes()) {
$out.removeChild($out.lastChild);
}
//get source
var source = document.querySelector('.container-wrap')
//get data
var data = getSource(source);
//add data to target
setSource($out,data);
}
/**
* Get data from source div
*/
function getSource(source){
var images = source.querySelectorAll('img');
var text = source.querySelector('div').textContent;
//build the js object and return it.
var data = {};
data.text = text;
data.image = [];
for(var i=0;i<images.length;i++){
var img = {}
img.url = images[i].src
img.x = images[i].dataset.x;
img.y = images[i].dataset.y;
img.h = images[i].height;
img.w = images[i].width;
data.image.push(img)
}
return data;
}
function setSource(target, data){
//set the images.
for(var i=0;i<data.image.length;i++){
var d = data.image[i];
//build a new image
var $img = document.createElement('img');
$img.src = d.url;
$img.setAttribute('class','resize-drag');
$img.width = d.w;
$img.height = d.h;
$img.dataset.x = d.x;
$img.dataset.y = d.y;
var rect = target.getBoundingClientRect();
$img.style.left = parseInt(rect.left);
$img.style.top = parseInt(rect.top);
//transform: translate(82px, 52px)
$img.style.webkitTransform = $img.style.transform = 'translate('+$img.dataset.x+'px,'+$img.dataset.y+'px)';
//$img.style.setProperty('-webkit-transform', 'translate('+$img.dataset.x+'px,'+$img.dataset.y+'px)');
target.appendChild($img);
}
//make a fresh div with text content
var $outContent = document.createElement('div')
$outContent.setAttribute('class','out-container-content');
$outContent.setAttribute('contenteditable','true');
$outContent.textContent = data.text;
target.appendChild($outContent);
}
interact('.resize-drag')
.draggable({
onmove: dragMoveListener,
inertia:true,
restrict: {
restriction: "parent",
endOnly: true,
elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
}
})
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
onmove:resizeMoveListener
})
</script>
</body>
</html>
@khawerrind
Copy link

Here is the FIDDLE link for above gist.

@davodaslanifakor
Copy link

davodaslanifakor commented Oct 14, 2019

i want add image inside div contenteditable=true
i do that but resize and drag bad work inside div contenteditable=true
how resolve that?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment