gpt4 book ai didi

jquery - 修改宽度或高度时动态更新 CSS3 旋转元素的变换原点

转载 作者:技术小花猫 更新时间:2023-10-29 10:29:26 25 4
gpt4 key购买 nike

Changing width/height to a CSS rotated div triggers top/left reposition 开始我需要一些帮助来解决 CSS 旋转和动态宽度/高度问题。

我明白了 transform-origin 并认为我需要在更新元素的宽度或高度的同时动态更新它。我只对技术解决方案感兴趣,而不是任何跨浏览器的技巧,因此 the demo只使用 -webkit前缀。

HTML

<div id="wrap">
<div id="rotated">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>
Width: <input id="width" type="range" min="20" max="400" step="1" value="200">
Height: <input id="height" type="range" min="20" max="400" step="1" value="100">
Angle: <input id="angle" type="range" min="0" max="360" step="1" value="0">
</div>

CSS

#rotated {
background:lightblue;
border:1px dotted #000;
height:100px;
width:200px;
position:absolute;
top:300px;
left:100px;
overflow:hidden;
}

#width, #height, #angle {
display:block;
margin-bottom:10px;
width:200px;
}

JavaScript

$('#width').change(function() {
$('#rotated').css({width:this.value + 'px'});
});

$('#height').change(function() {
$('#rotated').css({height:this.value + 'px'});
});

$('#angle').change(function() {
$('#rotated').css({'-webkit-transform': 'rotate(' + this.value + 'deg)'});
});

second demo , 添加 CSS

#rotated {
-webkit-transform-origin: 100px 50px;
-webkit-transform: rotate(60deg);
}

并更新 value Angular slider 到60

Angle: <input id="angle" type="range" min="0" max="360" step="1" value="60">

在通过 slider 修改宽度/高度时产生正确的结果,因为元素在 x, y 中增长和收缩没有移动位置的尺寸。但是,现在不再围绕所需的(中心点)原点旋转元素。

我已经尝试了一些变体(mousedown、mousemove、change),我认为这会在修改宽度/高度之前设置原点,但是 <div>仍在移动位置。

$('#width, #height, #angle').change(function() {
$('#rotated').css({'-webkit-transform-origin': $('#width').val()/2 + 'px' + $('#height').val()/2 + 'px'});
});

我假设 jQuery 同时应用 CSS 更改,而我认为原点需要在宽度/高度更改之前更新。

基本上我希望形状始终围绕中心点旋转,如果形状已经旋转,则在修改宽度/高度时不要移动。

最佳答案

FIDDLE DEMO!!!

我首先要告诉您为什么会这样。如您所见,当您的 div 未旋转时,没有问题。那么为什么会出现这种奇怪的行为呢?

答案:因为您要求它... 当您更改高度或宽度时,div 的 50% 或中间点会发生变化。因此,浏览器会将您的 div 放置在新的 50% 未旋转 DIV 所在的位置,然后旋转它。

解决方案是将旋转后的 div 包裹在另一个具有固定宽度和高度和 overflow:visible 的 div(比如说“#wrapper”)中。

然后将#rotated 放在#wrapper 内并根据宽度或高度变化计算变化并以始终位于#wrapper 中心的方式转换#rotated div(例如,对于宽度,翻译是 -(wrapWidth-newWidth)/2 )。

然后旋转 wrapper ,瞧。

这是基于您的设置的代码:

HTML:

<div id="wrap">
Width: <input id="width" type="range" min="20" max="400" step="1" value="200">
Height: <input id="height" type="range" min="20" max="400" step="1" value="100">
Angle: <input id="angle" type="range" min="0" max="360" step="1" value="60">
</div>
<div id="rotateWrap">
<div id="rotated">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>
</div>

CSS:

#width, #height, #angle {
position:relative;
display:block;
margin-bottom:10px;
width:200px;
}

#rotateWrap{
position:absolute;
overflow:visible;
height:100px;
width:200px;
top:200px;
left:100px;
outline:2px solid red;
-webkit-transform-origin: 50% 50%;

}

#rotated {
background:lightblue;
position:relative;
overflow:hidden;
height:100px;
}

#wrap{
position:absolute;
}

JavaScript

wPrev=$("#rotateWrap").width();
hPrev=$("#rotateWrap").height();

$('#width').mousedown(function(){
}).change(function() {
$("#rotated").width(newW=$(this).val())
.css({left: -(newW-wPrev)/2 + "px"});
});

$('#height').mousedown(function(){
}).change(function() {
$("#rotated").height(newH=$(this).val())
.css({top: -(newH-hPrev)/2 + "px"});
});


$('#angle').change(function() {
$("#rotateWrap").css({"-webkit-transform":"rotate("+$(this).val()+"deg)"});
});

关于jquery - 修改宽度或高度时动态更新 CSS3 旋转元素的变换原点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7107964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com