css - 如何重新调整连续旋转的元素以完全适合其(固定大小)容器?
问题描述
我让(矩形)图像无限旋转。旋转时,我想调整它的大小(这样图像就不会被截断)。
换句话说:我尝试始终尽可能大地显示整个图像。
因此,“0 度”示例是正确的,但“80 度”示例更倾向于如下所示:
您可能已经注意到,这是作为 StreamElements-widget 执行的。这可能是不起作用的原因overflow:visible
。
HTML:
<div class="main-container">
<img src="some_url">
</div>
CSS:
.main-container {
width:100%;
height:100%;
overflow:visible;
display: grid;
place-items: center;
}
img {
max-width: 100%;
object-fit: contain;
animation: spin 5s infinite linear;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
我认为这transform: ... scale(x)
可能有效,但如果不使用固定的关键帧值(这似乎是一个不可靠的解决方案),我就无法做到这一点。
解决方案
我认为如果没有 Javascript,您将无法完成此操作,并且还可以用 Javascript 而不是 CSS 转换元素。这是我的做法,我没有复制您的确切示例,我使用了 2 个简单的 div:一个容器,另一个在第一个容器中(而不是图像);
const cont= document.querySelector('.main-container');
const rot= document.querySelector('.rotater');
const H= rot.offsetHeight, h= cont.offsetHeight;
const W= rot.offsetWidth;
var t=0;
var anim= setInterval(rotate, 20);
function rotate(){
rot.style.transform= "rotate(-" + t + "deg)";
update(t);
t++;
}
function update(T){
let alpha= Math.atan(H/W);
let diagLength= Math.sqrt(
Math.pow(H, 2) + Math.pow(W, 2));
let theta= degToRad(T);
theta= radTrunc(theta);
theta= (theta> Math.PI/2 && theta< Math.PI) || (theta> 3*Math.PI/2 && theta< 2*Math.PI) ? Math.PI - theta : theta;
let beta= (Math.PI/2) - (alpha + theta);
let nonScaledHeight= Math.cos(beta) * diagLength;
let ratio= Math.abs(h/nonScaledHeight);
ratio= ratio> 1 ? 1 : ratio;
rot.style.transform += " scale(" + ratio + ")";
}
function degToRad(angle){
return angle * Math.PI / 180;
}
function radTrunc(angle){
while(angle> (Math.PI * 2)){
angle -= Math.PI*2;
}
return angle;
}
.main-container{
width: 600px;
height: 200px;
background: blue;
}
.rotater{
width: 250px;
height: 200px;
background: green;
margin: auto;
}
<div class="main-container">
<div class="rotater"></div>
</div>
您在函数中看到的所有计算update
都是基本的三角函数,我们计算内部 div 旋转时nonScaledHeight
的高度:该值与外部 div 高度的比率将是内部 div 的缩放比例。
degToRad
将角度t
从度数转换为弧度并radTrunc
确保角度保持在范围内[0, 2*PI[
。
推荐阅读
- python - 将 XGBClassifier 模型转储到文本中
- reactjs - React Module build failed: SyntaxError: "..." is read-only
- powershell - 在 PowerShell 中发送带有 HTML 表格的电子邮件
- git - 新分支修复主分支中的问题后 Git Rebase 或 Merge
- gcc - 与开始/结束组链接:为什么我的链接会失败,除非某些库被留在组之外
- windows - 使用带有文件参数的 GetObject 会产生错误 432:自动化期间找不到文件名或类名
- rest - 如何在通过 REST API 更新文档时确保一致性
- excel - 如何使用 VBA 将 X 轴添加到已创建的折线图中?
- c# - 如何验证已使用 jquery 填充数据的下拉列表
- javascript - Angular4应用程序中的HTML转义拦截器