简体   繁体   English

在滚动部分上更改固定div的类

[英]Change class of fixed div when over scrolled section

I have fixed div with menu. 我有菜单固定的div。 There are also some sections. 也有一些部分。 Each section has data attribute set to specific class name (eg. data-menu="black"). 每个部分的数据属性均设置为特定的类名(例如,data-menu =“ black”)。 What I'd like to achieve is when user scroll and a section with this attribute is under a fixed div, this div gets the class based on data-menu attribute. 我想要实现的是,当用户滚动并且具有此属性的部分位于固定div下时,此div根据data-menu属性获取类。 And remove when section isn't below anymore. 并在该部分不再位于下方时将其删除。

This is my is fiddle: https://jsfiddle.net/pt3taagp/1/ 这是我的小提琴: https : //jsfiddle.net/pt3taagp/1/

HTML HTML

<div class="fixed-menu">
  <ul>
  <li>menu 1</li>
  <li>menu 2</li>
  <li>menu 3</li>
  <li>etc.</li>
  </ul>
</div>
<section data-menu="menu-black">
  <img src="http://placehold.it/600x600/ffffff/000000">
</section>
<section data-menu="menu-white">
  <img src="http://placehold.it/600x600/000000/ffffff">
</section>
<div>some other content</div>

CSS CSS

fixed-menu {
  position:fixed;
  top:50px;
  left:50px;
  width:250px;
  background-color:red
}
.fixed-menu.menu-black {
  background-color:#000;
}

.fixed-menu.menu-white {
  background-color:#FFF;
}

By default menu has red background but when section with data-menu attribute=menu-white is under I'd like this menu to change background color to white, etc. 默认情况下,菜单具有红色背景,但是当具有data-menu attribute = menu-white的部分位于下面时,我希望此菜单将背景颜色更改为白色,等等。

JQuery offet() method gives relative positioning of a particular element. jQuery offet()方法给出特定元素的相对位置。 Check out this fiddle. 看看这个小提琴。

Although, this will only work if you have fixed section height. 虽然,这仅在您具有固定的剖面高度时才有效。

  window.onscroll = function() { myFunction() }; function myFunction() { var x = $("#mainmenu").offset(); if (x.top < 612) { document.getElementById("mainmenu").className = "fixed-menu menu-white"; } else if (x.top > 612) { document.getElementById("mainmenu").className = "fixed-menu menu-black"; }else{ document.getElementById("mainmenu").className = "fixed-menu"; } } 
 .fixed-menu { position: fixed; top: 50px; left: 50px; width: 250px; background-color: red } .menu-black { background-color: #000; color: white; } .menu-white { background-color: #FFF; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="main"> <div id="mainmenu" class="fixed-menu"> <ul> <li>menu 1</li> <li>menu 2</li> <li>menu 3</li> <li>etc.</li> </ul> </div> <div class="black"> <section data-menu="menu-black"> <img src="http://placehold.it/600x600/ffffff/000000"> </section> </div> <div id="white"> <section data-menu="menu-white"> <img src="http://placehold.it/600x600/000000/ffffff"> </section> </div> <div class="some-other-content"> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> </div> </div> 

Thanks to how get current mouse position on scroll and select all elements present at specified position the solution is: 由于如何获得当前鼠标在滚动上的位置选择指定位置上存在的所有元素,因此解决方案是:

  • get the mouse position in any case 无论如何获取鼠标位置
  • handle the window scroll event 处理窗口滚动事件
  • while scrolling, if the element under current mouse position is a section: change class according to the data-menu. 滚动时,如果当前鼠标位置下的元素是一个区域:请根据数据菜单更改类。 In all other cases remove the added class. 在所有其他情况下,请删除添加的类。

 var xMousePos = 0; var yMousePos = 0; var lastScrolledLeft = 0; var lastScrolledTop = 0; function GetSectionElementsAt(x, y) { var elements = $('section').map(function() { var thisObj = $(this); var offset = thisObj.offset(); var l = offset.left; var t = offset.top; var h = thisObj.height(); var w = thisObj.width(); var maxx = l + w; var maxy = t + h; return (y <= maxy && y >= t) && (x <= maxx && x >= l) ? thisObj : null; }); return elements; } $(document).mousemove(function(e) { xMousePos = e.pageX; yMousePos = e.pageY; }); $(window).on('scroll', function (e) { if(lastScrolledLeft != $(document).scrollLeft()){ xMousePos -= lastScrolledLeft; lastScrolledLeft = $(document).scrollLeft(); xMousePos += lastScrolledLeft; } if(lastScrolledTop != $(document).scrollTop()){ yMousePos -= lastScrolledTop; lastScrolledTop = $(document).scrollTop(); yMousePos += lastScrolledTop; } var eleAtCurrentMousePos = GetSectionElementsAt(xMousePos, yMousePos); if (eleAtCurrentMousePos.length > 0) { var classToSet = eleAtCurrentMousePos[0].data('menu'); if (!$('div.fixed-menu').hasClass(classToSet)) { $('div.fixed-menu').removeClass('menu-white menu-black').addClass(classToSet); } } else { $('div.fixed-menu').removeClass('menu-white menu-black'); } }); 
 .fixed-menu { position: fixed; top: 50px; left: 50px; width: 250px; background-color: red } .fixed-menu.menu-black { background-color: #000; } .fixed-menu.menu-white { background-color: #FFF; } 
 <script src="https://code.jquery.com/jquery-1.12.3.min.js"></script> <div class="fixed-menu"> <ul> <li>menu 1</li> <li>menu 2</li> <li>menu 3</li> <li>etc.</li> </ul> </div> <section data-menu="menu-black"> <img src="http://placehold.it/600x600/ffffff/000000"> </section> <section data-menu="menu-white"> <img src="http://placehold.it/600x600/000000/ffffff"> </section> <div class="some-other-content"> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM