4

默认情况下,css rotate 属性似乎出现在标签间距之后。例如,如果您在一列中有两个 div 并且您旋转一个,它们会重叠。我可能完全错过了处理这个问题的 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;
}
4

1 回答 1

2

好吧,当心这看起来很难看。

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

用法:

旋转元素后,调用$(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";
    }

}

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

于 2012-11-02T21:03:06.180 回答