thibaud frere commited on
Commit
a5b2529
·
1 Parent(s): 9011170

fix: améliorer le z-index des MultiImage lors du zoom

Browse files

- Masquer temporairement les autres images lors du zoom avec medium-zoom
- Ajouter transitions fluides pour opacity et z-index
- Fallback JavaScript pour navigateurs sans support CSS :has()
- Gestion clavier (Escape) et clic overlay pour fermer le zoom
- Résout le problème des autres images visibles par-dessus le zoom

Files changed (1) hide show
  1. app/src/components/MultiImage.astro +65 -0
app/src/components/MultiImage.astro CHANGED
@@ -162,6 +162,28 @@ const gridColumns = getGridColumns();
162
  display: flex;
163
  flex-direction: column;
164
  text-align: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  }
166
 
167
  .multi-image-item :global(.ri-root) {
@@ -231,3 +253,46 @@ const gridColumns = getGridColumns();
231
  margin: 0 auto;
232
  }
233
  </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  display: flex;
163
  flex-direction: column;
164
  text-align: center;
165
+ position: relative;
166
+ z-index: var(--z-content);
167
+ transition: z-index 0.3s ease;
168
+ }
169
+
170
+ /* Quand medium-zoom est actif, masquer temporairement les autres images du multi-image */
171
+ :global(.medium-zoom--opened) .multi-image-item {
172
+ opacity: 0;
173
+ z-index: calc(var(--z-base) - 1);
174
+ transition: opacity 0.3s ease, z-index 0.3s ease;
175
+ }
176
+
177
+ /* L'image actuellement zoomée reste visible */
178
+ :global(.medium-zoom--opened) .multi-image-item:has(:global(.medium-zoom--opened)) {
179
+ opacity: 1;
180
+ z-index: var(--z-overlay);
181
+ }
182
+
183
+ /* Fallback pour navigateurs sans support :has() */
184
+ :global(.medium-zoom--opened) .multi-image-item.zoom-active {
185
+ opacity: 1 !important;
186
+ z-index: var(--z-overlay) !important;
187
  }
188
 
189
  .multi-image-item :global(.ri-root) {
 
253
  margin: 0 auto;
254
  }
255
  </style>
256
+
257
+ <script>
258
+ // Enhanced medium-zoom integration for MultiImage
259
+ document.addEventListener('DOMContentLoaded', () => {
260
+ // Amélioration du comportement des MultiImage avec medium-zoom
261
+ const multiImages = document.querySelectorAll('.multi-image');
262
+
263
+ multiImages.forEach(multiImage => {
264
+ const items = multiImage.querySelectorAll('.multi-image-item');
265
+ const zoomableImages = multiImage.querySelectorAll('img[data-zoomable="1"]');
266
+
267
+ zoomableImages.forEach(img => {
268
+ img.addEventListener('click', () => {
269
+ // Trouver l'item parent de l'image cliquée
270
+ const activeItem = img.closest('.multi-image-item');
271
+
272
+ // Ajouter la classe pour le fallback :has()
273
+ items.forEach(item => item.classList.remove('zoom-active'));
274
+ if (activeItem) {
275
+ activeItem.classList.add('zoom-active');
276
+ }
277
+ });
278
+ });
279
+ });
280
+
281
+ // Nettoyer les classes lors de la fermeture du zoom
282
+ document.addEventListener('click', (e) => {
283
+ if (e.target.classList.contains('medium-zoom-overlay')) {
284
+ // Zoom fermé, nettoyer les classes
285
+ document.querySelectorAll('.multi-image-item.zoom-active')
286
+ .forEach(item => item.classList.remove('zoom-active'));
287
+ }
288
+ });
289
+
290
+ // Écouter les événements clavier pour fermer le zoom
291
+ document.addEventListener('keydown', (e) => {
292
+ if (e.key === 'Escape') {
293
+ document.querySelectorAll('.multi-image-item.zoom-active')
294
+ .forEach(item => item.classList.remove('zoom-active'));
295
+ }
296
+ });
297
+ });
298
+ </script>