J'ai récemment créé un site Web dans AngularJs. Je suis encore en phase d'apprentissage. Je souhaite corriger un élément sur une page après qu'il ait atteint le sommet. J'ai essayé toutes sortes de fonctions Javascript et Jquery. Cependant, ils ne semblent pas fonctionner.
J'ai également essayé d'utiliser Angular Ui-scrollfix de l'interface utilisateur, mais cela ne fonctionne pas non plus.
Je partage mon code. Il s'agit d'une page partielle. Veuillez me conseiller une méthode pour obtenir l'effet mentionné ci-dessus.
<div class="row pdiv">
<div class="col-md-8 pdiv col-md-offset-2">
<h3><b>About Us</b></h3>
<ul class="nav nav-justified">
<li role="presentation"><a href="" ng-click="scrollTo('weAre')">What are we?</a></li>
<li role="presentation"><a href="" ng-click="scrollTo('brandsAssociation')">Brands Associations</a></li>
<li role="presentation"><a href="" ng-click="scrollTo('knowUs')">Know Us</a></li>
<li role="presentation"><a href="" ng-click="scrollTo('motto')">Our Motto</a></li>
</ul>
</div>
<div id="weAre" class="col-md-8 pdiv col-md-offset-2">
<br>
<h4><b>What are we?</b></h4>
<p>Some content goes here.</p>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
<div id="brandsAssociation" class="col-md-8 pdiv col-md-offset-2">
<br>
<h4><b>Brands Associations</b></h4>
<p>Some content goes here.</p>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
<div id="knowUs" class="col-md-8 pdiv col-md-offset-2">
<br>
<h4><b>Know Us</b></h4>
<p>Some content goes here.</p>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
<div id="motto" class="col-md-8 pdiv col-md-offset-2">
<br>
<h4><b>Our Motto</b></h4>
<p>Some content goes here.</p>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
</div>
<a href="" ng-click="scrollTo('header')"><span id="toTop" class="glyphicon glyphicon-chevron-up"></span></a>
J'ai besoin de corriger la classe ul .nav .nav-justifiée après avoir atteint le haut de la page.
J'utilise bootstrap.
voici les dépendances javascript.
<script src="angular/angular.min.js"></script>
<script src="angular/angular-route.js"></script>
<script src="js/jquery.js"></script>
<script src="js/bootstrap.min.js"></script>
Veuillez aider ...
Pour corriger votre ul
en haut lorsqu'il atteint le haut de la page lors du défilement, vous pouvez lui mettre une directive qui vérifie la fenêtre scrollTop () dépassant le ul
l'élément offset en haut. Lorsque cela se produit, la directive peut simplement ajouter une classe à l'élément qui la fixe en haut.
Ainsi, votre balisage ul
ressemblerait à ceci, avec la nouvelle directive set-class-when-at-top
dessus:
<ul class="nav nav-justified" set-class-when-at-top="fix-to-top">
Cette directive ajouterait la classe CSS fix-to-top
à l'élément lorsque l'élément atteint le haut de la page. La définition de la directive ressemblerait à ceci:
app.directive('setClassWhenAtTop', function ($window) {
var $win = angular.element($window); // wrap window object as jQuery object
return {
restrict: 'A',
link: function (scope, element, attrs) {
var topClass = attrs.setClassWhenAtTop, // get CSS class from directive's attribute value
offsetTop = element.offset().top; // get element's offset top relative to document
$win.on('scroll', function (e) {
if ($win.scrollTop() >= offsetTop) {
element.addClass(topClass);
} else {
element.removeClass(topClass);
}
});
}
};
});
Si vous voulez devenir un peu effronté, vous pouvez même réduire votre gestionnaire scroll
à une seule ligne:
$win.on('scroll', function (e) {
element[($win.scrollTop() >= offsetTop) ? 'addClass' : 'removeClass'](topClass);
});
Et le fix-to-top
La classe CSS serait juste quelque chose comme ceci:
.fix-to-top {
position: fixed;
top: 0;
}
Voici un violon .
J'ai commencé à utiliser l'excellente réponse de MikeJ pour commencer, mais j'ai rapidement réalisé quelques lacunes:
offset top
soit passé là où se trouve la $win.scrollTop()
, afin qu'il ne disparaisse pas derrière ce menu, puis soit réparé après.Pour résoudre ces problèmes, j'ai proposé une version modifiée:
function setClassWhenAtTop($window) {
var $win = angular.element($window);
return {
restrict: "A",
link: function (scope, element, attrs) {
var topClass = attrs.setClassWhenAtTop,
topPadding = parseInt(attrs.paddingWhenAtTop, 10),
parent = element.parent(),
offsetTop;
$win.on("scroll", function () {
// dynamic page layout so have to recalculate every time;
// take offset of parent because after the element gets fixed
// it now has a different offset from the top
offsetTop = parent.offset().top - topPadding;
if ($win.scrollTop() >= offsetTop) {
element.addClass(topClass);
parent.height(element.height());
} else {
element.removeClass(topClass);
parent.css("height", null);
}
});
}
};
}
Cela nécessite que l'élément que vous corrigez soit encapsulé dans un parent vide qui ne contient que l'élément à corriger. Il s'agit à la fois de savoir où se trouvait le décalage d'origine de l'élément (pour le remettre dans le flux de documents) et d'avoir la hauteur de l'élément d'origine pour conserver le flux de documents tel qu'il était. De plus, passez un attribut pour paddingWhenAtTop
pour le corriger plus tôt (ou plus tard si vous le souhaitez).
L'utilisation dans le HTML change comme ceci:
<div>
<ul class="nav nav-justified" set-class-when-at-top="fix-to-top" padding-when-at-top="50">
</div>
Voici ma tentative pour le rendre complètement angulaire:
JS
.directive('setClassWhenAtTop', ['$window', function($window) {
var $win = angular.element($window); // wrap window object as jQuery object
return {
restrict: 'A',
link: function (scope, element, attrs)
{
var topClass = attrs.setClassWhenAtTop, // get CSS class from directive's attribute value
topPadding = parseInt(attrs.paddingWhenAtTop, 10),
offsetTop = element.prop('offsetTop'); // get element's offset top relative to document
$win.on('scroll', function (e) {
if ($window.pageYOffset + topPadding >= offsetTop) {
element.addClass(topClass);
} else {
element.removeClass(topClass);
}
});
}
};
}])
CSS
.fix-to-top {
position: fixed;
top: 55px;
height: 50px;
z-index: 999;
width: 100%;
}
HTML
<div class="navigation-bar" set-class-when-at-top="fix-to-top" padding-when-at-top="55">
...
Modifications principales pour ignorer jquery:
parent.offset().top => element.prop('offsetTop')
$win.scrollTop() => $window.pageYOffset
Astuce du jour: Pourriez-vous s'il vous plaît arrêter de toujours donner des réponses de questions jquery angularjs title! Ou du moins l'indiquez clairement dans votre titre ou dans vos réponses ;-)