javascript - 旋转具有绝对位置的 img
问题描述
我正在制作一个圆形 div,它在 div 的外部有图像。使用 javascript,我每 4 秒将其旋转四分之一。为了防止图像倾斜,我将它们朝相反的方向旋转。这可以防止它们倾斜,但会导致它们在圆的周边上移动。我认为这是因为位置是绝对的。有什么建议吗?
amount=0;
ids=['box1','box2','box3']
setInterval(rotate, 4000);
///clearTimeout(time);
function rotate() {
document.getElementById("graphicContainer").setAttribute("style", "transform: rotate(" + amount * 2 * Math.PI / (ids.length).toString() + "rad)");
document.getElementById("box1").setAttribute("style", "transform: rotate(" + -amount * 2 * Math.PI / (ids.length).toString() + "rad)");
document.getElementById("box2").setAttribute("style", "transform: rotate(" + -amount * 2 * Math.PI / (ids.length).toString() + "rad)");
document.getElementById("box3").setAttribute("style", "transform: rotate(" + -amount * 2 * Math.PI / (ids.length).toString() + "rad)");
amount = amount + 1;
}
#graphicContainer div img {
width: 50px;
position: absolute;
transition: all 1.75s ease-in;
transform-origin: center;
}
#graphicContainer {
position: relative;
height: 500px;
width: 500px;
border: 1px solid black;
border-bottom-left-radius: 50%;
border-top-left-radius: 50%;
border-bottom-right-radius: 50%;
border-top-right-radius: 50%;
transition: all 1.75s ease-in;
transform-origin: center;
margin: 0px;
}
#box1,
#box2,
#box3 {
transform-origin: center;
position: relative;
transition: all 1.75s ease-in;
animation-direction: reverse;
}
<div id="graphicContainer">
<div class="box" id="box1"> <img id="goalsGraphic" src="../images/running.jpg"> </div>
<div class="box" id="box2"> <img id="workGraphic" src="../images/work.jpg"> </div>
<div class="box" id="box3"> <img id="progressGraphic" src="../images/progress.jpg"> </div>
</div>
解决方案
调整了
img 容器应具有的 css 样式:
position:absolute
,因此它们可以自由移动和定位以匹配圆。top: 50%; left: 50%
所以它的变换中心点是圆的中心
img 应该具有margin-top: -25%; margin-left: -50%
或任何其他允许位移的样式,以考虑图像的高度和宽度。
使用translate
变换偏移 50% 定位
amount=0;
ids=['box1','box2','box3']
setInterval(rotate, 4000);
///clearTimeout(time);
const cssrotfn = a=>`transform: rotate(${a}deg) translate(250px) rotate(${-a}deg)`
const cssrotbyidx = (idx, len)=>cssrotfn(idx * 360/len)
rotate()
function rotate() {
// document.getElementById("graphicContainer").setAttribute("style", "transform: rotate(" + amount * 2 * Math.PI / (ids.length).toString() + "rad)");
document.getElementById("box1").setAttribute("style", cssrotbyidx(1+amount,3));
document.getElementById("box2").setAttribute("style", cssrotbyidx(2+amount,3));
document.getElementById("box3").setAttribute("style", cssrotbyidx(3+amount,3));
amount = amount + 1;
}
#graphicContainer div img {
width: 50px;
transition: all 1.75s ease-in;
transform-origin: center;
margin-top: -25%; margin-left: -50%;
}
#graphicContainer {
position: relative;
height: 500px;
width: 500px;
border: 1px solid black;
border-bottom-left-radius: 50%;
border-top-left-radius: 50%;
border-bottom-right-radius: 50%;
border-top-right-radius: 50%;
transition: all 1.75s ease-in;
transform-origin: center;
margin: 0px;
}
#box1,
#box2,
#box3 {
transform-origin: center;
position: absolute;
transition: all 1.75s ease-in;
animation-direction: reverse;
top: 50%; left: 50%;
}
<div id="graphicContainer">
<div class="box" id="box1"> <img id="goalsGraphic" src="https://i.imgur.com/CW9CiQ6.jpg"> </div>
<div class="box" id="box2"> <img id="workGraphic" src="https://i.imgur.com/CW9CiQ6.jpg"> </div>
<div class="box" id="box3"> <img id="progressGraphic" src="https://i.imgur.com/CW9CiQ6.jpg"> </div>
</div>
推荐阅读
- python - 使用 Pub/Sub 和 Dataflow 从单个 JSON 创建多行并将其插入到 BigQuery
- json - 用于检查 IP 是否在欧盟的 URL
- r - 如何制作时间变异函数
- javascript - 功能变量动态设置
- docker - 使用 docker-compose 将文件放入 HDFS
- kubernetes - HTTPS 请求重定向到 HTTP
- android - 如何使用处理程序创建计时器
- sql - Node js 向 SQL Server 发出请求,返回结果
- microsoft-graph-api - 在 Microsoft Graph 中获取附加消息的附件
- javascript - Javascript 函数在 Google 检查功能中触发,但并非如此