Bootstrap/JQuery Responsive/Centered Modal w/Google Docs IFRAME

После нескольких дней пробных вариаций я, наконец, заработал все параметры размеров, используя настройки по умолчанию для IFRAME для расчета настроек по умолчанию для всего остального, вплоть до размера экрана. Затем я использовал это соотношение для сравнения с реальным размером экрана и обратил весь процесс, чтобы построить фактические значения ширины и высоты.

Эта новая версия отлично работает, пока не будет применено вертикальное центрирование к модальному модулю, когда его размеры определяются шириной. Вот обновленный JSFiddle: http://jsfiddle.net/gu8dqdco/1/

Все изменения размера работают отлично, если я не вычисляю верхнее поле в операторе ELSE:

if((windowX / windowY) > (defaultScreenWidth / defaultScreenHeight))
{
 modalY = windowY - (outerModalPadding * 2);
 modalX = (modalY * defaultModalWidth) / defaultModalHeight;
 modalMarginTop = outerModalPadding;
 modalMarginLeft = (windowX - modalX) / 2;
}
else
{
 modalX = windowX - (outerModalPadding * 2);
 modalY = (modalX * defaultModalHeight) / defaultModalWidth;
 modalMarginTop = (windowY - modalY) / 2;
 modalMarginLeft = outerModalPadding;
}

Дело не в том, что он не центрирует содержимое, а в том, что содержимое сжимается, когда ширина регулируется как управляющий фактор во всех размерах.

На данный момент у меня нет идей. Любая помощь будет принята с благодарностью.

Оригинал:

Итак, вкратце: я написал функцию, которая будет центрировать модальное окно и сохранять отзывчивость, добавляя отзывчивость к IFRAME внутри тела модального окна. Я попытался сделать его универсальным для IFRAME, добавив при этом функциональность для удаления (скрытия) .controlbar средства просмотра документов Google. Вот JSFiddle: http://jsfiddle.net/g2n8cnnm/2/

Вот функция:

 function resizeModal() {
  $(this).css('display', 'block');
  var windowX = $(window).width();
  var windowY = $(window).height();
  var modal = $(this).find('.modal-dialog');
  var header = $(this).find('.modal-header');
  var headerY = header.height() + parseInt(header.css('padding-top')) + parseInt(header.css('padding-bottom')) + parseInt(header.css('border-top')) + parseInt(header.css('border-bottom'));
  var content = $(this).find('iframe');
  var contentX = parseInt(content.css('width'));
  var contentY = parseInt(content.css('height'));
  var body = $(this).find('.modal-body');
  var bodyPX = parseInt(body.css('padding-left')) + parseInt(body.css('padding-right'));
  var bodyPY = parseInt(body.css('padding-top')) + parseInt(body.css('padding-bottom'));
  if(((windowX) / (windowY)) > (contentX / contentY)) {
   var bodyY = windowY - headerY - bodyPX;
   var bodyX = (bodyY * contentX) / contentY;
  } else {
   var bodyX = windowX - bodyPY;
   var bodyY = (bodyX * contentY) / contentX;
  }
  var contentX = bodyX;
  var contentY = bodyY;
  var centerX = (windowX - bodyX) / 2;
  var centerY = (windowY - headerY - bodyY) / 2;
  modal.css('width', bodyX);
  body.css('width', bodyX);
  body.css('height', bodyY);
  content.css('width', contentX);
  content.css('height', contentY);
  var centerX = (windowX - bodyX) / 2;
  var centerY = (windowY - headerY - bodyY) / 2;
  modal.css('margin-top', centerY);
  modal.css('margin-left', centerX);
 }

Итак, у меня есть две проблемы. Во-первых, ширина .modal-body на 30 пикселей меньше. Я исправил это, сделав «var contentX = bodyX - bodyPX;», но это вызывает проблемы с изменением размера, когда с каждым изменением размера он становится все меньше и меньше. Любые идеи о том, как я могу исправить ширину содержимого, не меняя тело и не вызывая этого постоянного сжатия?

Вторая проблема связана с соотношением и его переключением с определения размера по высоте на определение размера по ширине. Если работает отлично, в точку. Изменение размера с представления строки на представление столбца приводит к сбоям и переключению на изменение размера по ширине слишком рано, заставляя верхнюю и нижнюю часть модального окна отображаться за пределами экрана. Я знаю, что соотношение windowX/windowY не является идеальным соотношением для работы, но поскольку размер модального окна, которое, как я считаю, является идеальным соотношением, устанавливается путем вычислений, выполняемых во время оператора IF, я не совсем уверен в этом. как я могу это исправить.

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


person Christopher Esbrandt    schedule 22.08.2014    source источник


Ответы (1)


В конце концов, я считаю, что нашел решение, хотя это не то, на что я надеялся.

Оказывается, проблема в определении переменной outerModalPadding. Раньше у меня было настроено получение значения из CSS, и это прекрасно работало, пока ширина страницы не упала ниже 768 пикселей. Я попытался просто удалить ограничение разрешения в CSS, определяющем это значение, но это не имело никакого значения.

В конце концов, я просто определил фиксированное значение в jQuery.

Вот рабочая функция:

$(document).ready(function() {
 $('iframe').each(function() {
  if($(this).hasClass('google')) {
   $(this).wrap('<div class="googleDIV"></div>');
  }
 });
 function resizeModal() {
  $(this).css('display', 'block');
  var modal = $(this).find('.modal-dialog');
  var header = $(this).find('.modal-header');
  var content = $(this).find('iframe');
  var modalBody = $(this).find('.modal-body');

  var outerModalPadding = 10;
  var innerModalPadding = 15;
  var defaultContentWidth = 600;
  var defaultContentHeight = 768;
  var googleControlbarHeight = 37;
  var defaultBodyWidth = defaultContentWidth + (innerModalPadding * 2)
  var defaultBodyHeight = defaultContentHeight - googleControlbarHeight + (innerModalPadding * 2);
  var headerY = header.height() + (innerModalPadding * 2) + parseInt(header.css('border-top')) + parseInt(header.css('border-bottom'));
  var defaultModalWidth = defaultBodyWidth;
  var defaultModalHeight = headerY + defaultBodyHeight;
  var defaultScreenWidth = defaultModalWidth + (outerModalPadding * 2);
  var defaultScreenHeight = defaultModalHeight + (outerModalPadding * 2);

  var windowX = $(window).width();
  var windowY = $(window).height();
  var bodyPX = parseInt(modalBody.css('padding-left')) + parseInt(modalBody.css('padding-right'));
  var bodyPY = parseInt(modalBody.css('padding-top')) + parseInt(modalBody.css('padding-bottom'));

  if((windowX / windowY) > (defaultScreenWidth / defaultScreenHeight))
  {
   modalY = windowY - (outerModalPadding * 2);
   modalX = (modalY * defaultModalWidth) / defaultModalHeight;
   modalMarginTop = outerModalPadding;
   modalMarginLeft = (windowX - modalX) / 2;
  }
  else
  {
   modalX = windowX - (outerModalPadding * 2);
   modalY = (modalX * defaultModalHeight) / defaultModalWidth;
   modalMarginTop = (windowY - modalY) / 2;
   modalMarginLeft = outerModalPadding;
  }
  bodyY = modalY - headerY;
  bodyX = modalX;
  contentY = bodyY + googleControlbarHeight - (innerModalPadding * 2);
  contentX = bodyX - (innerModalPadding * 2);

  content.css({width: contentX, height: contentY});
  modalBody.css({width: bodyX, height: bodyY});
  modal.css({width: modalX, height: modalY, 'margin-top': modalMarginTop, 'margin-left': modalMarginLeft});
 }
 $('.modal').on('show.bs.modal', resizeModal);
 $(window).resize(function resize() {
  $('.modal:visible').each(resizeModal);
 });
});

Его можно найти по адресу: http://jsfiddle.net/gu8dqdco/3/.

Если я почувствую желание сделать это, я переделаю его, чтобы удаление панели управления Google было необязательным, вероятно, через другой класс, но это в другой раз.

person Christopher Esbrandt    schedule 15.09.2014