Dhr*_*dha 5 html css css3 css-transitions css-transforms
我创建了这个动画,但它并不流畅.当您将鼠标悬停在蓝色圆圈上时,会打开一个彩色圆圈,但开口不稳定,不是100%平滑.动画可以平滑,怎么样?
#container {
border: 1px solid black;
width: 600px;
height: 600px;
position: relative;
}
#circle {
margin: 0;
padding: 0;
border: 1px solid black;
width: 50px;
height: 50px;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
overflow: hidden;
transition: width 0.2s, height 0.2s;
}
#circle a {
margin: 0;
display: block;
padding: 0;
width: 250px;
height: 220px;
position: absolute;
top: 50%;
left: 50%;
transform-origin: 0 0;
}
#circle a:hover {
opacity: 0.5;
cursor: pointer;
}
#trap1 {
background-color: green;
transform: rotate(0deg) skewX(30deg);
}
#trap2 {
background-color: yellow;
transform: rotate(60deg) skewX(30deg);
}
#trap3 {
background-color: red;
transform: rotate(120deg) skewX(30deg);
}
#trap4 {
background-color: blue;
transform: rotate(180deg) skewX(30deg);
}
#trap5 {
background-color: orange;
transform: rotate(240deg) skewX(30deg);
}
#trap6 {
background-color: purple;
transform: rotate(300deg) skewX(30deg);
}
#hide {
position: absolute;
top: 50%;
left: 50%;
z-index: 1;
transform: translate(-50%, -50%);
width: 50px;
height: 50px;
border-radius: 50%;
background-color: cyan;
}
#circle:hover {
width: 500px;
height: 500px;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
<div id="circle">
<div id="hide"></div>
<a id="trap1"></a>
<a id="trap2"></a>
<a id="trap3"></a>
<a id="trap4"></a>
<a id="trap5"></a>
<a id="trap6"></a>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
原因:(没有备份链接/来源,这只是一个有根据的猜测)
我过去遇到过类似的情况,我设法发现抖动是由于(我相信)子像素渲染问题而发生的。
当 height
和width
转换时,元素的更新似乎是逐像素发生的。例如,在下面的代码片段中,有两个div
元素的height
和width
正在被转换(第一个元素增加了3px
over 5s
,而第二个元素增加了5px
)。这里要注意的关键是,第一个div
有三个可见步骤,而第二个有五个步骤(意味着它们逐像素增加)。
div{
display: inline-block;
height: 100px;
width: 100px;
background: red;
border: 1px solid;
margin: 10px;
transition: all 5s linear;
}
div:nth-child(1):hover{
height: 103px;
width: 103px;
}
div:nth-child(2):hover{
height: 105px;
width: 105px;
}
Run Code Online (Sandbox Code Playgroud)
<div></div>
<div></div>
Run Code Online (Sandbox Code Playgroud)
现在你可能会问我这和震动有什么关系。连接是 和height
逐width
像素增加,但意味着translate(-50%, -50%)
没有。元素平移的 px 有时是分数,似乎在实际转换过程中发生了一些修正以克服这些分数。
解决方案:(或解决方法)
如果我们不使用translate(-50%, -50%)
水平+垂直居中的技巧,而是通过提供top
和left
以像素为单位直接定位元素,您会发现没有抖动。根据我的理解,这是因为浏览器逐像素转换所有 4 个属性(、和 ),因此不存在导致校正的小height
数值。width
top
left
(在最新的 Chrome + Windows 10 上测试。)
#container {
border: 1px solid black;
width: 600px;
height: 600px;
position: relative;
}
#circle {
margin: 0;
padding: 0;
border: 1px solid black;
width: 50px;
height: 50px;
border-radius: 50%;
position: absolute;
top: 275px;
left: 275px;
overflow: hidden;
transition: all 0.2s;
}
#circle a {
margin: 0;
display: block;
padding: 0;
width: 250px;
height: 220px;
position: absolute;
top: 50%;
left: 50%;
transform-origin: 0 0;
}
#circle a:hover {
opacity: 0.5;
cursor: pointer;
}
#trap1 {
background-color: green;
transform: rotate(0deg) skewX(30deg);
}
#trap2 {
background-color: yellow;
transform: rotate(60deg) skewX(30deg);
}
#trap3 {
background-color: red;
transform: rotate(120deg) skewX(30deg);
}
#trap4 {
background-color: blue;
transform: rotate(180deg) skewX(30deg);
}
#trap5 {
background-color: orange;
transform: rotate(240deg) skewX(30deg);
}
#trap6 {
background-color: purple;
transform: rotate(300deg) skewX(30deg);
}
#hide {
position: absolute;
top: 50%;
left: 50%;
z-index: 1;
transform: translate(-50%, -50%);
width: 50px;
height: 50px;
border-radius: 50%;
background-color: cyan;
}
#circle:hover {
width: 500px;
height: 500px;
left: 50px;
top: 50px;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
<div id="circle">
<div id="hide"></div>
<a id="trap1"></a>
<a id="trap2"></a>
<a id="trap3"></a>
<a id="trap4"></a>
<a id="trap5"></a>
<a id="trap6"></a>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)