0

I have a question and don't know what to do to achieve it!

This is the case. I hope that when scrolling the article, for example, when scrolling to the service section of the article, the service of the header can add the yellow CSS style at this time, but I will only increase the style when I click, and how to scroll. Don’t you know if you change the style of the header?

The attached picture is the effect I hope to achieve. Thank you all for your help.enter image description here

$(document).ready(function(){
  $('.item').click(function(e){
    e.preventDefault();
    let target = $(this).attr('href');
    // console.log(target);
    let position = $(target ).offset().top - 20;
    // console.log(target,position) 
    $('.content').animate({scrollTop: position}, 1000);
  })
  
   $(window).scroll(function(){
     console.log('scroll');
   });
})

//add active CSS
 $('.js-about').on('click',function(){
      $('.js-about').addClass('active');
      $('.js-service').removeClass('active');
})

 $('.js-service').on('click',function(){
      $('.js-service').addClass('active');
      $('.js-about').removeClass('active');
})
.wrap {
  width: 500px;
  background-color: #c7e1fc;
  border-radius: 20px;
  padding: 20px;
  margin: 60px auto;
}
.wrap .header {
  display: flex;
  border-bottom: 2px solid #222;
  padding: 10px;
}
.wrap .header .item {
  margin-right: 60px;
  text-decoration: none;
  font-weight: 600;
  color:#222;
}
.wrap .content {
  height: 500px;
  overflow-y: scroll;
}
.wrap .content .box1, .wrap .content .box2 {
  margin: 30px;
}
.wrap .content h2 {
  display: inline-block;
  font-weight: 900;
  font-size: 36px;
  background-color: #222;
  color: #fff;
  padding: 10px;
}
.wrap .content p {
  font-size: 16px;
  line-height: 1.5;
}
.wrap .box2 {
  height: 490px;
}

.active {
  font-weight: 500;
  color: #000;
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap">
    <ul class="header">
      <li><a href="#js-box1" class="item js-about">ABOUT</a></li>
      <li><a href="#js-box2" class="item js-service">SERVICE</a></li>
    </ul>
  <div class="content">
    <section class="box1" id="js-box1">
         <h2 class="about">about</h2>
      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,</p>
    </section>
     <section class="box2" id="js-box2">
         <h2 class="service">service</h2>
     <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla .
uptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla .</p>
     </section>
  </div>
</div>
AWEI
  • 417
  • 3
  • 9

1 Answers1

1

You can check the offset().top of the second section. Like this:

$(document).ready(function(){
  $('.item').click(function(e){
    e.preventDefault();
    let target = $(this).attr('href');
    // console.log(target);
    let position = $(target ).offset().top + $('.content').scrollTop() - 20;
    // console.log(target,position) 
    $('.content').animate({scrollTop: position}, 1000);
  })
  
  $('*').scroll(function(){
    if($('#js-box2').offset().top - $('.wrap').offset().top < $('.header').height() + 50) {
      $('.js-about').removeClass('active');
      $('.js-service').addClass('active');
    }
    else {
      $('.js-about').addClass('active');
      $('.js-service').removeClass('active');
    };
  });
})
.wrap {
  width: 500px;
  background-color: #c7e1fc;
  border-radius: 20px;
  padding: 20px;
  margin: 60px auto;
}
.wrap .header {
  display: flex;
  border-bottom: 2px solid #222;
  padding: 10px;
}
.wrap .header .item {
  margin-right: 60px;
  text-decoration: none;
  font-weight: 600;
  color:#222;
}
.wrap .content {
  height: 500px;
  overflow-y: scroll;
}
.wrap .content .box1, .wrap .content .box2 {
  margin: 30px;
}
.wrap .content h2 {
  display: inline-block;
  font-weight: 900;
  font-size: 36px;
  background-color: #222;
  color: #fff;
  padding: 10px;
}
.wrap .content p {
  font-size: 16px;
  line-height: 1.5;
}
.wrap .box2 {
  height: 490px;
}

.active {
  font-weight: 500;
  color: #000;
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap">
  <ul class="header">
    <li><a href="#js-box1" class="item js-about active">ABOUT</a></li>
    <li><a href="#js-box2" class="item js-service">SERVICE</a></li>
  </ul>
  <div class="content">
    <section class="box1" id="js-box1">
      <h2 class="about">about</h2>
      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat.</p>
    </section>
    <section class="box2" id="js-box2">
      <h2 class="service">service</h2>
      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat.</p>
      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias,
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat. Alias, voluptatem? Veritatis dolores suscipit aut dicta nulla aliquid.Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corporis, dolores repellat.</p>
    </section>
  </div>
</div>

You can do this for following sections as well using else if starting with the last one.

RatajS
  • 1,403
  • 1
  • 14
  • 22
  • First of all, thank you for providing me with a good way, but I found a strange phenomenon! When I click on the service, the yellow background style will run about first and then return to the service. There is a flashing phenomenon. What is the cause of this problem? – AWEI Nov 01 '21 at 15:18
  • 1
    @AWEI It’s because it detects the automated scrolling, it would be better to omit activating the link on click. – RatajS Nov 01 '21 at 18:41
  • I edited it, now it won’t change the background right after clicking. – RatajS Nov 01 '21 at 18:44
  • 1
    If you would like the background to change right away, you could use a variable to check whether 1 second passed after last item click before changing the background due to scrolling. – RatajS Nov 01 '21 at 18:57
  • Hello, I really want to know how to write a variable that you said to create a variable to access and replace the background immediately after a second, but I don’t know how to complete the program for a long time, I don’t know if I can ask you Write an example so that I can learn? thanks – AWEI Nov 02 '21 at 16:11
  • @AWEI I meant a variable to temporarily disable the background color after a click on the item, I created an example: https://jsfiddle.net/hqy4d7mv/2/ I also noticed the scrolling didn’t work when I had already scrolled down. I fixed it by adding the `$('.content').scrollTop()` to `position` – RatajS Nov 02 '21 at 16:30
  • Thank you for the example, but I tried it and found that in your example, when you click on about and then click on service, then click on about and click on service again, will it still cause a flashing problem? – AWEI Nov 03 '21 at 07:07
  • @AWEI I made the variable to disable the links as well. https://jsfiddle.net/b8rh1m0n/ – RatajS Nov 03 '21 at 15:42
  • Thank you so much~ you are really amazing – AWEI Nov 03 '21 at 16:47