Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Меню (position: fixed в position: fixed) (https://javascript.ru/forum/xhtml-html-css/29669-menyu-position-fixed-v-position-fixed.html)

bes 06.07.2012 16:38

Меню (position: fixed в position: fixed)
 
Как спозиционировать элементы, чтобы верстка не разваливалась при масштабировании страницы (сейчас проблема спозиционировать <div class="content">) и какие более простые варианты получения подобного эффекта?

Получаемый эффект: фиксированный блок, в нём фиксирована шапка, высота шапки определяется содержанием, сразу под шапкой блок (со ссылками) с автоматически появляющейся прокруткой.



<style>
  body {
    background: lightgrey;
  }

 .menu {
    position: fixed;
    left: 20%; 
    top: 20%; 
    width: 60%; 
    height: 60%;
    background-color: grey;
  }

  .head {
    position: fixed; 
    left: 20%; 
    top: 20%; 
    width: 60%; 
    background: maroon; 
    color: whitesmoke;
  }

  .content {
    position: fixed;
    left: 20%; 
    top: 25%; 
    height: 50%;
    width: 60%; 
    overflow: auto;
  }

  .x {
    position: absolute;
    right: 2%; 
    cursor: pointer;
  }
</style>
 

<div class="menu" id="menu">
  <div class="head">
    <span>Меню</span>
    <span class="x" onclick="this.parentNode.parentNode.style.display = 'none'">x</span>
  </div>
  <div class="content">
    <a href="#">link1</a><br>
    <a href="#">link2</a><br>
    <a href="#">link3</a><br>
    <a href="#">link4</a><br>
    <a href="#">link5</a><br>
    <a href="#">link6</a><br>
    <a href="#">link7</a><br>
    <a href="#">link8</a><br>
    <a href="#">link9</a><br>
    <a href="#">link10</a><br>
    <a href="#">link11</a><br>
    <a href="#">link12</a><br>
    <a href="#">link13</a><br>
    <a href="#">link14</a><br>
    <a href="#">link15</a><br>
    <a href="#">link16</a><br>
  </div>
</div>

Deff 06.07.2012 16:48

Цитата:

Сообщение от bes
Как спозиционировать элементы, чтобы верстка не разваливалась при масштабировании страницы (сейчас проблема

сделай таблицей внутрь меню с width:100% height:100%;

внутрь нижнего td засунь

.content {
28 height: 100%;
29 width: 100%;
30 overflow: auto;
31 }

vadim5june 06.07.2012 17:14

а зачем все делать fixed-достаточно только menu-а остальные либо static или absolute

bes 06.07.2012 17:24

Deff, спасибо за способ, сейчас попробую

Цитата:

Сообщение от vadim5june
а зачем все делать fixed-достаточно только menu-а остальные либо static или absolute

Первый блок с fixed, чтобы меню не смещалось при прокрутке страницы, аналогично для шапки - чтобы не смещалась при прокрутке самого меню.

vadim5june 06.07.2012 17:34

не вижу проблем если так сделать
<style>
  body {
    background: 

lightgrey;
height:1200px;  }

 .menu {
    

position: fixed;
    left: 20%; 
    

top: 20%; 
    width: 60%; 
    height: 

60%;
    background-color: grey;
  }

  

.head {
     
    left: 20%; 
    top: 

20%; 
    width: 100%; 
    background: 

maroon; 
    color: whitesmoke;
  }

  

.content {
    
    left: 20%; 
    top: 

25%; 
    height: 80%;
    width: 100%; 
 

   overflow: auto;
  }

  .x {
    

position: absolute;
    right: 2%; 
    

cursor: pointer;
  }
</style>
 

<div 

class="menu" id="menu">
  <div 

class="head">
    <span>Меню</span>
    

<span class="x" 

onclick="this.parentNode.parentNode.st

yle.display = 'none'">x</span>
  </div>
 

 <div class="content">
    <a 

href="#">link1</a><br>
    <a 

href="#">link2</a><br>
    <a 

href="#">link3</a><br>
    <a 

href="#">link4</a><br>
    <a 

href="#">link5</a><br>
    <a 

href="#">link6</a><br>
    <a 

href="#">link7</a><br>
    <a 

href="#">link8</a><br>
    <a 

href="#">link9</a><br>
    <a 

href="#">link10</a><br>
    <a 

href="#">link11</a><br>
    <a 

href="#">link12</a><br>
    <a 

href="#">link13</a><br>
    <a 

href="#">link14</a><br>
    <a 

href="#">link15</a><br>
    <a 

href="#">link16</a><br>
  </div>
</div>

Deff 06.07.2012 17:38

vadim5june,
<span>Меню</span> (высота) зависит от разрешения и масштаба -весь сыр бор в этом

bes 06.07.2012 17:48

Как-то так, Deff + (уже второй поставить не могу)
<style>
  body {
    background: lightgrey;
  }

 .menu {
    position: fixed;
    left: 20%; 
    top: 20%; 
    width: 60%; 
    height: 60%;
    background-color: grey;
    z-index: 100
  }

  .head {
    background: maroon; 
    color: whitesmoke;
    height: 10%;
  }

  .content {
    height: 100%;
    width: 100%;
    overflow: auto;
  }

  .x {
    position: absolute;
    right: 3%; 
    cursor: pointer;
    color: whitesmoke;
  }
</style>
 
<table class="menu">
  <tr>
    <td class="head">Меню
    <span class="x">x</span>
 </tr>
 <tr>
   <td><div class="content">
    <a href="#">link1</a><br>
    <a href="#">link2</a><br>
    <a href="#">link3</a><br>
    <a href="#">link4</a><br>
    <a href="#">link5</a><br>
    <a href="#">link6</a><br>
    <a href="#">link7</a><br>
    <a href="#">link8</a><br>
    <a href="#">link9</a><br>
    <a href="#">link10</a><br>
    <a href="#">link11</a><br>
    <a href="#">link12</a><br>
    <a href="#">link13</a><br>
    <a href="#">link14</a><br>
    <a href="#">link15</a><br>
    <a href="#">link16</a><br>
</div>
  </tr>
</table>



vadim5june, сейчас поразбираю ваш вариант.

vadim5june 06.07.2012 17:51

Цитата:

Сообщение от Deff (Сообщение 186814)
vadim5june,
<span>Меню</span> (высота) зависит от разрешения и масштаба -весь сыр бор в этом

а fixed что дает?точно так же высота будет меняться
зато из-за задания top в процентах для head-20% а для content-25% при масштабировании одна на другую наезжает

vadim5june 06.07.2012 17:57

Цитата:

Сообщение от bes (Сообщение 186819)
vadim5june, сейчас поразбираю ваш вариант.

по моему тоже самое что Ваш последний если не считать мелочи

Deff 06.07.2012 18:00

vadim5june,
fixed для внутренних элементов не нужен -это Вы все верно казали -
Но таблица из двух строк засунутая в меню со 100% шириной -высотой решает проблемы и span и скролл блока

vadim5june 06.07.2012 18:10

Цитата:

Сообщение от Deff (Сообщение 186826)
vadim5june,
fixed для внутренних элементов не нужен -это Вы все верно казали -
Но таблица из двух строк засунутая в меню со 100% шириной -высотой решает проблемы и span и скролл блока

меня смущала только fixed внутри fixed что я считаю неверно

bes 06.07.2012 18:11

Цитата:

Сообщение от Deff
Но таблица из двух строк засунутая в меню со 100% шириной -высотой решает проблемы и span и скролл блока

Deff, я кстати там внешний блок убрал, спозиционировал саму таблицу, итак всё нормально.

Цитата:

Сообщение от vadim5june
а fixed что дает?точно так же высота будет меняться
зато из-за задания top в процентах для head-20% а для content-25% при масштабировании одна на другую наезжает

Ваш вариант рабочий, за исключением того, что при слишком большом увеличении небольшая часть начинает вылезать за пределы блока, а также того, что полоса прокрутки "гуляет" по отношению к низу основного блока, что портит визуальный эффект.
И я не понял эту фишку насчёт top, разве top учитывается для статично позиционированных элементов?

Убрал, что показалось лишним.
<style>
  body {
    background: lightgrey;
  }

 .menu {
    position: fixed;
    left: 20%; 
    top: 20%; 
    width: 60%; 
    height: 60%;
    background-color: grey;
  }

  .head {
    background: maroon; 
    color: whitesmoke;
  }

  .content {
    height: 80%;
    overflow: auto;
  }

  .x {
    position: absolute;
    right: 2%; 
    cursor: pointer;
  }
</style>
 

<div class="menu" id="menu">
  <div class="head">
    <span>Меню</span>
    <span class="x" onclick="this.parentNode.parentNode.style.display = 'none'">x</span>
  </div>
  <div class="content">
    <a href="#">link1</a><br>
    <a href="#">link2</a><br>
    <a href="#">link3</a><br>
    <a href="#">link4</a><br>
    <a href="#">link5</a><br>
    <a href="#">link6</a><br>
    <a href="#">link7</a><br>
    <a href="#">link8</a><br>
    <a href="#">link9</a><br>
    <a href="#">link10</a><br>
    <a href="#">link11</a><br>
    <a href="#">link12</a><br>
    <a href="#">link13</a><br>
    <a href="#">link14</a><br>
    <a href="#">link15</a><br>
    <a href="#">link16</a><br>
  </div>
</div>

vadim5june 06.07.2012 18:17

Цитата:

Сообщение от bes (Сообщение 186834)
И я не понял эту фишку насчёт top, разве top учитывается для статично позиционированных элементов?

это от Вашего варианта осталась-не нужна конечно

bes 06.07.2012 18:26

Всё же, реально ли спозиционировать при помощи css два div-a внутри третьего так, чтобы первому div не была задана высота (иначе возникнет развал верстки из-за его внутреннего содержимого), а высота второго div была равна расстоянию от низа первого до низа третьего (основного)?
Пока видится, что нет, поэтому таблица даёт лучшее решение.

vadim5june 06.07.2012 18:29

Цитата:

Сообщение от bes (Сообщение 186840)
Всё же, реально ли спозиционировать при помощи css...

с помощью javascript можно
по событию onresize вычислять высоту второго блока как разницу

bes 06.07.2012 18:34

Цитата:

Сообщение от vadim5june
с помощью javascript можно

Да, это можно, речь именно о css

Deff 06.07.2012 18:37

Цитата:

Сообщение от bes
чтобы первому div не была задана высота

ну можно наверно, если второму задать display:inline-block; height:100%;
а у первого- width:100%; но имхо таблицы - позволяют выигрывать скорость вместо спотыканий на таких вещах

Пока для divов не будет нормального вертикального центрирования - всё это изъё


Часовой пояс GMT +3, время: 19:35.