gpt4 book ai didi

javascript - 是否存在允许旋转变换以尊重 div 边界的方法或插件?

转载 作者:搜寻专家 更新时间:2023-10-31 08:47:45 25 4
gpt4 key购买 nike

默认情况下,css rotate 属性似乎出现在标签间距之后。 For instance, if you have two divs in a column and you rotate one, they overlap.我可能完全错过了处理此问题的 css 或 html 的某些方面,对吗?

显而易见的解决方案似乎是编写一些 javascript 来管理旋转后元素的放置。是否存在有助于处理此间距的插件?我唯一能找到的是 jquery-rotate plug , 但它似乎没有提供任何关于间距的功能。

展示间距问题的相关 html/css。

HTML

<div class="red-box rotate-right"></div>
<div class="blue-box"></div>​

CSS

.rotate-right {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}

.red-box{
height: 50px;
width: 100px;
background: red;
}

.blue-box{
height: 50px;
width: 100px;
background: blue;
}

最佳答案

好吧,当心这很难看。

首先,我使用了 code from CSS-Tricks得到旋转的 Angular 。然后,我使用一些代数计算(从旋转元素的中心)到包含该元素的框的边的距离。然后我将边距添加到旋转元素的边缘以在需要时创建(或删除)额外空间。这也考虑了原始边距(如果有)。

用法:

旋转一个元素后,调用$(rotatedElement).space([grow],[shrink])。有关参数说明,请参阅代码注释。

jQuery.fn.space = function(grow,shrink){
// grow = Grow area around element to fit? (true/false)
// shrink = Shrink area around element to fit? (true/false)
var el = this.get(0);
if(typeof(grow)=='undefined'){
grow = true; // Default to grow extra space when needed
}
if(typeof(shrink)=='undefined'){
shrink = false; // Default to not shrink at all
}

//Get angle of rotated element
var st = window.getComputedStyle(el, null);
var tr = st.getPropertyValue("-webkit-transform") ||
st.getPropertyValue("-moz-transform") ||
st.getPropertyValue("-ms-transform") ||
st.getPropertyValue("-o-transform") ||
st.getPropertyValue("transform");
var v = tr.split('(')[1].split(')')[0].split(',');
var scale = Math.sqrt(v[0]*v[0] + v[1]*v[1]);
var angle = Math.round(Math.atan2(v[1], v[0]) * (180/Math.PI));

//Save or recall original margins
var m = new Array();
if(el.getAttribute('margins')==null){
m[0] = st.getPropertyValue("margin-left").match(/\d+/);
m[1] = st.getPropertyValue("margin-right").match(/\d+/);
m[2] = st.getPropertyValue("margin-top").match(/\d+/);
m[3] = st.getPropertyValue("margin-bottom").match(/\d+/);
el.setAttribute('margins',m[0]+","+m[1]+","+m[2]+","+m[3]);
} else {
m = el.getAttribute('margins').split(',');
console.log(m);
}
//Get center coords
var cx = st.getPropertyValue("width").match(/\d+/)/2;
var cy = st.getPropertyValue("height").match(/\d+/)/2;

//Convert radian values to degrees
function toDeg(angle){
return angle*Math.PI/180;
}

// Coords of the corners
// (starting from top-left and proceeding clockwise)
// relative to the center of the element
// c[cornerID][x|y]
var c = [ [Math.round(cx*Math.cos(toDeg(angle-180))
+ cy*Math.cos(toDeg(angle-90))),
Math.round(cx*Math.sin(toDeg(angle-180))
+ cy*Math.sin(toDeg(angle-90)))],

[Math.round(cx*Math.cos(toDeg(angle))
+ cy*Math.cos(toDeg(angle-90))),
Math.round(cx*Math.sin(toDeg(angle))
+ cy*Math.sin(toDeg(angle-90)))],

[Math.round(cx*Math.cos(toDeg(angle))
+ cy*Math.cos(toDeg(angle+90))),
Math.round(cx*Math.sin(toDeg(angle))
+ cy*Math.sin(toDeg(angle+90)))],

[Math.round(cx*Math.cos(toDeg(angle-180))
+ cy*Math.cos(toDeg(angle+90))),
Math.round(cx*Math.sin(toDeg(angle-180))
+ cy*Math.sin(toDeg(angle+90)))]
];

var elx = ([c[0][0], c[1][0], c[2][0], c[3][0]]).sort(function(a,b){
return(a*1)-(b*1);});
var ely = ([c[0][1], c[1][1], c[2][1], c[3][1]]).sort(function(a,b){
return(a*1)-(b*1);});

var b = [-elx[0], elx[3], -ely[0], ely[3]]; // [Left, Right, Top, Bottom]

if(grow){
if(b[0]-cx>0) el.style.marginLeft = (m[0] + b[0]-cx) + "px";
if(b[1]-cx>0) el.style.marginRight = (m[1] + b[1]-cx) + "px";
/*}
if(growY){ */
if(b[2]-cy>0) el.style.marginTop = (m[2] + b[2]-cy) + "px";
if(b[3]-cy>0) el.style.marginBottom = (m[3] + b[3]-cy) + "px";
}
if(shrink){
if(b[0]-cx<0) el.style.marginLeft = (m[0] + b[0]-cx) + "px";
if(b[1]-cx<0) el.style.marginRight = (m[1] + b[1]-cx) + "px";
/*}
if(shrinkY){ */
if(b[2]-cy<0) el.style.marginTop = (m[2] + b[2]-cy) + "px";
if(b[3]-cy<0) el.style.marginBottom = (m[3] + b[3]-cy) + "px";
}

}

您可能希望将 (growshr​​ink) 拆分为 (growX, growY shrinkX, shr​​inkY) 取决于您的实际网站中发生的事情,因此您不会破坏您的布局。为此,只需调整/添加顶部的参数和默认值,以及底部的 if(grow)/if(shrink) 语句。

关于javascript - 是否存在允许旋转变换以尊重 div 边界的方法或插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181850/

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