mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-28 18:00:09 +00:00
238 lines
4.1 KiB
HTML
Executable File
238 lines
4.1 KiB
HTML
Executable File
<!DOCTYPE html>
|
|
<html>
|
|
<style>
|
|
|
|
label {
|
|
margin: 0.2em;
|
|
}
|
|
label label {
|
|
margin: auto;
|
|
}
|
|
|
|
button {
|
|
border: none;
|
|
background: transparent;
|
|
}
|
|
|
|
input[type=checkbox],
|
|
input[type=radio] {
|
|
display: none;
|
|
}
|
|
input:not(:checked) ~ * {
|
|
opacity: 0.3;
|
|
}
|
|
input:hover:not(:checked) ~ * {
|
|
opacity: 0.8;
|
|
}
|
|
input:not(:checked) ~ sub:hover,
|
|
input:not(:checked) ~ sub {
|
|
opacity: 0.3;
|
|
}
|
|
|
|
.material-icons {
|
|
font-size: 2em;
|
|
}
|
|
|
|
sub .material-icons {
|
|
font-size: 1.5em;
|
|
}
|
|
|
|
.crop {
|
|
position: absolute;
|
|
width: 500px;
|
|
height: 500px;
|
|
|
|
border: solid 1px black;
|
|
}
|
|
|
|
|
|
.center {
|
|
position: relative;
|
|
top: 50%;
|
|
left: 50%;
|
|
width: 15px;
|
|
height: 15px;
|
|
margin-left: -8.5px;
|
|
margin-top: -8.5px;
|
|
|
|
border: solid 1px black;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.center:before {
|
|
display: block;
|
|
position: absolute;
|
|
content: "";
|
|
|
|
bottom: 50%;
|
|
right: 50%;
|
|
width: 15px;
|
|
height: 15px;
|
|
margin-right: -0.5px;
|
|
margin-bottom: -0.5px;
|
|
|
|
border-bottom: solid 1px black;
|
|
border-right: solid 1px black;
|
|
}
|
|
.center:after {
|
|
display: block;
|
|
position: absolute;
|
|
content: "";
|
|
|
|
top: 50%;
|
|
left: 50%;
|
|
width: 15px;
|
|
height: 15px;
|
|
margin-top: -0.5px;
|
|
margin-left: -0.5px;
|
|
|
|
border-top: solid 1px black;
|
|
border-left: solid 1px black;
|
|
}
|
|
|
|
</style>
|
|
<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
|
|
|
|
<link rel="stylesheet" href="../css/fonts.css">
|
|
|
|
<script src="../ext-lib/jquery.js"></script>
|
|
<script src="../ext-lib/jquery-ui.js"></script>
|
|
<script src="../ext-lib/jquery.ui.touch-punch.min.js"></script>
|
|
|
|
<script src="../lib/jli.js"></script>
|
|
|
|
<script>
|
|
|
|
var ORIGINAL = 1
|
|
|
|
|
|
$(function(){
|
|
$('.crop')
|
|
.resizable({
|
|
handles: 'all',
|
|
})
|
|
.draggable()
|
|
$('.crop .center')
|
|
.draggable()
|
|
})
|
|
|
|
|
|
function setRatio(ratio){
|
|
var crop = $('.crop')
|
|
|
|
crop
|
|
.resizable("option", "aspectRatio", ratio)
|
|
// XXX this feels like a hack but it works...
|
|
.data('uiResizable')._aspectRatio = ratio
|
|
|
|
if(ratio === false){
|
|
$('#lock-ratio')[0].checked = false
|
|
return
|
|
}
|
|
|
|
var w = crop.width()
|
|
var h = crop.height()
|
|
|
|
// resize...
|
|
var t = w + h
|
|
h = t / (ratio + 1)
|
|
w = t - h
|
|
crop
|
|
.height(h)
|
|
.width(w)
|
|
}
|
|
|
|
function flip(){
|
|
var crop = $('.crop')
|
|
var r = crop.resizable("option", "aspectRatio")
|
|
|
|
if(r > 0){
|
|
setRatio(1/r)
|
|
|
|
// no aspect ratio defined, just switch...
|
|
} else {
|
|
var w = crop.width()
|
|
var h = crop.height()
|
|
|
|
crop
|
|
.height(w)
|
|
.width(h)
|
|
}
|
|
}
|
|
|
|
function toggleLock(m){
|
|
var crop = $('.crop')
|
|
var r = m || crop.resizable("option", "aspectRatio")
|
|
|
|
if(r === false){
|
|
var w = crop.width()
|
|
var h = crop.height()
|
|
|
|
$('#lock-ratio')[0].checked = true
|
|
setRatio(w/h)
|
|
|
|
} else {
|
|
$('#lock-ratio')[0].checked = false
|
|
setRatio(false)
|
|
}
|
|
}
|
|
|
|
</script>
|
|
|
|
<body>
|
|
|
|
<button><span title="toggle crop on/off" class="material-icons">crop</span></button>
|
|
<label>
|
|
<input type="radio" name="ratio" checked onclick="setRatio(false)">
|
|
<span class="material-icons">crop_free</span>
|
|
<sub>
|
|
<label>
|
|
<input id="lock-ratio" type="checkbox" onclick="toggleLock()">
|
|
<span class="material-icons">lock</span>
|
|
</label>
|
|
</sub>
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="ratio" onclick="setRatio(ORIGINAL)">
|
|
<span title="original ratio" class="material-icons">crop_original</span>
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="ratio" onclick="setRatio(1)">
|
|
<span class="material-icons">crop_square</span>
|
|
<span>1:1</span>
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="ratio" onclick="setRatio(3/2)">
|
|
<span class="material-icons">crop_3_2</span>
|
|
<span>3:2</span>
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="ratio" onclick="setRatio(16/9)">
|
|
<span class="material-icons">crop_16_9</span>
|
|
<span>16:9</span>
|
|
</label>
|
|
<button onclick="flip()"><span class="material-icons">crop_rotate</span></button>
|
|
<button><span class="material-icons">clear</span></button>
|
|
|
|
<br>
|
|
<pre>
|
|
TODO:
|
|
- rotation and rotation handle
|
|
- touch
|
|
- multitouch
|
|
- center point
|
|
</pre>
|
|
|
|
|
|
<div class="container">
|
|
<div class="crop">
|
|
<div class="center">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</body>
|
|
</html>
|
|
<!-- vim:set sw=4 ts=4 : -->
|