Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: прыгает div
 
 автор: Keyses   (07.03.2011 в 02:40)   письмо автору
 
 

у меня такая схема:
<div id="conteiner">
<div id="header"></div>
<div id="content"></div>
<div id="footer"></div>
</div>

#container {
width:829px;
margin:0 auto;
text-align:left;
}

И всё бы ничего, но когда в content содержится много текста, весь container сдвигается на несколько пикселей влево. Как будто центр всего макета смещается на эти несколько пикселей. Как избежать этого эффекта? Такое происходит в Opera и Chrome.

Если сделать так: margin-left:400px; то всё становится нормально, но мне нужно чтобы макет был по центру страницы.

  Ответить  
 
 автор: Абырвалг   (07.03.2011 в 12:19)   письмо автору
 
   для: Keyses   (07.03.2011 в 02:40)
 

Установку какого-либо объекта по центру тела документа браузер делает так:
1) Определяет доступную ширину тела документа
2) Определяет ширину центрируемого объекта
3) Отнимает из "первого" "второе" и делит напополам
4) Полученное в "третьем" - это и будет отступ центрируемого объекта слева (и такой же - справа).

Если "второе" не изменилось (если макет у Вас ширины не меняет), на позицию его может повлиять лишь ТОЛЬКО изменение доступной ширины тела документа и ничто другое.

Запустите в браузере (в любом) и посмотрите:
<p><input type="button" value="1. Узнать ширину тела документа"
   onclick="document.getElementById ('i1').value += document.body.clientWidth; this.disabled = 1; document.getElementById ('b2').disabled = 0">
<input id="i1" readonly value="Было - ">
<p><input id="b2" disabled type="button" value="2. Добавить содержимое"
   onclick="document.getElementById ('mDV').style.height = '5000px'; this.disabled = 1; document.getElementById ('b3').disabled = 0">
<p><input id="b3" disabled type="button" value="3. Узнать ширину тела документа"
   onclick="document.getElementById ('i3').value += document.body.clientWidth; this.disabled = 1">
<input id="i3" readonly value="Стало - ">

<div id="mDV">&#160;</div>

При добавлении контента справа на странице появляется вертикальный скроллбар, который уменьшает доступную ширину тела документа на какую-то (свою) ширину.
Ровно вполовину этой ширины скроллбара и сдвигается влево центрируемый объект.

[поправлено модератором]

  Ответить  
 
 автор: Keyses   (07.03.2011 в 12:49)   письмо автору
 
   для: Абырвалг   (07.03.2011 в 12:19)
 

Получается так:
Было - 1676
Стало - 1659

Спасибо за подробное объяснение. Идея ясна, но всё же не ясно как исправить такое поведение?

Нашёл советы сделать так:
html,body{min-height:101%;}
или так
html,body{overflow-y:scroll;}
но по-моему это плохие варианты. надо что-то динамическое что будет компенсировать ширину полосы прокрутки.

  Ответить  
 
 автор: Абырвалг   (07.03.2011 в 13:53)   письмо автору
 
   для: Keyses   (07.03.2011 в 12:49)
 

Самый простой способ - body {overflow-y: scroll} - и Вы его уже нашли.

Динамически - тоже можно, конечно.
Тогда НИЧЕГО не задавайте в стилях для margin центрируемого блока, а напишите функцию, коя будет всё то, что я перечислил выше в четырёх пунктах, делать вместо браузера.
И повесьте эту функцию на события onload и onresize.
<head>
<style>
body {margin: 0}
#conteiner {width: 829px}
</style>
<script>
function myFunc ()
{
var dv = document.getElementById ('conteiner');
var W_body = document.body.clientWidth;
var W_div = dv.offsetWidth;
dv.style.marginLeft = (W_body > W_div) ? ((W_body - W_div) / 2 + 'px') : 0;
}
</script>
</head>
<body onload="myFunc ()" onresize="myFunc ()">
<input type="button" value="Добавить содержимое"
   onclick="document.getElementById ('myDV').style.height = '5000px'; this.disabled = 1"><br>
...
<div id="conteiner"><div id="myDV" style="height: 123px; background: aqua">&#160;</div></div>
...

</body>
PS. намекаю: container и conteiner - это два разных слова :-)

  Ответить  
 
 автор: Keyses   (07.03.2011 в 14:15)   письмо автору
 
   для: Абырвалг   (07.03.2011 в 13:53)
 

>Самый простой способ - body {overflow-y: scroll} - и Вы его уже нашли.

Да, но тогда, по крайней мере в Опере появляются 2 скроллабара, может можно сделать так, чтобы всегда был только 1 но иногда активный, иногда нет?

  Ответить  
 
 автор: Абырвалг   (07.03.2011 в 15:53)   письмо автору
 
   для: Keyses   (07.03.2011 в 14:15)
 

Какие два скроллбара?
Вы о чём вообще пишете?
Запустите ТОТ ЖЕ самый код, который я Вам давал, в Опере, добавив в нём стиль для <BODY>
<style>
body {overflow-y: scroll}
</style>


<body>
<p><input type="button" value="1. Узнать ширину тела документа"
   onclick="document.getElementById ('i1').value += document.body.clientWidth; this.disabled = 1; document.getElementById ('b2').disabled = 0">
<input id="i1" readonly value="Было - ">
<p><input id="b2" disabled type="button" value="2. Добавить содержимое"
   onclick="document.getElementById ('mDV').style.height = '5000px'; this.disabled = 1; document.getElementById ('b3').disabled = 0">
<p><input id="b3" disabled type="button" value="3. Узнать ширину тела документа"
   onclick="document.getElementById ('i3').value += document.body.clientWidth; this.disabled = 1">
<input id="i3" readonly value="Стало - ">

<div id="mDV">&#160;</div>
</body>

Где тут "второй скроллбар" появляется?
Или у Вас прописан скроллбар для тега DIV, просто Вы об этом скромно умолчали?
Или у Вас настолько древняя Опера, которая не понимает overflow-y:, а только overflow: и добавляет поэтому ещё и горизонтальный скроллбар?

Не сильно переживайте по этому поводу. Вы, видимо, ЕДИНСТВЕННЫЙ на этой планете, кто до сих пор пользует Оперу версии до 9.5 - у всех уже давно стоят 10-я и 11-я версии, кои прекрасно понимают overflow-y:

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования