<!-- https://texteffects.dev/posts/ice-text-effect -->
<div>
  <h1 data-heading="Frozen" contenteditable>
    Frozen
    
    <!-- HTML for if you're animating and/or using text shadows instead of drop shadows-->
    <!-- <span class="layer1" aria-hidden="true">Frozen</span> -->
    <span class="animation" aria-hidden="true">Frozen</span> 
  </h1>
</div>
body {
  background: linear-gradient(to bottom, #000428, #004e92),
    url("https://assets.codepen.io/209981/ice5.jpg");
  background-blend-mode: saturation;
  background-size: cover;
}

div {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  position: relative;
}

h1 {
  transform: translate(0, -40%);
  font-size:  calc(20vw + 0.5rem);
  font-family: "frozen", serif;
  background-image: url("https://assets.codepen.io/209981/ice.jpg");
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-size: contain;
  position: relative;
  -webkit-text-stroke: 1px #4f90ab;
  
  // If not animating use drop-shadows to keep the effect simple and limit    HTML elements
  filter: 
    drop-shadow(0 0 2px rgba(255,255,255, 0.7))
    drop-shadow(0 0 2px rgba(41, 131, 172, 0.7))
    drop-shadow(0 0 30px rgba(125, 204, 239, 0.8))
    drop-shadow(0 0 30px rgba(58, 122, 155, 0.8));
}

// If you have performance issues with the animation use text-shadows instead of the drop shadow
/*.layer1 {
  position: absolute;
  left: 0;
  text-shadow: 
    1px -1px 2px rgba(255, 255, 255, 0.2), 
    1px -1px 2px rgba(255, 255, 255, 0.2), 
    -1px -1px 2px rgba(255, 255, 255, 0.2), 
    2px 2px 2px rgba(41, 131, 172, 0.2), 
    -2px 2px 2px rgba(41, 131, 172, 0.2), 
    -2px -2px 2px rgba(41, 131, 172, 0.2), 
    3px 3px 30px rgba(125, 204, 239, 0.5), 
    -3px 3px 30px rgba(125, 204, 239, 0.5), 
    -3px -3px 30px rgba(125, 204, 239, 0.5), 
    -6px 6px 30px rgba(58, 122, 155, 0.5), 
    6px 6px 30px rgba(58, 122, 155, 0.5), 
    -6px -6px 30px rgba(58, 122, 155, 0.5);
    -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    mix-blend-mode: hard-light;
}*/

// ANIMATION STYLES

.animation {
  position: absolute;
  left: 0;
  background: linear-gradient(
    45deg,
    rgba(255, 255, 255, 0) 45%,
    rgba(255, 255, 255, 0.8) 50%,
    rgba(255, 255, 255, 0) 55%,
    rgba(255, 255, 255, 0) 100%
  );
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  animation: shine 7s infinite;
  background-size: 200%;
}


// The animation with data-attributes and psuedo-elements (not recommended due to accessibility issues atm) - https://textlab.dev/posts/data-attributes-and-text-effects
// h1::before {
//  content: attr(data-heading) / "";
//  position: absolute;
//  left: 0;
//  background: linear-gradient(
//    45deg,
//    rgba(255, 255, 255, 0) 45%,
//    rgba(255, 255, 255, 0.8) 50%,
//    rgba(255, 255, 255, 0) 55%,
//    rgba(255, 255, 255, 0) 100%
//  );
//  -webkit-background-clip: text;
//  color: transparent;
//  animation: shine 7s infinite;
//  background-size: 200%;
// }


@keyframes shine {
  0% {
    background-position: -120%;
  }
  10% {
    background-position: 120%;
  }
  100% {
    background-position: 120%;
  }
}

@font-face {
  font-family: "Frozen";
  src: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/209981/Ice%20kingdom%20-%20Bold%20-%20Por%20Kustren.woff");
}
View Compiled

// JS is to make the text editable for demo purpose, not required for the effect You can remove it and the effect still works.
// Thanks for the suggestion @chriscoyier! 
var h1 = document.querySelector("h1");

h1.addEventListener("input", function() {
    this.setAttribute("data-heading", this.innerText);
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.