Как сделать параллакс показа текста в css?

Нужно создать такой параллакс эффект
Не могу понять как создать такой параллакс. Нужно чтобы при скроле проявлялся текст.


Не могу понять как создать такой параллакс эфект


Ответы (1 шт):

Автор решения: Alexandr_TT

Решить задачу можно с помощью анимации маски SVG.

  1. Нижний слой будет красный прямоугольник с текстом.
  2. Верхний слой будет фиолетовый прямоугольник, к которому применена маска с набором окружностей, у которых fill="black" При закраске чёрным цветом маска прорезает верхний слой и становится виден нижний красный слой сквозь эти отверстия.

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" >   
        <!-- Маска -->
   <mask id="msk">
    <rect width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>       
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS</text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  />  
 
</svg>   

Теперь можно сделать параллакс

Для этого нужно просто двигать маску:

#1. Горизонтальный параллакс

Начало анимации после клика

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" style="border:1px solid gray;" >   
   <mask id="msk">
   <g>
    <rect  width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>   
         <!-- Анимация движения маски -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="4s"
        values="0 0;400 0"
        fill="freeze"
        restart="whenNotActive" />  
    </g>      
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS</text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  >
        
       </rect>    
         
</svg>   

#2. Вертикальный параллаксм

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" style="border:1px solid gray;" >   
   <mask id="msk">
   <g>
    <rect  width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>   
         <!-- Анимация движения маски -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="4s"
        values="0 0;0 100"
        fill="freeze"
        restart="whenNotActive" />  
    </g>      
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS</text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  >
        
       </rect>    
         
</svg>   

#3. Вертикальный параллакс с возвратом

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" style="border:1px solid gray;" >   
   <mask id="msk">
   <g>
    <rect  width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>   
         <!-- Анимация движения маски -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="4s"
        values="0 0;0 100;0 100;0 0;0 0"
        repeatCount="indefinite"
        restart="whenNotActive" />  
    </g>      
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS</text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  >
        
       </rect>    
         
</svg>   

Update

Анимация движения текста

В этих примерах маска неподвижна, двигается сам текст

#1. По горизонтали

<!-- Анимация движения текста -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="6s"
        values="0 0;300 0;0 0"
        fill="freeze"
        restart="whenNotActive" />  

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" style="border:1px solid gray;" >   
   <mask id="msk">
  
    <rect  width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>   
              
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS
     <!-- Анимация движения текста -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="6s"
        values="0 0;300 0;0 0"
        fill="freeze"
        restart="whenNotActive" />  
    </text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  >
        
       </rect>    
         
</svg>   

#2. По вертикали

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"  width="400" height="100" viewBox="0 0 400 100" style="border:1px solid gray;" >   
   <mask id="msk">
  
    <rect  width="400" height="100" fill="white" /> 
     <g fill="black">      
      <circle cx="0" cy="5" r="30"  /> 
        <circle cx="100" cy="90" r="30"  /> 
         <circle cx="200" cy="-25" r="80"  /> 
            <circle cx="320" cy="50" r="32"  /> 
               <circle cx="405" cy="90" r="30" /> 
        </g>   
              
    </mask>  
        <!-- Красный фон с текстом -->
    <rect width="400" height="100" fill="#FE5F55" />    
    <text x="200" y="65" text-anchor="middle" font-size="48px" font-weight="700" fill="white">BIOS
     <!-- Анимация движения текста по вертикали -->
      <animateTransform
        attributeName="transform"
        type="translate"
        begin="svg1.click"
        dur="4s"
        values="0 0;0 50;0 -30"
        fill="freeze"
        restart="whenNotActive" />  
    </text>
              <!-- Синий маскирующий прямоугольник -->
      <rect width="400" height="100" mask="url(#msk)" fill="#8E5DF8"  >
        
       </rect>    
         
</svg>   

→ Ссылка