Поведения PopupPanel по умолчанию должно быть достаточно. Вы действительно хотите position: absolute
, а не fixed
. (См. http://www.quirksmode.org/css/position.html для объяснения типов позиций, но fixed
- это когда плавает при прокрутке).
Проблема, с которой вы, вероятно, сталкиваетесь, заключается в том, что при показе PopupPanel он удаляется из того места, где он находился в DOM, и добавляется в RootPanel:
(Это из GWT 2.4, так что ваш точный код может очень)
public void show() {
if (showing) {
return;
} else if (isAttached()) {
// The popup is attached directly to another panel, so we need to remove
// it from its parent before showing it. This is a weird use case, but
// since PopupPanel is a Widget, its legal.
this.removeFromParent();
}
resizeAnimation.setState(true, false);
}
...
public void setState(boolean showing, boolean isUnloading) {
...
RootPanel.get().add(curPanel);
...
}
В результате, хотя position: absolute
должно быть достаточно, вероятно, ваши другие виджеты верхнего уровня также абсолютно позиционированы. Поэтому, когда вы прокручиваете страницу, вы, вероятно, фактически прокручиваете содержимое одного из ваших других виджетов, и PopupPanel застрял к внешнему элементу, который не имеет большой высоты смещения и не прокручивается. Вот почему он выглядит так же, как если бы он использовал fixed
позиционирование (то есть всегда XX пикселей сверху и сбоку окна браузера).
Вернитесь и посмотрите на конструкцию вашей страницы и исправьте другие виджеты, и все будет в порядке. Из моих наблюдений новые LayoutPanels используют position: absolute
повсюду, поэтому вам, возможно, придется вручную установить его на relative
.