ImageGrid/Viewer/experiments/centering-and-alignment.html
Alex A. Naanou 5f47d6da7b restructured the repo moving the legacy out of the way...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2020-08-28 17:32:02 +03:00

326 lines
6.5 KiB
HTML
Executable File

<!DOCTYPE html>
<html>
<style>
/* size/proportions do not matter... */
.viewer {
position: relative;
width: 80vw;
height: 80vh;
overflow: hidden;
background: gray;
}
/* center marker */
.viewer:after {
position: absolute;
content: "";
font-size: 0pt;
box-sizing: border-box;
width: 8px;
height: 8px;
top: 50%;
left: 50%;
margin-top: -4px;
margin-left: -4px;
border: solid 2px rgba(0, 0, 255, 0.3);
border-radius: 50%;
}
/*
- center this to viewer vertically and horizontally
-- top, left corner is center of viewer...
- align vertically to center current ribbon (manual)
*/
.ribbon-set {
position: relative;
top: 50%;
left: 50%;
transform-origin: top left;
transition: transform 0.1s linear;
}
.ribbon-locator {
position: relative;
top: 0px;
left: 0px;
transition: transform 0.1s linear;
}
/*
- align image horizontally relative to ribbon-set left (manual)
*/
.ribbon {
position: relative;
display: block;
height: auto;
/*min-width: 0px;*/
width: auto;
overflow: visible;
white-space: nowrap;
font-size: 0;
float: left;
clear: both;
background: black;
transition: transform 0.1s linear;
/* XXX use vmin here... */
margin-top: 2.5px;
margin-bottom: 2.5px;
/*
margin-top: 0.5vmin;
margin-bottom: 0.5vmin;
*/
}
/* horizontal size/proportions do not matter... */
.image {
position: relative;
display: inline-block;
vertical-align: middle;
text-align:left;
font-size: 12pt;
overflow: hidden;
/* XXX use vmin here... */
width: 50px;
height: 50px;
/*
width: 10vmin;
height: 10vmin;
*/
box-sizing: border-box;
color: white;
background: no-repeat 50% transparent;
background-size: contain;
box-sizing: border-box;
border: solid gray 1px;
background-color: silver;
}
.current.image {
/*border: solid red 5px;*/
}
.single-image-mode .ribbon {
background: transparent;
}
.single-image-mode .image:not(.current) {
visibility: hidden;
}
</style>
<script src="../ext-lib/jquery.js"></script>
<script src="../ext-lib/jquery-ui.js"></script>
<script>
$(function(){
// XXX needed when using vmin for image sizing...
/*
$(window)
.resize(function(){
$('.current.image').click()
})
*/
$('.image')
.click(function(){
$('.current.image').removeClass('current')
var image = $(this)
var ribbon = image.parents('.ribbon').first()
var ribbon_locator = ribbon.parents('.ribbon-locator').first()
var ribbon_set = ribbon_locator.parents('.ribbon-set').first()
image
.addClass('current')
var scale = ribbon_set.attr('scale') || 1
var angle = ribbon_set.attr('angle') || 0
var l = image[0].offsetLeft
var w = image[0].offsetWidth
var t = ribbon[0].offsetTop
var h = ribbon[0].offsetHeight
// centering image...
ribbon.css('transform', 'translateX(-'+ (l + w/2) +'px)')
// view angle and scale...
ribbon_set.css('transform',
'scale('+ scale +') '
+'rotate('+ angle +'deg)')
// centering ribbons...
ribbon_locator.css('transform', 'translateY(-'+ (t + h/2) +'px)')
})
$('.ribbon-set')
.draggable()
$('.drag-reset')
.click(function(){
$('.ribbon-set').css({
top: '',
left: '',
})
})
var ribbon_scale
var single_scale
$('.single-image-toggle')
.click(function(){
var ribbon_set = $('.ribbon-set')
if($('.viewer').hasClass('single-image-mode')){
single_scale = ribbon_set.attr('scale') || 5
} else {
ribbon_scale = ribbon_set.attr('scale') || 1
}
$('.viewer').toggleClass('single-image-mode')
if($('.viewer').hasClass('single-image-mode')){
ribbon_set.attr('scale', single_scale || 5)
} else {
ribbon_set.attr('scale', ribbon_scale || 1)
}
$('.current.image').click()
})
$('.zoom-reset')
.click(function(){
var ribbon_set = $('.ribbon-set')
ribbon_set.attr('scale', '1')
$('.current.image').click()
})
$('.zoom-in')
.click(function(){
var ribbon_set = $('.ribbon-set')
var scale = (ribbon_set.attr('scale') || 1) * 1.2
ribbon_set.attr('scale', scale)
$('.current.image').click()
})
$('.zoom-out')
.click(function(){
var ribbon_set = $('.ribbon-set')
var scale = (ribbon_set.attr('scale') || 1) / 1.2
ribbon_set.attr('scale', scale)
$('.current.image').click()
})
$('.rotate-reset')
.click(function(){
var ribbon_set = $('.ribbon-set')
ribbon_set.attr('angle', '0')
$('.current.image').click()
})
$('.rotate-cw')
.click(function(){
var ribbon_set = $('.ribbon-set')
var angle = parseInt(ribbon_set.attr('angle') || 0) + 10
ribbon_set.attr('angle', angle)
$('.current.image').click()
})
$('.rotate-ccw')
.click(function(){
var ribbon_set = $('.ribbon-set')
var angle = parseInt(ribbon_set.attr('angle') || 0) - 10
ribbon_set.attr('angle', angle)
$('.current.image').click()
})
$('.current.image').click()
})
</script>
<body>
<button class="single-image-toggle">&#9635;</button>
&nbsp;
<button class="zoom-in">+</button>
<button class="zoom-reset">1x</button>
<button class="zoom-out">-</button>
&nbsp;
<button class="rotate-ccw">&#8634;</button>
<button class="rotate-reset">0&deg;</button>
<button class="rotate-cw">&#8635;</button>
&nbsp;
<button class="drag-reset">(0,0)</button>
&nbsp;
<button class="rotate-reset zoom-reset drag-reset">reset all</button>
<div class="viewer">
<div class="ribbon-set">
<div class="ribbon-locator">
<div class="ribbon">
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
</div>
<div class="ribbon">
<div class="image"></div>
<div class="image"></div>
<div class="current image"/></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
</div>
<div class="ribbon">
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
<div class="image"></div>
</div>
</div>
</div>
</div>
</body>
</html>
<!-- vim:set ts=4 sw=4 spell : -->