2010-05-21 5 views
7

Я начинаю думать, что это невозможно, но подумал, что я спрошу вас, ребята.Невозможная компоновка?

В основном это расположение 2 колонки, но «бизнес» хочет следующее:

-Всегда занимают все окно браузера

-Accommodate изменение размеров окна браузера

-Выберите столбец быть фиксированной шириной, но эта ширина должна быть гибкой от страницы к странице.

-Лефтовая колонка имеет область вверху с фиксированной высотой.

-Лефтовая колонка имеет нижнюю область. Он должен занимать оставшееся вертикальное пространство окна браузера. Если контент очень велик, он будет иметь полосу прокрутки только для этого региона.

-Большой столбец должен занимать оставшееся горизонтальное пространство окна браузера.

-Большая колонка имеет область вверху с фиксированной высотой.

-Большая колонка имеет нижнюю область. Он должен занимать оставшееся вертикальное пространство окна браузера. Если контент очень велик, он будет иметь полосу прокрутки только для этого региона.

Я пробовал все ... дивы, плавали, абсолютно позиционирован, столы, дивы в таблицах ...

даже возможно ли это?

Вот образ того, что он должен выглядеть следующим образом: http://imgur.com/zk1jP.png

+0

должен быть довольно прямым, если левое и правое может быть отношением ширины экрана. Могу ли я увидеть одну из ваших попыток? – edl

+1

Какие браузеры вы поддерживаете? – drusnov

+0

Должно быть довольно легко, если вы готовы внести какую-то работу. – User

ответ

11

Это совсем не возможно, и вам не нужен javascript. Для вашего браузера вам понадобятся некоторые хаки IE6.

Ключом к макету является то, что вы можете установить один или более краевые позиции на абсолютно позиционированном элементе. Вот хорошая статья о технике: http://www.alistapart.com/articles/conflictingabsolutepositions/

Вот демо: http://www.spookandpuff.com/examples/2col2section.html

и источник:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

    <title>2 col, 2 section layout.</title> 

    <style type="text/css" media="screen"> 
    #leftColumn { 
     position:absolute; 
     top:10px; 
     bottom:10px; 
     left:10px; 
     width:400px; 
    } 

    #rightColumn { 
     position:absolute; 
     top:10px; 
     bottom:10px; 
     right:10px; 
     left:410px;/* This must equal the total width of the #leftColumn, incl padding, border, margin, etc. */ 
    } 

    .topSection{ 
    position:absolute; 
    top:10px; 
    height:120px; 
    left:10px; 
    right:10px; 
    padding:10px; 
    } 

    .bottomSection{ 
    position:absolute; 
    bottom:10px; 
    top:160px; /* This must equal the total height of the .topSection, incl padding, border, margin, etc. */ 
    left:10px; 
    right:10px; 
    padding:10px; 
    overflow-y:auto; 
    } 

    /* Debug styles */ 
    body {background-color:#CCC;} 
    div {border:1px solid #FFF;} 

    #leftColumn {background-color:#7EF4B0;} 
    #rightColumn {background-color:#EEF4A7;} 
    #leftColumn .topSection{background-color:#56A97A;} 
    #rightColumn .topSection{background-color:#D6D06D;} 

    </style> 

</head> 

<body> 
    <div id="leftColumn"> 
     <div class="topSection"> 
     <p>Left column, top section.</p> 
     </div> 

     <div class="bottomSection"> 
     <p>Left column, bottom section.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     </div> 
    </div> 

    <div id="rightColumn"> 
     <div class="topSection"> 
     <p>Right column, top section.</p> 

     </div> 

     <div class="bottomSection"> 
     <p>Right column, bottom section.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     </div> 
    </div> 
</body> 
</html> 

Есть несколько приемов: Во-первых, я только проверил это в Firefox, чтобы дать вам общая идея - есть некоторые необходимые исправления для IE, которые я еще не добавил: проверьте список в отдельной статье вверху для деталей.

Я разрешил 10px дополнительное пространство вокруг всех ящиков, чтобы проиллюстрировать идею - вы, вероятно, установили бы их в 0 в реальном макете.

Вы можете установить высоту .topSection по-разному между колоннами с некоторыми правилами, такими как:

#leftColumn .topSection {height:xxx} 
#leftColumn .bottomSection {top:xxx} 

#rightColumn .topSection {height:yyy} 
#rightColumn .bottomSection {top:yyy} 

Я хотел бы использовать контейнер с классом (или класс на тело тега), чтобы определить ширину левый столбец, что-то вроде:

#container.narrow #leftColumn {width:100px} 
#container.medium #leftColumn {width:200px} 
#container.wide #leftColumn {width:400px} 

Это позволяет определить набор ширины «шаблонов» вы можете переключаться между ними.

+0

+1: очень хорошо! – ANeves

+0

Это потрясающе. Благодаря! –

+0

Ничего себе, даже не подумал попробовать. прикрутите мое предложение по javascript -Это потрясающе !!! +1 – Addsy

1

Это может быть стоит рассмотреть, используя некоторые JavaScript, чтобы помочь с вашими проблемами макета. Хотя я знаю, что это не идеально, это решение, которое я успешно использовал, прежде чем пытаться разобраться с макетами полной высоты.

Это должно быть в порядке, чтобы получить макет, вы можете описать без полной высоты прокрутки столбцов, то просто использовать немного JavaScript, чтобы держать их заполнения высоты браузера

+0

Есть ли у вас примеры? –

1

Я считаю, что это довольно легко сделать, если у вас есть роскошь использования рамки ext.js. Будет обновляться с кодом, если никто другой не предложит лучший ответ, и если вам интересно.

Обновление: здесь. Протестировано и отлично работает с IE6. Недостатком по сравнению с решением css является (i) требование JavaScript (скорее всего, приложение уже использует JS); (ii) Требование Ext.js (которое может быть или не может быть осуществимо):

Обратите внимание на использование style = "height: 100px;" int html и autoScroll: true в коде JavaScript. Это позволяет фиксировать высоту верхних 2 панелей и переполнять полосами прокрутки в нижней части.

Ext.onReady(function(){ 

    Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); 

    var viewport = new Ext.Viewport({ 
     layout: 'border', 
     resizable: false, 
     items: [ 
      { 
       region: 'west', 
       id: 'west-panel',      
       split: false, 
       width: 300,           
       margins: '0 0 0 0', 
       layout: 'border',      
       items: [{ 
        region: 'north', 
        contentEl: 'west1',            
        border: false 
       },{ 
        region: 'center', 
        contentEl: 'west2',       
        border:false, 
        autoScroll: true 
       }] 
      }, 
      { 
       region:'center', 
       id:'center-panel',      
       split:false,      
       margins:'0 0 0 0', 
       layout:'border',      
       items: [{ 
        region: 'north', 
        contentEl: 'center1',       
        border:false 
       },{ 
        region: 'center', 
        contentEl: 'center2',       
        border:false, 
        autoScroll: true 
       }] 
      }         
     ] 
    });   
}); 

и HTML:

<div id="west1" style="height: 70px;background-color: #AAA;"> 
    <p>Hi. I'm fixed.</p> 
</div> 
<div id="west2"> 
    <p> long content goes here</p> 
</div> 
<div id="center1" style="height: 100px;background-color: #333;color: #FFF;"> 
    <p>Hi. I'm fixed too.</p>    
</div> 
<div id="center2">   
<p> long content goes here</p> 
</div> 

Demo будет доступен позже, опять же, если вы или кто-либо заинтересован. Просьба указать, если бы вы могли.

+0

Проблема с использованием ExtJS заключается в том, что вы перемещаете слишком много вашего макета в Javascript, когда он должен быть определен как можно больше в таблице стилей. На самом деле нет необходимости использовать javascript на макете, за исключением, может быть, немного дополнительной пользы. – Beejamin

+0

@Beejamin: Согласитесь с тем, что вы сказали, и не будете отрицать, что ваше решение только для css - это умное решение. Я тоже предпочитаю макет CSS, просто не придумал умного решения, подобного вашему. Extjs имеет свое место и, возможно, не в этом случае. В тот момент, когда ваши клиенты или вы хотите вертикальный сплиттер (между левой и правой панелью), Extjs уже имеет его, а с помощью только CSS-решения, нужно было бы начать поиск плагина с разделительной панелью jQuery или что-то в этом роде. Затем вкладки, затем панель инструментов и т. Д. Список продолжается. ExtJS упростит работу. Не будем отрицать, что сегодня я выучил крутой трюк CSS –

0

Вы получите там с faux columns.

Вы можете использовать эту технику, чтобы сделать два вертикальных разделения.
Если вам нужны отдельные полосы прокрутки (пожалуйста, не делайте, вы будете использовать котенок для коучинга), вы можете сделать каждое вертикальное разделение max-height: 100%; overflow: auto;, чтобы заставить их получить прокрутку, если они достигают 100% высоты.

Для синих полос с плавающей точкой вы можете дать родительское разделение position: relative; padding-top: 150px;, а затем дать синюю полосу position: absolute; top: 0px; left: 0px; width: 100%; height: 150px; overflow: hidden;. (Я не уверен в ширине 100%.)
Тогда зеленый и желтый контент не будет перекрывать его.

Смежные вопросы