A Pen by Hưng Nguyễn on CodePen.
Created
July 2, 2020 07:42
-
-
Save stelios333/c81d83afac92f39cb5d9a0abc5560afd to your computer and use it in GitHub Desktop.
Resizable div
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div class='resizable'> | |
<div class='resizers'> | |
<div class='resizer top-left'></div> | |
<div class='resizer top-right'></div> | |
<div class='resizer bottom-left'></div> | |
<div class='resizer bottom-right'></div> | |
</div> | |
</div> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*Make resizable div by Hung Nguyen*/ | |
function makeResizableDiv(div) { | |
const element = document.querySelector(div); | |
const resizers = document.querySelectorAll(div + ' .resizer') | |
const minimum_size = 20; | |
let original_width = 0; | |
let original_height = 0; | |
let original_x = 0; | |
let original_y = 0; | |
let original_mouse_x = 0; | |
let original_mouse_y = 0; | |
for (let i = 0;i < resizers.length; i++) { | |
const currentResizer = resizers[i]; | |
currentResizer.addEventListener('mousedown', function(e) { | |
e.preventDefault() | |
original_width = parseFloat(getComputedStyle(element, null).getPropertyValue('width').replace('px', '')); | |
original_height = parseFloat(getComputedStyle(element, null).getPropertyValue('height').replace('px', '')); | |
original_x = element.getBoundingClientRect().left; | |
original_y = element.getBoundingClientRect().top; | |
original_mouse_x = e.pageX; | |
original_mouse_y = e.pageY; | |
window.addEventListener('mousemove', resize) | |
window.addEventListener('mouseup', stopResize) | |
}) | |
function resize(e) { | |
if (currentResizer.classList.contains('bottom-right')) { | |
const width = original_width + (e.pageX - original_mouse_x); | |
const height = original_height + (e.pageY - original_mouse_y) | |
if (width > minimum_size) { | |
element.style.width = width + 'px' | |
} | |
if (height > minimum_size) { | |
element.style.height = height + 'px' | |
} | |
} | |
else if (currentResizer.classList.contains('bottom-left')) { | |
const height = original_height + (e.pageY - original_mouse_y) | |
const width = original_width - (e.pageX - original_mouse_x) | |
if (height > minimum_size) { | |
element.style.height = height + 'px' | |
} | |
if (width > minimum_size) { | |
element.style.width = width + 'px' | |
element.style.left = original_x + (e.pageX - original_mouse_x) + 'px' | |
} | |
} | |
else if (currentResizer.classList.contains('top-right')) { | |
const width = original_width + (e.pageX - original_mouse_x) | |
const height = original_height - (e.pageY - original_mouse_y) | |
if (width > minimum_size) { | |
element.style.width = width + 'px' | |
} | |
if (height > minimum_size) { | |
element.style.height = height + 'px' | |
element.style.top = original_y + (e.pageY - original_mouse_y) + 'px' | |
} | |
} | |
else { | |
const width = original_width - (e.pageX - original_mouse_x) | |
const height = original_height - (e.pageY - original_mouse_y) | |
if (width > minimum_size) { | |
element.style.width = width + 'px' | |
element.style.left = original_x + (e.pageX - original_mouse_x) + 'px' | |
} | |
if (height > minimum_size) { | |
element.style.height = height + 'px' | |
element.style.top = original_y + (e.pageY - original_mouse_y) + 'px' | |
} | |
} | |
} | |
function stopResize() { | |
window.removeEventListener('mousemove', resize) | |
} | |
} | |
} | |
makeResizableDiv('.resizable') |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
body, | |
html { | |
background: black; | |
} | |
.resizable { | |
background: white; | |
width: 100px; | |
height: 100px; | |
position: absolute; | |
top: 100px; | |
left: 100px; | |
} | |
.resizable .resizers{ | |
width: 100%; | |
height: 100%; | |
border: 3px solid #4286f4; | |
box-sizing: border-box; | |
} | |
.resizable .resizers .resizer{ | |
width: 10px; | |
height: 10px; | |
border-radius: 50%; /*magic to turn square into circle*/ | |
background: white; | |
border: 3px solid #4286f4; | |
position: absolute; | |
} | |
.resizable .resizers .resizer.top-left { | |
left: -5px; | |
top: -5px; | |
cursor: nwse-resize; /*resizer cursor*/ | |
} | |
.resizable .resizers .resizer.top-right { | |
right: -5px; | |
top: -5px; | |
cursor: nesw-resize; | |
} | |
.resizable .resizers .resizer.bottom-left { | |
left: -5px; | |
bottom: -5px; | |
cursor: nesw-resize; | |
} | |
.resizable .resizers .resizer.bottom-right { | |
right: -5px; | |
bottom: -5px; | |
cursor: nwse-resize; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment