如何通过滚动动画CSS过渡效果?

时间:2019-06-29 21:11:42

标签: javascript css animation css-animations

我有一个元素要“扩展”并更改页面背景的背景颜色。当用户滚动时,中间的一个点将扩展以用新的背景色填充页面。我看到了一些有关如何更改背景但没有“扩展”背景的示例。 I have attached a jsfiddle of the CSS animation effect I'm looking for.此示例显示了外观,但仅适用于悬停。如果滚动示例并将鼠标悬停在白点上,您会看到它的外观。1

最好用CSS动画来完成此操作,但我不反对使用javascript进行尝试。 I've been fiddling around with that here.

第二,我一直在使用伪元素来获取示例,但是有没有一种方法可以在不使用元素而仅使用容器的背景色的情况下实现这种效果?

这是我要实现的效果示例的HTML。

<div class="container">
        <span class="white"></span>
</div>

这是CSS:

.container {height:500px;width:100%;background:#ed565d;position:relative;}
.container span {display:block;}
.white {background:#ffffff;height:10px;width:10px;margin:auto;border-radius:100%;position:absolute;top:50%;left:50%;}
.container:hover .white {
    width:300%;
    height:300%;
    -moz-transition: all 0.5s ease-out;
    -o-transition: all 0.5s ease-out;
    -webkit-transition: all 0.5s ease-out;
    transition:all 0.5s ease-out;
    top:-100%;
    left:-100%;
}

2 个答案:

答案 0 :(得分:2)

如果您希望动画与用户在页面上滚动的百分比直接相关,则需要JavaScript。

首先,获取滚动百分比。这是一个很好的解决方法:https://stackoverflow.com/a/8028584/2957677

const scrollTop = $(window).scrollTop();
const documentHeight = $(document).height();
const windowHeight = $(window).height();
const scrollPercent = (scrollTop / (documentHeight - windowHeight)) * 100;

然后,您可以定义一个动画函数,该函数接受用户滚动的百分比,并将圆上的样式设置为动画开始时的CSS值和结尾处的CSS值之间的百分比。动画。

function growAnimation($element, animationPercentage) {
  const animationDecimal = animationPercentage / 100;

  // Your existing .grow CSS values
  const startPositionPercent = 50; // top/left at start of animation
  const finishSizePercent = 300; // width/height at end of animation
  const finishPositionPercent = -100; // top/left at end of animation

  // The current CSS values, based on how far the user has scrolled
  const currentSizePercent = getProgressFromTo(0, finishSizePercent, animationDecimal);
  const currentPositionPercent = getProgressFromTo(startPositionPercent, finishPositionPercent, animationDecimal);


  $element.css({
    width: `${currentSizePercent}%`,
    height: `${currentSizePercent}%`,
    top: `${currentPositionPercent}%`,
    left: `${currentPositionPercent}%`
  });
}

// A util function to get the progress between two values
// e.g. 50% between 0 and 10 is 5
function getProgressFromTo(from, to, animationDecimal) {
  return from + (to - from) * animationDecimal;
}

这是一个小提琴:https://jsfiddle.net/owazk8y1

动画曲线

您可以查看动画曲线以使动画看起来更加平滑。将animationDecimal包围在贝塞尔曲线函数中。这是一些示例函数: https://gist.github.com/gre/1650294 https://jsfiddle.net/owazk8y1/1

答案 1 :(得分:0)

这是我在这里到处犯下的各种不同想法的混合... 一小部分JS,将在CSS中试用

PS:必须在元素上设置过渡命令

const storeScroll=()=>{
  document.documentElement.dataset.scroll = window.scrollY;
}

window.onscroll=e=>{  // called when the window is scrolled.  
  storeScroll()
}

storeScroll()   // first attempt
.container {
  position   : relative;
  height     : 500px;
  width      : 100%;
  background : #ed565d;
  overflow   : hidden;  /* added */
}
.white {
  display       : block;
  position      : absolute;
  background    : #fff;
  height        : 10px;
  width         : 10px;
  margin        : auto;
  border-radius : 100%;
  top           : 50%;
  left          : 50%;
  -moz-transition    : all 0.5s ease-out;
  -o-transition      : all 0.5s ease-out;
  -webkit-transition : all 0.5s ease-out;
  transition         : all 0.5s ease-out;
}
html:not([data-scroll='0']) .white {
  width              : 300%;
  height             : 300%;
  top                : -100%;
  left               : -100%;
}
<div class="container">
  <span class="white"></span>
</div>