2014-02-20 315 views
0

我的问题如下。我有两列的布局。但是我想要做的事情有点复杂,我在这里没有找到一个很好的教程/问题,它能够准确处理我的问题。移动视图与2列布局的普通视图的CSS动态布局

我有以下图像,它代表我的布局,因为它目前是。

当前页面布局

The current desktop layout

在移动认为这是期望的结果:

期望的结果

The desired result

如何确保第一块绿色块位于红色和紫色块之间,但第二块和第三块位于紫色块下方。

这是一个问题,因为该第二块是红数据块的旁边的正常定位并在本地,如果我申请Two column layout, fixed right column

我已具备的jsfiddle http://jsfiddle.net/mdibbets/LgKP5/,其复制所述的溶液中的红数据块的下方结束情况。

的HTML

<div id="red"> 
    <div id="yellow1"> 
     <span>1</span> 
    </div> 
    <div id="yellow2"> 
     <span>2</span> 
    </div> 
</div> 
<div id="black"> 
    <div id="green1"> 
     <span>1</span> 
    </div> 
    <div id="green2"> 
     <span>2</span> 
    </div> 
    <div id="green3"> 
     <span>3</span> 
    </div> 
</div> 
<div id="blue"> 
    <div id="purple1"> 
     <span>1</span> 
    </div> 
    <div id="purple2"> 
     <span>2</span> 
    </div> 
    <div id="purple3"> 
     <span>3</span> 
    </div> 
</div> 

的CSS

span 
    { 
     display:inline-block; 
     margin: 50px 50px; 
     font-size:4em; 
     font-weight:800; 
     text-shadow: 3px 3px 10px gray; 
     font-family:sans-serif; 
    } 

#red { 
    background-color:red; 
    border: 1px solid brown; 
    display:inline-block; 
} 
#yellow1, #yellow2 
    { 
    background-color:yellow; 
    border: 1px solid lightbrown; 
    } 
#black 
    { 
    display:inline-block; 
    border:1px solid black; 
    background-color:gray; 
    } 
#green1, #green2, #green3 
    { 
    display:inline-block; 
    background-color:lime; 
    border:1px solid darkgreen; 
    } 
#blue 
    { 
    display:inline-block; 
    border:1px solid darkblue; 
    background-color:lightblue; 
    } 
#purple1, #purple2, #purple3 
    { 
    display:block; 
    border: 1px solid darkpurple; 
    background-color:purple; 
    } 
/* desktops and big resolution screens that can handle the normal layout */ 
@media only screen and (min-width: 875px) { 
#red { 
    width:600px; 
} 

#yellow1, #yellow2 
    { 
    width:250px; 
    height:300px; 
    margin:20px; 
    float:left; 
    } 
#black 
    { 
    float:right; 
    } 
#green1, #green2, #green3 
    { 
    clear:both; 
    float:right; 
    width:200px; 
    height:150px; 
    margin:20px; 
    } 
#blue 
    { 
    width:600px; 
    } 
#purple1, #purple2, #purple3 
    { 
    width:150px; 
    margin:25px; 
    float:left; 
    height:200px; 
    } 
} 
/* small screens */ 
@media only screen and (max-width: 875px) { 
#red { 
    width:100%; 
} 
#yellow1, #yellow2 
    { 
    width:90%; 
    margin:5%; 
    float:left; 
    } 
#black 
    { 
    width:100%; 
    } 
#green1, #green2, #green3 
    { 
    width:90%; 
    margin:5%; 
    } 
#blue 
    { 
    width:100%; 
    } 
#purple1, #purple2, #purple3 
    { 
    width:90%; 
    margin:5%; 
    } 
} 

这让 “绿色街区” 作为一个整体到动态模式没有问题。 但是“分裂”他们是一个完全不同的问题。

是否有可能根据IE条件注释的风格激活基于屏幕分辨率的HTML代码?那我可以提出一个整体的其他组HTML的,如果屏幕分辨率...

+0

您的jsFiddle与您的第二张图片不匹配 – Ismatjon

+1

是的,这就是我发布这个问题的原因......这是我期望的结果。 – Tschallacka

+1

哦,我找到了你。 – Ismatjon

回答

0

我想出了我自己的答案用我自己写的库:

的功能例子显示上的jsfiddle:http://jsfiddle.net/mdibbets/U3m4m/

如果你需要更多的解释http://all-purpose-programming.blogspot.nl/2014/02/chaning-order-of-appearance-of-elements.html

/* Copyright 2014 Michael Dibbets, all rights reserved. 
    This library is free to use for non commercial use, 
    if you leave a comment below the blog post at 
    http://all-purpose-programming.blogspot.nl/2014/02/chaning-order-of-appearance-of-elements.html 
    where you are implementing this libary. 
    For commercial use contact me to come to an licensing agreement. 
    mdibbets [at] outlook [dot] com 
    My prices are fair and reasonable. 
    ususage of this script without notification of the author 
    in the before mentioned ways is not permitted. 
*/ 
function JX_responsive_sort(precursor) 
    { 
    if(typeof precursor == 'undefined') 
     { 
     precursor = 'conditional'; 
     } 
    // our sorting array 
    var orderofthings = new Array(); 
    // window width 
    var windowwidth = $(window).innerWidth(); 
    // get all classes named conditional 
    jQuery('.'+precursor).each(function() 
     { 
     // get all classes of the conditional element 
     var classList = jQuery(this).attr('class').split(/\s+/); 
     // loop through all classes of the current element 
     // backwards compatible... of course 
     for(c=0;c<classList.length;c++) 
      { 
      item=classList[c]; 
      // no need for this one bub 
      if(item != precursor) 
       { 
       if(item.substring(0,11) == precursor) 
        { 
        // sanitise the item 
        item = item.substring(12,item.length); 
        // from which screenwidth is this rule active? 
        var startwidth = parseInt(item.substring(0,item.indexOf('_'))); 
        // to which screenwidth is this rule active? 
        var endwidth = parseInt(item.substring(item.indexOf('_')+1,item.indexOf('_',item.indexOf('_')+1))); 
        if(windowwidth >= startwidth && windowwidth <= endwidth) 
         { 
         // remove the widths so all that remains are commands 
         item = item.substring(item.indexOf('_',item.indexOf('_')+1)+1,item.length);  
         // split on hypens, since they are the commands separators 
         var commands = item.split(/-/); 
         for(i=0;i<commands.length;i++) 
          { 
          // get the instructions 
          var instructions = commands[i].split('_'); 
          // to know the command remove the first element 
          var command = instructions.shift(); 
          // command order - Instruction to display the elements in the desired order. 
          // This is a top level ordering of parent elements in the conditional_mainwrap 
          // In order to change the ordering of child elements you'll have to "pop" them 
          // a level higher. 
          // allowed variables: 
          // 0 : order number priority. Try not to cause conflicts 
          if(command == 'order') 
           { 
           // add the this element at the desired position into the order of things. 
           orderofthings.push({order: instructions[0] , theobj : this }); 
           } 
          // command pop - Instruction to remove the current element from its parent, 
          // and attach it to the parents parent. 
          if(command == 'pop') 
           { 
           // an item that switches positions needs an "returning" wrapper. 
           // that is the first parent. 
           // Then we have the normal container that needs to be escaped. 
           // Then we have parent where we wish to attach it to. 
           if(jQuery(this).parent().attr('id') == precursor + '_wrap_' + jQuery(this).attr('id')) 
            { 
            jQuery(this).appendTo($(this).parent().parent().parent()); 
            } 
           } 
          // command repop - Instruction to return the current element to it's designated position 
          // This is why a poppable element needs a wrapper, so we know where to return it. 
          if(command == 'repop') 
           { 
           jQuery(this).appendTo('#conditional_wrap_'+jQuery(this).attr('id')); 
           } 
          } 
         } 
        } 
       }    
      } 
     }); 
    // set a simple variable to get the jQuery object of the parent wrap 
    parentkeeper = jQuery('.'+precursor+'_mainwrap'); 
    // sort the arrays so the orderofthings get's it's sorting from the ORDER command. 
    orderofthings = orderofthings.sort(keysrt('order',false)); 
    for(c=0;c<orderofthings.length;c++) 
     { 
     if(typeof orderofthings[c] != 'undefined') 
      { 
      jQuery(orderofthings[c]['theobj']).appendTo(parentkeeper); 
      } 
     } 
    } 
jQuery(document).ready(function(){ 
JX_responsive_sort(); 
}); 
jQuery(window).resize(function() 
    { 
    JX_responsive_sort(); 
    }); 
function keysrt(key,desc) { 
    return function(a,b){ 
    return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]); 
    } 
} 
2

我想,你可以用

position: absolute;

做到这一点,并给予准确

height

top

您的元素的属性。您可以检查此一:jsFiddle

+0

是否适用于您? – Ismatjon

+0

这不是我正在寻找的东西,它有点失败了动态流布局的目的,特别是因为元素的高度无法预测。尽管努力的一点。 – Tschallacka