Table des matières
源码文件:
实现功能
ibe
two
three
源码分析:
Maison interface Web tutoriel HTML bootstrap源码分析之scrollspy(滚动侦听)

bootstrap源码分析之scrollspy(滚动侦听)

Jun 06, 2016 am 09:32 AM

源码文件:

Scrollspy.js

实现功能

1、当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项
2、导航必须是 .nav > li > a 结构,并且a上href或data-target要绑定hashkey
3、菜单上必须有.nav样式
4、滚动区域的data-target与导航父级Id(一定是父级)要一致

<span style="color: #800000"><div id="selector" class="navbar navbar-default">
    <ul class="nav navbar-nav">
        <li>
<a href="#one">one</a> </li>
        <li>
<a href="#two">two</a> </li>
        <li>
<a href="#three">three</a> </li>
    </ul>
</div>
<div data-spy="scroll" data-target="#selector" style="height:100px; overflow:hidden;overflow-y: auto;">
    <h4 id="ibe">ibe</h4>
<p>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br></p>
    <h4 id="two">two</h4>
<p>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br></p>
    <h4 id="three">three</h4>
<p>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br>One的具体内容<br></p>
</div></span>
Copier après la connexion

源码分析:

1、原理:当滚动容器内的hashkey位置距离容器顶部只有 offset设置的值,就会设置导航中对应的href高亮
2、如果滚动区域是body,会将滚动区域元素标记为window(构造函数中判断)

<span style="color: #0000ff">this</span>.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
Copier après la connexion
3、getScrolHeight:获取滚动容器的内容高度(包含被隐藏部分)
<span style="color: #0000ff">this</span>.$scrollElement[0].scrollHeight || Math.max(<span style="color: #0000ff">this</span>.$body[0].scrollHeight, document.documentElement.scrollHeight)
Copier après la connexion
4、refresh:刷新并存储滚动容器内各hashkey的值
  4.1、默认用offset来获取定位值,如果滚动区域不是window则用position来获取
<span style="color: #0000ff">if</span> (!$.isWindow(<span style="color: #0000ff">this</span>.$scrollElement[0<span style="color: #000000">])) {
      offsetMethod </span>= 'position'<span style="color: #000000">
      offsetBase   </span>= <span style="color: #0000ff">this</span>.$scrollElement.scrollTop() <span style="color: #008000">//</span><span style="color: #008000">获取基础高度,如果滚动区域内有不参与滚动计算的内容</span>
   }
Copier après la connexion
  4.2、根据导航上的hashkey来遍历获取 滚动区域内的hashkey对应的offset值:
<span style="color: #0000ff">this</span><span style="color: #000000">.$body
     .find(</span><span style="color: #0000ff">this</span><span style="color: #000000">.selector)
      .map(</span><span style="color: #0000ff">function</span><span style="color: #000000"> () {
        </span><span style="color: #0000ff">var</span> $el   = $(<span style="color: #0000ff">this</span><span style="color: #000000">)
        </span><span style="color: #0000ff">var</span> href  = $el.data('target') || $el.attr('href'<span style="color: #000000">)
        </span><span style="color: #0000ff">var</span> $href = /^#./.test(href) && $(href) <span style="color: #008000">//</span><span style="color: #008000">获取滚动区域内的hashkey对应的元素</span>

        <span style="color: #0000ff">return</span><span style="color: #000000"> ($href
          </span>&&<span style="color: #000000"> $href.length
          </span>&& $href.is(':visible'<span style="color: #000000">)
          </span>&& [[$href[offsetMethod]().top + offsetBase, href]]) || <span style="color: #0000ff">null</span><span style="color: #000000">
      })
      .sort(</span><span style="color: #0000ff">function</span> (a, b) { <span style="color: #0000ff">return</span> a[0] - b[0<span style="color: #000000">] })
      .each(</span><span style="color: #0000ff">function</span><span style="color: #000000"> () {
        that.offsets.push(</span><span style="color: #0000ff">this</span>[0<span style="color: #000000">])
        that.targets.push(</span><span style="color: #0000ff">this</span>[1<span style="color: #000000">])
      })</span>
Copier après la connexion
5、process:滚动条事件触发函数,用于计算当前需要高亮那个导航菜单
   5.1、获取滚动容器已滚动距离:
<span style="color: #0000ff">var</span> scrollTop    = <span style="color: #0000ff">this</span>.$scrollElement.scrollTop() + <span style="color: #0000ff">this</span>.options.offset
Copier après la connexion
  5.2、滚动容器可以滚动的最大高度
<span style="color: #008000">//</span><span style="color: #008000">最大可以滚动高度=滚动设置距离(offset)+ 滚动容器内容高度 - 滚动容器设置的高度</span>
<span style="color: #0000ff">var</span> maxScroll    = <span style="color: #0000ff">this</span>.options.offset + scrollHeight - <span style="color: #0000ff">this</span>.$scrollElement.height()
Copier après la connexion
   5.3、设置滚动元素逻辑:
<span style="color: #0000ff">for</span> (i = offsets.length; i--;) {<span style="color: #008000">//</span><span style="color: #008000">遍历所有的offset</span>
     activeTarget != targets[i] <span style="color: #008000">//</span><span style="color: #008000">判断当前target是否等于activeTarget</span>
        && scrollTop >= offsets[i] <span style="color: #008000">//</span><span style="color: #008000">滚动高度>i元素的offset</span>
        && (offsets[i + 1] === undefined || scrollTop //<span style="color: #008000">i + 1元素不存在,或者i+1元素不大于滚动高度</span>
        && <span style="color: #0000ff">this</span>.activate(targets[i]) <span style="color: #008000">//</span><span style="color: #008000">设置i为当前活动项</span>
    }
Copier après la connexion
6、active:设置指定的导航菜单高亮
7、clear:清除所有高亮菜单
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel est le but du & lt; datalist & gt; élément? Quel est le but du & lt; datalist & gt; élément? Mar 21, 2025 pm 12:33 PM

L'article traite du HTML & lt; Datalist & GT; élément, qui améliore les formulaires en fournissant des suggestions de saisie semi-automatique, en améliorant l'expérience utilisateur et en réduisant les erreurs. COMMANDE COMPRES: 159

Quel est le but du & lt; Progress & gt; élément? Quel est le but du & lt; Progress & gt; élément? Mar 21, 2025 pm 12:34 PM

L'article traite du HTML & lt; Progress & GT; élément, son but, son style et ses différences par rapport au & lt; mètre & gt; élément. L'objectif principal est de l'utiliser & lt; Progress & gt; pour l'achèvement des tâches et & lt; mètre & gt; pour stati

Quel est le but du & lt; mètre & gt; élément? Quel est le but du & lt; mètre & gt; élément? Mar 21, 2025 pm 12:35 PM

L'article traite du HTML & lt; mètre & gt; élément, utilisé pour afficher des valeurs scalaires ou fractionnaires dans une plage, et ses applications courantes dans le développement Web. Il différencie & lt; mètre & gt; De & lt; Progress & gt; et ex

Comment utiliser les attributs de validation du formulaire HTML5 pour valider l'entrée utilisateur? Comment utiliser les attributs de validation du formulaire HTML5 pour valider l'entrée utilisateur? Mar 17, 2025 pm 12:27 PM

L'article discute de l'utilisation des attributs de validation de formulaire HTML5 comme les limites requises, motifs, min, max et longueurs pour valider la saisie de l'utilisateur directement dans le navigateur.

Quelle est la balise Meta de la fenêtre? Pourquoi est-ce important pour une conception réactive? Quelle est la balise Meta de la fenêtre? Pourquoi est-ce important pour une conception réactive? Mar 20, 2025 pm 05:56 PM

L'article traite de la balise Meta de la fenêtre, essentielle pour la conception Web réactive sur les appareils mobiles. Il explique comment une utilisation appropriée garantit une mise à l'échelle optimale du contenu et une interaction utilisateur, tandis que la mauvaise utilisation peut entraîner des problèmes de conception et d'accessibilité.

Quel est le but du & lt; iframe & gt; étiqueter? Quelles sont les considérations de sécurité lorsque vous l'utilisez? Quel est le but du & lt; iframe & gt; étiqueter? Quelles sont les considérations de sécurité lorsque vous l'utilisez? Mar 20, 2025 pm 06:05 PM

L'article traite du & lt; iframe & gt; L'objectif de Tag dans l'intégration du contenu externe dans les pages Web, ses utilisations courantes, ses risques de sécurité et ses alternatives telles que les balises d'objet et les API.

Quelles sont les meilleures pratiques pour la compatibilité entre les navigateurs dans HTML5? Quelles sont les meilleures pratiques pour la compatibilité entre les navigateurs dans HTML5? Mar 17, 2025 pm 12:20 PM

L'article examine les meilleures pratiques pour assurer la compatibilité des navigateurs de HTML5, en se concentrant sur la détection des fonctionnalités, l'amélioration progressive et les méthodes de test.

Comment utiliser le html5 & lt; time & gt; élément pour représenter les dates et les temps sémantiquement? Comment utiliser le html5 & lt; time & gt; élément pour représenter les dates et les temps sémantiquement? Mar 12, 2025 pm 04:05 PM

Cet article explique le html5 & lt; time & gt; élément de représentation sémantique de date / heure. Il souligne l'importance de l'attribut DateTime pour la lisibilité à la machine (format ISO 8601) à côté du texte lisible par l'homme, stimulant AccessIbilit

See all articles