首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法或插件允许旋转变换以尊重div边界?

有没有一种方法或插件允许旋转变换以尊重div边界?
EN

Stack Overflow用户
提问于 2012-11-02 00:54:40
回答 1查看 115关注 0票数 4

默认情况下,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

代码语言:javascript
运行
复制
<div class="red-box rotate-right"></div>
<div class="blue-box"></div>​

CSS

代码语言:javascript
运行
复制
.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;
}
EN

回答 1

Stack Overflow用户

发布于 2012-11-03 05:03:06

好的,注意这看起来很难看。

首先,我使用code from CSS-Tricks来获取旋转角度。然后,我使用一些代数来计算(从旋转后的元素的中心)到包含该元素的框的边的距离。然后,我在旋转元素的边缘添加边距,以便在需要的地方创建(或删除)额外的空间。这还会考虑原始边距(如果有的话)。

用法:

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

代码语言:javascript
运行
复制
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";
    }

}

您可能希望将(growshrink)拆分为(growXgrowYshrinkXshrinkY),这取决于您的实时站点中发生的事情,这样您就不会破坏您的布局。为此,只需调整/添加顶部的参数和默认值,以及底部的if(grow)/if(shrink)语句。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13181850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档