我有一个通过调整线性渐变和高度来实现一个对角线边的元素 - 处于两种不同的状态。现在我尝试在这些状态之间切换,并使红色三角形平滑过渡,这样看起来像是一个跷跷板:-)问题是,从一个状态到另一个状态,它改变方向并且是跳跃的,我没有找到一种方法来流畅地制作它。有没有办法达到我想要的纯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;
这是我的FIDDLE
答案 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
无法使用sqrt
和sin
/ cos
等来获取角度,或者使用媒体查询,并为不同的屏幕手动设置角度和比率。