Ancres douces

Lorsqu’on clique sur un lien qui mène vers une ancre dans la même page et que le navigateur « saute » brutalement jusqu’à cette ancre, le visiteur perd la notion de l’endroit où il se trouve et ne visualise pas la structure globale de la page. En termes d’ergonomie c’est assez mauvais, et on attend le navigateur qui trouvera la solution.

Dans l’immédiat, chacun peut améliorer cela sur son propre site SPIP. Le plugin Ancres douces fait une chose (et une seule) : il transforme toutes les ancres (<a href="#xxx">) des pages en « ancres douces », où le navigateur fait défiler doucement la page jusqu’à l’ancre. Ainsi le lecteur sait en permanence où il se trouve dans la page, et peut plus facilement remonter, etc.

On peut voir ce plugin en action sur le site des blogs du Monde diplo (cliquer sur « XX commentaires » ou sur les appels de note, par exemple).

Ce plugin est une intégration à SPIP de deux scripts jQuery d’Ariel Flesler, avec lesquels il est possible de faire plein d’autres jolis scrolls (voir les démos) :
— localScroll
— scrollTo

Restreindre ancres_douces à certains blocs

Si vous utilisez d’autres scripts javascripts utilisant aussi les ancres (par exemple un slider jquery), il est possible que des interférences se produisent avec ancres_douces.

Pour éviter ces interférences, il est nécessaire d’indiquer sur quel bloc ou quels types de blocs on veut restreindre le fonctionnement de ancres_douces.

Pour cela, on doit définir dans mes_options.php la constante « CONTEXTE_ANCRES_DOUCES ».

Exemple :
-  Pour restreindre au bloc d’id contenu (convient sur un grand nombre de squelettes spip ) :

define ('CONTEXTE_ANCRES_DOUCES','#contenu'); 


-  pour restreindre à tous les éléments de classe « ancres_douces »

define ('CONTEXTE_ANCRES_DOUCES','.ancres_douces'); 

Bugs connus :
-  fonctionne mal avec Opera. (corrigé en 1.2)

À noter, le plugin Ancres douces est aussi intégré sous forme d’une lame du Couteau suisse.

Discussion

36 discussions

  • 1

    Testé en Spip 4.2.0,
    RAS, tout semble fonctionner // Compatible 4.2

    Répondre à ce message

  • Bonjour,

    Maintenant qu’on peut faire ça avec une ligne de CSS, est-ce qu’il serait pertinent de modifier ce plugin pour ne plus avoir de javascript ?

    Un peu de doc : https://blog.mayank.co/better-scrolling-through-modern-css

    @media (prefers-reduced-motion: no-preference) {
    	html {
    		scroll-behavior: smooth;
    	}
    }

    Répondre à ce message

  • 8

    Dans le cas où il y a des conflits javascript, je trouve plus simple de prendre le problème à l’envers : garder les ancres douces partout, et désactiver sur certains blocs ponctuellement.

    Dans ce cas, je rajoute la classe « no-ancres-douces » là où ça pose poroblème, et dans mes_options.php :

    <code>define ('ANCRES_DOUCES_CONTEXTE',':not(.no_ancres_douces)');</code>
    • Oups, j’ai parlé trop vite, ça ne fonctionne pas ainsi. Et la bonne valeur c’est CONTEXTE_ANCRES_DOUCES.

    • C’est corrigé dans la doc...

    • Bonsoir,

      Je déterre cette option qui ne fonctionne pas chez moi :

      define ('CONTEXTE_ANCRES_DOUCES',':not(.no_ancres_douces)');

      alors que :

      define ('CONTEXTE_ANCRES_DOUCES','.ancres_douces');

      fonctionne !

      Il n’y a rien a modifier dans Ancres Douces ?

      Merci.
      François.

    • Bonjour,

      De mon côté je n’arrive pas à faire fonctionner le define avec le sélecteur :not() comme tu l’indiques : tu as modifié autre chose ?

      SPIP et Ancres Douces à jours.

      Merci,
      françois

    • Non je n’étais pas arrivé à faire fonctionner ainsi, et depuis je n’ai pas trop regardé.
      Nb : maintenant c’est de base dans les navigateurs récents :

      html {
        scroll-behavior: smooth;
      }
    • Merci tcharlss, mais c’est confidentiel quand même :
      https://caniuse.com/#feat=css-scroll-behavior

      Je vais regarder du côté de jQuery.localScroll.

    • Et bien il y a la variable filter qui permet de filtrer les sélecteurs que l’on veut exclure :

      $.localScroll.defaults.filter = ':not(.no_ancres_douces)';

      mais il faut applique le sélecteur directement sur les href à exclure et pas uniquement sur le conteneur !

      françois

    • D’après canisuse, il n’y a plus que sur safari que scroll-behavior: smooth; n’est pas défini

    Répondre à ce message

  • Bonjour,
    j’utilise le plugin avec un « menu » a gauche " et les ancres dans un div sur la droite avec overflow auto
    si je clique et que le déplacement doit être vers le bas cela décale
    si je clique et que le déplacement doit être vers le haut ... cela marche nikel

    avez vous une idée du pb ?

    merci

    Répondre à ce message

  • Salut,

    pour un plugin, je cherche à désactiver le hash dans l’url.

    J’arrive bien à changer le événement déclencheur par défaut (defaults.event) mais pas l’apparition du hash.

    $( window ).load(function() {
       $.localScroll.defaults.event = 'mouseover';
       $.localScroll.defaults.hash = false;
    });

    L’option est en dur dans le pipeline, ça veut dire qu’on ne peut pas la surcharger ?
    Ou alors, comment désactiver le hash uniquement sur certains liens ?

    Merci

    Répondre à ce message

  • Juste une remarque : 2 versions de ce plugins s’installent en parallèle au lieu d’être remplacées :
    1.5.1 SVN [115158]
    1.3 SVN [43216]

    Répondre à ce message

  • 1

    Bonjour est-il possible d’adapter les ancres douces, (dans l’idée de faire un slide) sur le système de pagination de spip ?

    D’avance merci

    Répondre à ce message

  • 1

    Le plugin ne fonctionne pas sous chrome ? Est ce normal ?

    (derniere version du plugin et de spip)
    Google Chrome pour mac est à jour Version 72.0.3626.121 (Build officiel) (64 bits)

    • EDIT. le plugin marche sous chrome. Ce sont les ancres douce du couteau suisse qui ne marche pas.

    Répondre à ce message

  • 6

    Bonjour,

    le plugin fonctionne bien en spip1.9.2e avec plugin jquery1.9.2.
    Par contre l’intérêt que je voyais dans ce plugin, était de me sortir d’un problème de mise en page.

    Ayant un header fixe et ma page qui commence dessous, les ancres normales redirige bien au renvoi mais par rapport au haut de la page qui est du coup caché par mon header fixe.

    J’aurais donc voulu modifier ce plugin afin qu’il me permette de rediriger vers l’ancre +tant de pixel. Comment cela est-t’il possible ? J’ai essayé de modifié scrollto.js sans succès. Il me faudrait rajouter 82px pour que l’ancre renvoie bien à la première portion visible.

    Merci d’avance

    • J’ai trouvé ceci comme info

      http://flesler.blogspot.com/2007/10/jqueryscrollto.html

      il semble que ce que je cherche soit possible par le paramètre offset mais je ne le trouve nulle part dans le plugin et n’y connaissan rien, je ne réussi pas à l’ajouter. Voici ce que j’ai testé

      ;(function( $ ){
      	
      	var $scrollTo = $.scrollTo = function( target, offset, duration, settings ){
      		$(window).scrollTo( target, offset, duration, settings );
      	};
      
      	$scrollTo.defaults = {
      		top:82,
      		axis:'y',
      		duration:1
      	};

      comment faire passer ce paramètre offset. Merci

    • Il semble que le plugin ancres douces utilise les fonctions de base des plugins scroolTo et localTo. Il ne me semble pas possible de lui faire passer des paramètres optionnels mis à part en les écrivant en dur dans les liens dans le squelettes.
      Ais-je tort ?

    • Cette demande date, mais je n’ai pas trouvé d’autre moyen pour répondre à une problématique similaire que de surcharger le script jquery.localscroll.js en y ajoutant un paramètre « offset » ligne 46.

    • Bonjour Yohoo,

      Voici ce qui est indiqué dans jquery.localscroll.js l. 38 :

      // The defaults are public and can be overriden.

      Il faut peut-être ajouter la valeur d’offset dans ton js.perso :

      $localScroll.defaults = {
        offset:85
      }
    • Ben vouai, on peut y arriver comme ça :

      $.extend($.localScroll.defaults, {
      	duration:1500
      });
      $.extend($.scrollTo.defaults, {
      	offset:-50
      });

      https://github.com/flesler/jquery.scrollTo#changing-the-default-settings

    • En plus souple amha :

      $.localScroll.defaults.duration = 1700;
      $.scrollTo.defaults.offset = -85;

    Répondre à ce message

  • Ça serait possible d’activer aussi les ancres douces pour le reste du squelette ?
    Par exemple pour #top ?

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom