2012-05-29 2 views
0

Я пытаюсь бороться с странным поведением - и любая помощь приветствуется.div, показанный с jquery, обрезается

У меня есть длинная и сложный HTML-страница с общей структурой примерно так:

+------------------------------------------+ 
| Page header        | 
+-----------------------------+------------+ 
|        | Right  | 
| Main content    | Column | 
|        |   | 
+-----------------------------+------------+ 

В «основном содержании», все действие происходит. Одна из вещей, которые могут произойти, - это щелчок кнопки пользователя, отображается div с absolute, которая изначально невидима, и ее содержимое заполняется с помощью AJAX (т. Е. Я заранее не знаю, сколько контента есть) ,

Это прекрасно работает, если общая сумма height этого раздела заканчивается меньше, чем доступная высота «основного содержимого». Если, однако, этот «всплывающий» div заканчивается длинным из-за большого количества контента, то он усекается в нижней части раздела «Основной контент». Поскольку нет ничего ниже, я не могу даже прокрутить вниз, чтобы увидеть весь контент всплывающего окна. Я бы хотел, чтобы «основной контент» увеличивался, чтобы разместить всю высоту всплывающего окна, а страница прокручивается до самого всплывающего окна, но этого не происходит.

Вот CSS для моего "основного содержания":

.content { 
    width: 770px; 
    position: relative; 
    overflow-x: visible; 
    overflow-y: hidden; 
} 

И вот CSS для всплывающего окна:

#popupedit { 
    background-color: #f1f0ec; 
    width: 770px; 
    z-index: 100001; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
    display: none; 
} 

В HTML popupedit является прямым потомком content. В цепи нет ни высоты, ни ограничения максимальной высоты. Итак, почему «контент» не подходит для размещения «всплывающих окон»?

+1

Попробуйте сделать 'переполнение-у:' видно в '.content' – Timm

+0

Возможно, это возможно. К сожалению, по другим причинам я не могу удалить «overflow-y: hidden». Однако, насколько мне известно, это действует только в том случае, если я явно контролирую высоту родителя. В моем случае высота всегда «авто» –

+0

Абсолютные позиционируемые элементы не добавляют к естественной высоте или ширине их родителей. Вот почему ваш содержащий div не приспосабливается к размеру. Для таких вещей есть некоторые хаки, но я бы рекомендовал переместить всплывающее окно снаружи, предпочтительно добавить его непосредственно к элементу body. Это также сделает ваше решение более безопасным OLD-IE. –

ответ

0

Вы могли бы решить это, удалив абсолютное позиционирование и используя другую технику (то есть поплавки), чтобы расположить всплывающее окно. Позвольте мне угадать, position: absolute тоже требуется? :) Если да, то есть еще надежда: вы можете изменить размер содержимого div с помощью JavaScript после загрузки содержимого.

$(".content").css("min-height", $("#popupedit").height()+"px"); 

Конечно, это было бы работать после того, как всплывающее окно загрузится полностью, и вы, вероятно, следует отменить изменение размера после того, как всплывающее окно уходит:

$(".content").css("min-height", ""); 
+0

Да, это то, о чем я думал. Конечно, это немного сложнее, потому что этот контент содержит изображения, а то, что я получаю через AJAX, - это просто URL-адрес изображений. Я не буду знать реальную высоту всплывающего окна, пока все изображения не будут загружены. :) –

+0

Затем после запуска вышеуказанного кода только что вставленного содержимого привяжите его к событию 'load' всех изображений во всплывающем окне:' $ ("# popupedit img"). Load (updateFunction); '. Код изменения размера является быстрым и идемпотентным; вы можете запускать его столько раз, сколько необходимо (хотя вам может понадобиться добавить чек, чтобы он не запускался после закрытия всплывающего окна). – Brilliand

+0

Aha! это была та часть, которую мне не хватало: привязка «загрузки» изображений. Теперь это работает. –

2

Похоже, вы создаете всплывающее окно в div .content.

У этого есть переполнение-y: скрытое, которое скроет любое переполнение.

Попробуйте переместить всплывающее окно из содержимого div.

+0

Я не могу переместить его на улицу. Что касается «overflow-y: hidden», я понимаю, что это применимо только тогда, когда я явно устанавливаю «height» или «max-height» для родителя. В противном случае высота родителя должна быть скорректирована, чтобы соответствовать детям. –

+0

Почему вы не можете его переместить? Как вы делаете всплывающее окно видимым, когда это необходимо? – Alex

+0

Я просто не контролирую ничего за пределами «основного контента». Способ разработки механизма компоновки, сначала выводится заголовок, а затем правый столбец. Затем вставляется основной контент. Наконец, глобальный нижний колонтитул следует. Двигатель заботится обо всем макете и просто вставляет мою страницу (которая представляет собой контент, который входит в «div», который открывается и закрывается от родителя) там, где это необходимо. –

0

Удалить переполнение-y: скрыто; и он должен работать. Кроме того, я бы рекомендовал давать popupedit фиксированной высоте

Edit: Ok попробовать этот хак

JS:

var hh = document.getElementById('popupedit').offsetHeight; 
document.getElementById('fix').style.height = hh + "px"; 

CSS:

.content { 
    width: 770px; 
    position: relative; 
    overflow-x: visible; 
    overflow-y: hidden; 
    height: auto 
} 
#popupedit { 
    background-color: #f1f0ec; 
    width: 770px; 
    z-index: 100001; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
} 

#fix { width: 770px; } 

HTML:

<div class = "content"> 
    <div id = "popupedit"> 
     <p>Something important</p>     
    </div> 
    <div id = "fix"></div> 
</div> 
+0

Я не могу удалить «overflow-y: hidden» по разным причинам. Я понимаю, что «overflow-y: hidden» применяется только тогда, когда высота или максимальная высота установлены на родительском. В противном случае родитель должен расти для размещения детей. Исправлена ​​высота всплывающего окна, определенно не может быть и речи, так как содержание может составлять от 100 до 1000 пикселей в высоту, а всплывающее окно имеет свой собственный фон, который должен отображаться только там, где находится контент. –

+0

Я отредактировал свой ответ, возможно, это сработает для вас. – madeye

-1

Try удаление position:relative; .content. В любом случае это не обязательно (если вам это не нужно для чего-то, чего вы не сказали). Это большое недоразумение. Многие люди используют position: relative; практически для всех элементов. Это НЕ ВСЕ.

В этом случае это может даже вызвать проблемы, так как #popupedit теперь будет позиционировать себя как своего родителя, а не окна. Я предлагаю, удаляя position: relative;, давая всплывающее окно width, вычисляя его горизонтальное положение с помощью jQuery, чтобы центрировать его.Также избавиться от top: 0; и left: 0;

Затем добавьте этот фрагмент кода в код, который вы называете для выскакивают-It-Up, или в отдельном файле (действительно не имеет значения):

$("#popupedit ").css({ 
    left: ($(window).width() - $('.className').outerWidth())/2, 
    top: ($(window).height() - $('.className').outerHeight())/2 
});​ 
+0

Вы, кажется, совершенно неправильно поняли мой вопрос. Именно поэтому у меня есть «позиция: относительная» для родителя: потому что мне нужно, чтобы абсолютно позиционированный div был помещен абсолютно в его родительский элемент, а не в окно. И я не хочу изменять размер всплывающего окна - мне нужно, чтобы всплывающее окно было таким большим, каким оно должно быть, - и родитель корректирует его высоту для соответствия. –

+0

Ну, тогда вам не хватает точки «всплывающего окна». В любом случае, пожалуйста, предоставьте тестовый пример. –

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