3D✨ Premium

360 Viewer

Une bande trois fois plus large que le cadre, peinte d'un long dégradé du bleu nuit au jaune et retour à la nuit, qu'on fait glisser à la souris, au doigt ou aux flèches du clavier, et qui boucle sans fin : le script la recopie bout à bout. Un panorama horizontal qu'on déroule — tout le tour pour une photo panoramique à 360°, sans vue vers le haut ni vers le bas.

JSDragPanorama

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. 3D comprend 50 effets, dont 8 gratuits. Découvrir la catégorie →

3 exemples d'usage

Le coucher de soleil depuis la terrasse — page d'un restaurant panoramique — 360 Viewer exemple 1

① Le coucher de soleil depuis la terrasse — page d'un restaurant panoramique

QuandEn tête de la page de réservation : le dégradé sert de ciel au-dessus d'une ligne de toits, avec les heures de 19 h à 21 h 30 posées dans le ciel ; on fait glisser du jaune de 19 h au rouge de 20 h 30 et au bleu de 21 h 30, sous le titre « Réservez en terrasse à l'heure dorée ».
PourquoiLe dégradé déjà présent dans le code est un ciel du soir : faire glisser, c'est faire passer l'heure, et la boucle ramène au jour suivant. La capture ne sachant pas glisser, la scène fait aller et venir la bande d'elle-même.
RéglagesRacine sans fond, cadre de 540 × 360 px (hauteur en ligne passée à 360 px), coins carrés ; ligne de toits en SVG de 120 px et repères d'heure placés DANS la bande (ils tournent avec elle et sont recopiés dans la copie) ; titre et bouton posés par-dessus, hors de la bande ; scène seulement : aller-retour automatique de 6 s, arrêté par le premier vrai glisser.
Le panorama depuis la table d'orientation — site d'un syndicat d'initiative de montagne — 360 Viewer exemple 2

② Le panorama depuis la table d'orientation — site d'un syndicat d'initiative de montagne

QuandPage de la table d'orientation : un panorama de chaîne de volcans, avec les repères « Puy de Dôme · 1 465 m », « Lac d'Aydat », « Clermont-Ferrand » et « Massif du Sancy ». Le randonneur fait glisser la vue comme il tournerait la tête, et fait le tour complet.
PourquoiGlisser une image plus large que le cadre reproduit le regard qui balaie l'horizon ; comme la bande boucle, le tour se fait sans butée, comme sur place. Le code accepte n'importe quelle image de fond.
RéglagesBande peinte d'un ciel clair et d'un SVG de quatre plans (chaîne lointaine, collines, lac, ville), dont les bords gauche et droit sont à la même hauteur pour que la couture ne se voie pas ; repères en position absolue, en pourcentage de la bande ; scène seulement : rotation continue de 110 px/s.
Les saisons du vignoble qu'on fait défiler — page « Notre année » d'un domaine — 360 Viewer exemple 3

③ Les saisons du vignoble qu'on fait défiler — page « Notre année » d'un domaine

QuandPage « Notre année » du domaine : la bande recolorée de l'hiver (gris) au printemps (vert tendre), à l'été (or) et aux vendanges (pourpre), puis de nouveau l'hiver, avec les étiquettes « Janvier · Taille », « Avril · Débourrement », « Août · Véraison », « Septembre · Vendanges » et des rangs de vigne en bas.
PourquoiUne année continue qu'on parcourt du doigt : le glisser fait sentir la durée, là où quatre vignettes découperaient le temps, et la boucle dit qu'après les vendanges vient une nouvelle taille.
RéglagesDégradé de la bande remplacé par neuf étapes #9aa3ad → #a9d18e → #e5b544 → #7b2d5b → #9aa3ad (mêmes couleurs aux deux bouts) ; rangs dessinés en dégradés répétés dans la bande ; scène seulement : aller-retour automatique de 7 s.

Comment ça marche

La racine .fx-0042-root (fond #0a0a0f, 300 px de haut au minimum) contient le cadre .xr-360-viewer (toute la largeur × 300 px, coins arrondis de 8 px, overflow: hidden) et la bande .xr-360-scene, posée en haut à gauche et large de 300 % : le cadre en montre un tiers. Elle est peinte d'un dégradé horizontal en huit étapes, de #1a1a2e au bleu #0f3460, au violet #533483, au rouge #e94560, au pêche #f38181 et au jaune #fce38a, puis de nouveau #1a1a2e : la bande finit de la couleur exacte où elle commence, c'est ce qui rend la boucle invisible.

Au démarrage, le script clone la bande, marque la copie aria-hidden="true" et la colle à sa gauche. Il ne garde qu'un nombre, le décalage cumulé, et place les deux exemplaires à p et p − largeur, où p est le décalage ramené entre 0 et la largeur de la bande : quel que soit le chemin parcouru, le cadre est toujours couvert. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : après des glissers de 400 px vers la droite puis de 1 500 et 3 000 px vers la gauche, aucune colonne de pixels vide dans le cadre. Le glisser suit le pointeur au pixel près (120 px de glisser = 120 px de bande), sans transition ni inertie ; un tour complet demande trois largeurs de cadre.

Les événements pointer servent à la fois à la souris, au doigt et au stylet, avec capture du pointeur pendant le geste ; touch-action: pan-y laisse la page défiler verticalement quand le doigt glisse de haut en bas, et réserve le geste horizontal au panorama (mesuré au doigt dans Chromium avec de vrais événements tactiles). Au clavier, le cadre prend le focus et chaque flèche gauche ou droite tourne d'un dixième de la largeur du cadre. Une instance démarre par cadre trouvé sous une racine .fx-0042-root : deux panoramas sur une page glissent chacun de leur côté (mesuré). Ce n'est pas une sphère : on tourne la tête de gauche à droite, jamais vers le haut ni vers le bas, et l'image est affichée à plat, sans correction de projection.

Accessibilité

  • Clavier : le cadre est focalisable (tabindex="0"), annoncé par son aria-label (panorama à faire glisser ou à tourner aux flèches), et entouré d'un contour jaune de 2 px au focus. Flèche gauche ou droite : un dixième de la largeur du cadre par appui. Mesuré dans Chromium, Firefox et WebKit.
  • Mouvement réduit : rien ne bouge tout seul et aucune transition n'anime la bande : elle ne se déplace que sous le doigt, la souris ou la touche, au rythme de l'utilisateur. Le rendu est donc identique avec ou sans prefers-reduced-motion (mesuré : 0 animation dans les deux cas).
  • Contenu de la bande : la copie de la boucle est masquée aux lecteurs d'écran, les repères placés dans la bande ne sont donc lus qu'une fois. Une image de fond n'a pas de texte de remplacement : si le panorama porte une information (sommets, heures, étapes), écrivez-la aussi en texte, dans la bande ou à côté, comme les scènes ci-dessus.
  • Toucher : touch-action: pan-y garde le défilement vertical de la page ; seul le glisser horizontal fait tourner le panorama.

Compatibilité navigateur

CSS (transformations 2D, dégradé) + 41 lignes de JavaScript (clonage de la bande, événements pointer avec capture, clavier, redimensionnement), aucune dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : boucle sans bande vide après 3 000 px de glisser, glisser au pixel près, clavier, deux copies indépendantes ; toucher mesuré dans Chromium. Rien en 3D : le rendu de WebKit est ici représentatif.

Chrome 55+✓ Complet
Firefox 59+✓ Complet
Safari 13+✓ Complet
Edge 79+✓ Complet
Mobile iOS✓ Non vérifié sur un vrai appareil
Android Chrome✓ Complet

Sans JavaScript, le cadre montre le premier tiers de la bande, immobile, et rien ne glisse. Sans événements pointer (navigateur très ancien), même chose : le panorama reste lisible mais figé. Si votre image n'a pas des bords gauche et droit qui se raccordent, la boucle marche quand même, mais la couture se voit à chaque tour.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0042-root">
  <div class="xr-360-viewer" tabindex="0" role="group" aria-label="Panorama: drag, or use the left and right arrow keys, to look around" style="width:100%;height:300px;">
    <div class="xr-360-scene">
      <!-- votre panorama : dégradé, image de fond, repères en position absolue -->
    </div>
    <!-- le script ajoute ici une copie de .xr-360-scene (aria-hidden) pour la boucle -->
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Image panoramique (CSS — background de .xr-360-scene) dégradé en huit étapes, #1a1a2e aux deux bouts Remplacez le dégradé par url(votre-panorama.jpg) center / 100% 100%. Pour une boucle sans couture, le bord droit de l'image doit prolonger le bord gauche : c'est le cas d'une photo panoramique à 360°. Pour un dégradé, finissez par la couleur de départ.
Longueur de la bande (CSS — width: 300%) 300 % (un tour = trois largeurs de cadre) Réglez-la sur le rapport de votre image : un panorama de 6 000 × 1 000 px dans un cadre de 300 px de haut fait 1 800 px de long, soit 300 % d'un cadre de 600 px. Plus la bande est longue, plus il faut glisser pour faire le tour.
Hauteur du cadre (HTML — style="height:300px" du cadre) 300 px Le style est écrit dans le HTML : changez-le là. Si vous agrandissez la hauteur, gardez la longueur de la bande proportionnelle pour que l'image ne se déforme pas.
Pas du clavier (JS — viewer.offsetWidth / 10) un dixième de la largeur du cadre / 20 donne des pas plus fins ; / 4 fait sauter d'un quart de cadre, pratique pour passer d'un repère à l'autre.
Repères dans la bande (HTML — éléments en position: absolute dans .xr-360-scene) aucun Placez-les en pourcentage de la bande (left: 32%) : ils tournent avec le panorama et la copie de la boucle les reprend automatiquement. N'y mettez pas d'id : la copie le dupliquerait.
Fond et contour (CSS — .fx-0042-root, border-radius et :focus-visible du cadre) #0a0a0f, coins de 8 px, contour jaune #fce38a Retirez le fond de la racine pour poser le cadre sur votre page ; accordez la couleur du contour de focus à votre charte en gardant un contraste net avec le panorama.

FAQ

Pour le tour horizontal, oui : la bande boucle sans fin et une photo panoramique à 360° fait le tour complet sans couture. Mais ce n'est pas une sphère : on ne regarde ni vers le haut ni vers le bas, et l'image est affichée à plat, sans correction de projection. Pour une photo sphérique (équirectangulaire) qu'on explore dans toutes les directions, il faut une bibliothèque WebGL, ce que ce code n'utilise pas.
Pour la boucle. Une seule bande finit toujours par montrer son bord ; avec deux exemplaires collés bout à bout et un décalage ramené à la longueur de la bande, le cadre est toujours couvert, quel que soit le chemin parcouru (mesuré : aucune colonne vide après 3 000 px de glisser). La copie est marquée aria-hidden pour que les lecteurs d'écran ne lisent pas deux fois les repères ; évitez les id dans la bande, ils seraient dupliqués.
Non : touch-action: pan-y laisse au navigateur les gestes verticaux, la page défile quand le doigt va de haut en bas ; seul le geste horizontal fait tourner le panorama. Le script utilise les événements pointer, communs à la souris, au doigt et au stylet (mesuré au doigt dans Chromium avec de vrais événements tactiles).