元素A围绕元素B旋转时的偏移量设置问题
希望小方块绕着大方块的中心做地月环绕
现在这段代码是可以实现效果,但是其中transform-origin的值和translate偏移量是反复调出来的,完全没摸到规律。
比如我设置了translate(400px, 0),小方块应该向右移动400,但实际上这距离没有400,transform-origin旋转的圆心往左偏移多少,最后调试出来的-135px也不知道为什么是这么多。
假设我希望小方块的中心距离大方块中心100px,改变rotate的值能看到小方块围绕大方块地月环绕运动,transform-origin和translate应该设为多少?是怎么算出来的?
HTML:
<body>
<div class="flag">
<div class="square big"></div>
<div class="square small"></div>
</div>
</body>
CSS:
<style>
* {
margin: 0;
padding: 0;
}
.flag {
width: 500px;
height: 300px;
background-color: #ddd;
position: relative;
}
.flag .square {
width: 50px;
height: 50px;
position: absolute;
top: 100px;
left: 100px;
}
.flag .big {
background-color: darkred;
}
.flag .small {
background-color: deeppink;
transform: scale(0.4) translate(400px, 0) rotate(45deg);
transform-origin: -135px 25px;
}
</style>
正在回答
同学你好,截图中的代码表示匹配属于父元素box4的特定类型的第3个子元素p标签,由于“我是3号”所在p标签,属于box盒子下的第三个子元素p标签,所以会被选中。
而粘贴的代码中,.flag .sub-star:nth-of-type(1) 确实表示的应该是选中flag下的第一个类名为sub-star的子元素,但是由于设置的类名,并不能排除选择的是div还是p等其他类型的标签,所以解析时,第一个div元素会影响选择的顺序。
可以调整下代码测试理解下,如下:
将第一个div标签改成p标签
此时解析,就会排除第一个子元素p标签,正确选择到第一个类名为sub-star的元素,如下:
同学可以将这个现象作为特殊情况,特殊记忆一下,实际开发中,更推荐给元素设置不同的类名来设置不同的样式即可。
祝学习愉快~
同学你好,对于你的问题解答如下:
1、因为缩放后,元素改变大小,导致视觉上位置发生改变移除了屏幕。
2、同学这个560px是设置的left属性值,并不是偏移量translate的值。同学不用多余纠结,计算可能会存在误差,重点是要通过控制台慢慢调试值来实现效果。
3、:nth-of-type(n) 选择器匹配属于父元素的特定类型的第n个子元素, 因为flag下第一个元素是main-star,第一个sub-start元素是作为flag下的第二个子元素的,所以要选择第一个sub-start元素,应该将序号设置为2
4、同学这种实现效果的思路也是可以的,但是代码有些复杂,可以参考如下思路简化书写,示例:
单个五角星实现思路如下:
效果:
然后通过伪元素,再添加一个三角形:
效果:
然后通过旋转、偏移值等方式让它们重叠在一起:
效果:
添加伪元素,再添加一个三角形:
效果:
旋转并调整偏移值:
这样一个五角星就布局完成了:
可以结合如下示例代码测试理解
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> /* 设置红色背景盒子样式 */ .box1 { width: 300px; height: 200px; background-color: red; } .star { width: 0; height: 0; border-top: 40px solid yellow; border-left: 65px solid transparent; border-right: 65px solid transparent; margin-top: 100px; position: absolute; } /* 统一设置伪元素相同的样式 */ .star::before, .star::after { content: ""; display: block; width: 0; height: 0; border-top: 40px solid yellow; border-left: 65px solid transparent; border-right: 65px solid transparent; position: absolute; top: -40px; left: -65px; } /* 单独设置伪元素的旋转角度 */ .star::before { transform: rotate(-75deg); } .star::after { transform: rotate(-146deg); } /* 单独设置每颗五角星的缩放,位移,以及旋转角度 */ .star1 { transform: scale(0.5) translate(-40px, -130px); } .star2 { transform: scale(0.2) translate(120px, -520px) rotate(30deg); } .star3 { transform: scale(0.2) translate(190px, -380px) rotate(30deg); } .star4 { transform: scale(0.2) translate(200px, -240px) rotate(30deg); } .star5 { transform: scale(0.2) translate(120px, -120px) rotate(30deg); } </style> </head> <body> <!-- 此处写代码 --> <div class="box1"> <div class="star star1"></div> <div class="star star2"></div> <div class="star star3"></div> <div class="star star4"></div> <div class="star star5"></div> </div> </body> </html>
具体的旋转角度和移动等距离,同学不用太纠结,可以通过控制台慢慢调整,实现效果美观即可。
祝学习愉快~
同学你好,对于你的问题解答如下:
1、因为small元素设置了缩放,导致small元素设置x轴偏移400px,而实际并没有偏移这个值。可以去掉缩放查看下效果,设置x轴偏移400px,实际偏移的值就是400px,示例:
2、transform-origin主要是改变一个元素变形的原点,不会影响元素的偏移量translate的。
3、“假设我希望小方块的中心距离大方块中心100px,改变rotate的值能看到小方块围绕大方块地月环绕运动”这个效果具体参考如下步骤:
(1)由于将小方块整体缩放了0.4, 那么小方块显示的宽高为20px。
(2)大小方块的中心距离为100px, 那么考虑到缩放的影响,所以需要将偏移量设置为250px = 100px / 0.4,示例:
(3)由于设置缩放,元素属于变形了,所以(1)(2)步骤的基础上,设置transfor-origin属性值后,会改变元素变形了原点,导致元素缩放位置发生变化,所以无法准确的来计算具体的transform-origin的属性值,推荐同学在控制台,通过慢慢调试这几个属性值来实现效果。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星