Подтвердить что ты не робот

Возможно ли иметь всплывающее окно, которое "вырывается" из переполнения: прокрутка или переполнение: автоконтейнер?

У меня есть область с прокруткой, содержащая всплывающие меню. Концептуально, что-то вроде этого:

<div style="overflow:auto; width:100px; height:100px">
  ... content here that big enough to trigger scrollbars...
  <div>
    <a href="javascript:$('#popup').show()">Click here</a>
    <div style="position:relative">
      <div id="popup"
           style="display:none; position:absolute; width:150px; height:150px">
        ... more content. This div gets shown and hidden by jquery on click events.
      </div>
    </div>
  </div>
</div>

Проблема заключается в том, что при всплывающем всплывающем меню она также содержится в прокручиваемом div и не отображается вне прокручиваемой области размером 100x100 пикселей независимо от того, насколько высоко я делаю z-index. Я понимаю, конечно, что в каком-то смысле именно то, что я просил, когда я сказал внешнему div переполняться: auto в первую очередь. Но для моего варианта использования это не то, что я хочу - я хочу, чтобы всплывающее меню было "сверху" и могло выходить за пределы прокручиваемой области, оставаясь в нужном месте, то есть прямо под Ссылка "Нажмите здесь". Даже если ссылка "Нажмите здесь" может перемещаться по мере прокрутки контейнера.

Я также понимаю, что есть некоторые сложные обходные пути, которые я мог бы использовать, например, поместить всплывающее окно полностью за пределы прокручиваемого div и использовать javascript для его положения. И тогда мне нужно будет реагировать на события прокрутки, чтобы переместить их, когда содержимое прокручивается и т.д. Не говоря уже о необходимости писать много кода для повторной реализации того, что "позиция: relative/position: absolute" дала мне бесплатно, что также потребует немало рефакторинга моего собственного кода, поэтому я бы предпочел избежать его.

Мне интересно, есть ли какой-нибудь простой трюк, который я могу применить к моему внутреннему div, чтобы сказать ему игнорировать его свойство "переполнения контейнера", или, в противном случае, удобный jquery script, который будет реализовывать сложные вещи для меня за кулисами, поэтому мне просто нужно позвонить, чтобы получить эффект, который я получаю после.

4b9b3361

Ответ 1

Я бы сказал, что это невозможно сделать без использования JS для вычисления позиции ссылки, а затем отобразить всплывающее окно с положением: fixed.

Проблема заключается в том, что ваше всплывающее окно находится внутри div с overflow:auto, и все внутри этого div повлияет на прокрутку, поэтому, чтобы показать всплывающее окно, вам нужно взять его за пределы этого div, и единственный способ, которым я знаю сделайте это с помощью позиции: fixed... (или, может быть, с использованием позиции: абсолютной по всплывающему окну, и div обертки с позицией: относительная, которая содержит текст и всплывающие окна)

поэтому я предлагаю 3 решения:

  • поместите всплывающее окно вне div с прокруткой, и когда пользователь нажимает по ссылке, отобразите всплывающее окно
  • вычислить точное положение ссылки (x, y) и отобразить всплывающее окно с использованием положения: фиксированное и координаты
  • используйте приятное и всегда удобное в использовании окно сообщений (например http://csscody.com/demo/wp-content/demo/popup/demo.htm) Я знаю, что это не совсем что вы хотели, но.. у меня кончились идеи = D

Я надеюсь, что это поможет

Ответ 2

Отображение всплывающего окна внутри div с "overflow: auto", "overflow: scroll" или "overflow: hidden" всегда будет генерировать такие проблемы. По правилу дочерний элемент не может отображаться за пределами родительских границ во всех этих случаях, потому что свойство переполнения делает именно это. Использование " position: fixed" во всплывающем окне решит вашу проблему, но если вы прокрутите вниз, вы увидите, как всплывающее окно отображается в старой позиции, предшествующей событию прокрутки. Чтобы решить эту проблему, вы можете использовать JQuery следующим образом:

$(".your-popup-PARENT-class").live( {
    mouseenter: function(event) {
        event.stopPropagation();
        var position = $(this).offset();
        $(this).find(".your-popup-class").css("top", (position.top + 30) );
        $(this).find(".your-popup-class").css("left", position.left);
        $(this).find(".your-popup-class").css("display", "inherit");
    },
    mouseleave: function(event) {
        event.stopPropagation();
        $(this).find(".your-popup-class").css("display", "none");
    }
});

Этот сегмент кода находит ваш родительский элемент всплывающего окна в дереве DOM, сохраняет текущую позицию и отображает всплывающее окно в той же позиции родителя. Как вы можете видеть, вы можете добавлять или удалять нужные пиксели (жирный код в предыдущем определении CSS).

Надеюсь, это будет ужасно для кого-то другого с такой проблемой.

С уважением!

Ответ 3

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

<div style="overflow:auto; width:100px; height:100px">
  ... content here that big enough to trigger scrollbars...
    <div id="popup"
         style="display:none; position:absolute; width:150px; height:150px">
      ... more content. This div gets shown and hidden by jquery on click events.
    </div>
</div>