使用线性渐变(纯CSS)实现动画跷跷板效果

时间:2017-05-05 11:34:43

标签: javascript html css animation css-transitions

我有一个通过调整线性渐变和高度来实现一个对角线边的元素 - 处于两种不同的状态。现在我尝试在这些状态之间切换,并使红色三角形平滑过渡,这样看起来像是一个跷跷板:-)问题是,从一个状态到另一个状态,它改变方向并且是跳跃的,我没有找到一种方法来流畅地制作它。有没有办法达到我想要的纯CSS,例如使用过渡?



let btn = document.getElementsByTagName('button')[0];
let stage = document.getElementById('stage');

btn.addEventListener('click', function() {
  stage.classList.toggle('fixie');
});

body,
ul {
  padding: 0;
  margin: 0;
}

#stage {
  width: 100%;
  height: 14em;
  background: pink;
  padding: 0;
  border: 1px solid blue;
}

#stage::before {
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  /*as high as #stage*/
  opacity: 0.4;
  content: '';
  z-index: 1;
  background: linear-gradient(to left bottom, red 50%, pink 50%);
  /*transition: height 4s;*/
  /*transition: linear-gradient 4s 8s;*/
}

#stage.fixie::before {
  height: 30%;
  background: linear-gradient(to right bottom, red 50%, pink 50%);
}

<div id="stage"></div>
<button>animate gradient</button>
&#13;
&#13;
&#13;

这是我的FIDDLE

1 个答案:

答案 0 :(得分:3)

由于您无法为linear-gradient设置动画,因此以下是使用transform的解决方法

在此示例中,我使用了skew。由于倾斜程度会根据宽度/高度而有所不同,只要保持其比例,就会完全响应,否则你需要一个小脚本。

(function(){
 let btn = document.getElementsByTagName('button')[0];
 let stage = document.getElementById('stage');
 
 btn.addEventListener('click', function() {
    stage.classList.toggle('fixie');
 });
})();
body, ul {
  padding: 0;
  margin: 0;
}
#stage {
  position: relative;
  overflow: hidden;
  width: 90vw;
  height: calc(90vw * 0.2677);     /*  0.2677, aspect ratio that match skew degree  */
  background: pink;
  padding: 0;
  border: 1px solid blue;
}
.navi {
  width: 100%;
  min-height: 4em;
  height: auto;
  background: green;
  z-index: 2;
  position: relative;
}
#stage::before {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%; /*as high as #stage*/
  bottom: 100%;
  opacity: 0.4;
  z-index: 1;
  background: red;
  transform: skewY(15deg);
  transform-origin: left bottom;
  transition: transform 2s;
}
#stage.fixie::before {
  transform: skewY(-15deg) translateY(100%);
}
.navi ul {
  list-style: none;
  display: flex;
  background:  lightblue;
  justify-content: flex-end;
}
.navi ul li {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 4em;
  width: auto;
  height:  2em;
  margin: 1px;
  background: yellow;
}
<div id="stage"></div>
<button>
animate
</button>

旁注:

只要保留vw的比例,就可以使用任何固定值而不是#stage。如果要更改比率,您需要一个脚本,因为CSS calc无法使用sqrtsin / cos等来获取角度,或者使用媒体查询,并为不同的屏幕手动设置角度和比率。