【问题标题】:Achieve animated seesaw -ish effect with linear-gradient (pure CSS)使用线性渐变(纯 CSS)实现动画跷跷板效果
【发布时间】:2017-05-06 16:47:51
【问题描述】:

我有一个通过调整线性梯度和高度来实现的对角边的元素 - 在两种不同的状态下。现在我尝试在这些状态之间切换并使红色三角形平滑过渡,使其看起来像跷跷板:-) 问题是,从一种状态到另一种状态它会改变方向并且跳跃,我没有找到一种方法来流畅地动画它..有没有办法使用纯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>

这是我的FIDDLE

【问题讨论】:

  • 您是否已经检查过 CSS3 和关键帧?
  • 你想让它看起来像你的小提琴,而不是通过 JS 触发吗?或者它到底应该是什么样子?
  • 抱歉不清楚:换类的JS没问题,2个状态没问题,但是从一个状态到另一个状态的过渡应该是平滑的,所以红色三角形应该表现就像一个“跷跷板” ..从有课到没有课的样子:-/我希望这更容易理解?
  • 遗憾的是,无法使用transition 属性(background-imagelinear-gradient)为背景设置动画,因此您必须“作弊”

标签: javascript html css animation css-transitions


【解决方案1】:

由于您无法为 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>

旁注:

只要保持#stage 的比率,可以使用任何固定值代替vw。如果要改变比率,你要么需要一个脚本,因为CSS calc 不能用sqrtsin/cos 等来计算角度,或者使用媒体查询,并有角度和比例是针对不同屏幕手动设置的。

【讨论】:

  • 感谢您的回答 - 很遗憾似乎必须这样做,因为我很想找到一个响应式纯 css 解决方案..
  • 哇.. 非常感谢,calcvw 做到了?!我用你的方法更新了FIDDLE
  • @ho.s 是的,calc()vw,但您可以使用任何固定值代替 vw,只要保持 #stage 的比率即可。如果要更改比率,您将需要一个脚本,因为 calc 无法使用 sqrtsin 进行数学运算来获得角度。
  • @ho.s 使用媒体查询,您可以使用其他角度和比例使其在越来越大的屏幕上看起来更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多