Change text color black to white on overlap of bg

前端 未结 3 1539
长情又很酷
长情又很酷 2021-01-02 00:21

I have a div that is positioned absolute with a background color gradient. I have this text on it that I want to change to the color white as I scroll the text up.

I

相关标签:
3条回答
  • 2021-01-02 00:44

    You can use gradient to color the text. The trick is to have this gradient similar to your shape (same degree and coloration change at the edge of the shape). Since your skewed element is fixed, you need to make the gradient to also be fixed to create the magic effect of text scrolling:

    .gradient-background {
      position: fixed;
      top: 0;
      left: 0;
      width: 100px;
      height: 200px;
      background-image: linear-gradient(to bottom, rgb(100, 182, 240) 15%, rgb(81, 155, 244));
      transform: skewY(-15deg);
      transform-origin:left;
    }
    
    .scroll-content {
      position: absolute;
      top: 50px;
      /* 165deg = 180deg - 15deg   */
      background: linear-gradient(165deg, #fff 195px,#000 195px) fixed;
      background-clip: text;
      -webkit-background-clip: text;
      color: transparent;
      -webkit-text-fill-color: transparent;
    }
    <div class="gradient-background">
    </div>
    <div class="scroll-content">
      <p> abc 1 </p>
      <p> abc 2 </p>
      <p> abc 3 </p>
      <p> abc 4 </p>
      <p> abc 5 </p>
      <p> abc 6 </p>
      <p> abc 7 </p>
      <p> abc 8 </p>
      <p> abc 9 </p>
      <p> abc 10 </p>
      <p> abc 11 </p>
      <p> abc 12 </p>
      <p> abc 13 </p>
      <p> abc 14 </p>
      <p> abc 15 </p>
      <p> abc 16 </p>
      <p> abc 17 </p>
      <p> abc 18 </p>
      <p> abc 19 </p>
    </div>

    0 讨论(0)
  • 2021-01-02 01:00

    You can measure with JavaScript and apply styles to tags that fall inside the range you want, but you can also do something very simple to make the text readable (this falls under “some other trick I can do”):

    .scroll-content {
      text-shadow: 0 0 3px white;
    }
    

    This will only show up when it’s over the blue background, and disappear over the white background. This does depend on the effect you want to achieve, though.

    Even with a JavaScript implementation, you might consider this for progressive enhancement (for JS-less users).

    0 讨论(0)
  • 2021-01-02 01:08

    You could do this with some javascript:

    $(document).ready(function() {
      $(window).scroll(function() {
        var bgHeight = $('.bg-container').height();
        var scroll = $(window).scrollTop();
        $('.scroll-content p').each((i, el) => {
          var pPos = $(el).offset().top;
          var pHeight = $(el).height();
    
          if (pPos < (scroll - pHeight + bgHeight)) {
            $(el).removeClass('black');
            $(el).addClass('white');
          } else {
            $(el).addClass('black');
            $(el).removeClass('white');
          }
        });
      })
    })
    .bg-container {
      position: fixed;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
    }
    
    .gradient-background {
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      background-image: linear-gradient(to bottom, rgb(1, 55, 124) 15%, rgb(81, 155, 244));
    }
    
    .scroll-content {
      position: relative;
      z-index: 99999;
      font-family: neuzeit-grotesk, sans-serif;
      font-weight: 700;
    }
    
    .white {
      color: #fff;
    }
    
    .black {
      color: black;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="bg-container">
      <div class="gradient-background">
        &nbsp;
      </div>
    </div>
    <br/><br/><br/><br/><br/><br/>
    <div class="scroll-content menu_black">
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
      <p>asdf</p>
    </div>

    0 讨论(0)
提交回复
热议问题