Skip to content

Commit bfabe42

Browse files
committed
Better zoom
1 parent e1a941b commit bfabe42

File tree

3 files changed

+101
-12
lines changed

3 files changed

+101
-12
lines changed

assets/css/main.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2352,6 +2352,12 @@ button,
23522352
opacity: 0.9;
23532353
}
23542354

2355+
.image.fit img,
2356+
.image.main img {
2357+
max-width: 400px;
2358+
height: auto;
2359+
object-fit: cover;
2360+
23552361
/* Prevent body scroll when modal is open */
23562362
body.modal-open {
23572363
overflow: hidden;

assets/js/image-modal.js

Lines changed: 95 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,36 @@
66
var modalImg = $('#modalImage');
77
var captionText = $('#caption');
88
var closeBtn = $('.close');
9+
10+
// Transform state
911
var scale = 1;
12+
var translateX = 0;
13+
var translateY = 0;
1014
var minScale = 0.5;
1115
var maxScale = 5;
16+
17+
// Dragging state
18+
var isDragging = false;
19+
var lastX = 0;
20+
var lastY = 0;
21+
22+
function updateTransform() {
23+
modalImg.css('transform', `scale(${scale}) translate(${translateX}px, ${translateY}px)`);
24+
}
25+
26+
function resetTransform() {
27+
scale = 1;
28+
translateX = 0;
29+
translateY = 0;
30+
updateTransform();
31+
}
1232

1333
// Add click event to all images
1434
$('.image.fit img, .image.main img').on('click', function() {
1535
modal.show();
1636
modalImg.attr('src', this.src);
1737
captionText.text($(this).attr('alt'));
18-
scale = 1; // Reset zoom
19-
modalImg.css('transform', 'scale(' + scale + ')');
38+
resetTransform();
2039
});
2140

2241
// Mouse wheel zoom
@@ -26,20 +45,88 @@
2645
var zoomSpeed = 0.1;
2746

2847
if (delta < 0) {
29-
// Zoom in
3048
scale = Math.min(maxScale, scale + zoomSpeed);
3149
} else {
32-
// Zoom out
3350
scale = Math.max(minScale, scale - zoomSpeed);
3451
}
3552

36-
$(this).css('transform', 'scale(' + scale + ')');
53+
updateTransform();
54+
});
55+
56+
// Mouse drag events
57+
modalImg.on('mousedown', function(e) {
58+
if (scale > 1) {
59+
isDragging = true;
60+
lastX = e.clientX;
61+
lastY = e.clientY;
62+
$(this).css('cursor', 'grabbing');
63+
e.preventDefault();
64+
}
65+
});
66+
67+
$(document).on('mousemove', function(e) {
68+
if (isDragging) {
69+
var deltaX = e.clientX - lastX;
70+
var deltaY = e.clientY - lastY;
71+
72+
translateX += deltaX;
73+
translateY += deltaY;
74+
75+
lastX = e.clientX;
76+
lastY = e.clientY;
77+
78+
updateTransform();
79+
}
80+
});
81+
82+
$(document).on('mouseup', function() {
83+
if (isDragging) {
84+
isDragging = false;
85+
modalImg.css('cursor', scale > 1 ? 'grab' : 'pointer');
86+
}
3787
});
3888

39-
// Double-click to reset zoom
89+
// Touch events for mobile
90+
var lastTouchX = 0;
91+
var lastTouchY = 0;
92+
93+
modalImg.on('touchstart', function(e) {
94+
if (scale > 1 && e.touches.length === 1) {
95+
isDragging = true;
96+
lastTouchX = e.touches[0].clientX;
97+
lastTouchY = e.touches[0].clientY;
98+
e.preventDefault();
99+
}
100+
});
101+
102+
modalImg.on('touchmove', function(e) {
103+
if (isDragging && e.touches.length === 1) {
104+
var deltaX = e.touches[0].clientX - lastTouchX;
105+
var deltaY = e.touches[0].clientY - lastTouchY;
106+
107+
translateX += deltaX;
108+
translateY += deltaY;
109+
110+
lastTouchX = e.touches[0].clientX;
111+
lastTouchY = e.touches[0].clientY;
112+
113+
updateTransform();
114+
e.preventDefault();
115+
}
116+
});
117+
118+
modalImg.on('touchend', function() {
119+
isDragging = false;
120+
});
121+
122+
// Double-click to reset
40123
modalImg.on('dblclick', function() {
41-
scale = 1;
42-
$(this).css('transform', 'scale(' + scale + ')');
124+
resetTransform();
125+
});
126+
127+
// Update cursor based on zoom level
128+
modalImg.on('load', function() {
129+
$(this).css('cursor', scale > 1 ? 'grab' : 'pointer');
43130
});
44131

45132
// Close modal events

experiments/umbrella-girl.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,6 @@ <h2>Generation Timings</h2>
210210
<tr><td>NAG + Daemon + Hyper</td><td>87.64s</td></tr>
211211
<tr><td>NAG + Daemon + Tea</td><td>180.52s</td></tr>
212212
<tr><td>NAG + Daemon + Hyper + Tea</td><td>73.29s</td></tr>
213-
<tr><td>NAG + Daemon + DEIS</td><td>178.81s</td></tr>
214-
<tr><td>NAG + Daemon + Hyper + DEIS</td><td>73.25s</td></tr>
215-
<tr><td>NAG + Daemon + Tea + DEIS</td><td>182.49s</td></tr>
216-
<tr><td>All Features + DEIS</td><td>73.29s</td></tr>
217213
</tbody>
218214
</table>
219215
</div>

0 commit comments

Comments
 (0)