2016-09-01 12 views
3

Я использую JQuery 1.11 с сопровождающим интерфейсом. Я хотел бы создать модальное окно на основе DIV, однако я бы хотел избежать указания фиксированной ширины на DIV, потому что количество элементов будет меняться. Тем не менее, я хотел бы сохранить все элементы в одном и том же плане, при условии, что будет достаточно горизонтальной экранной недвижимости (если нет, это нормально для их обертывания). Так что у меня есть этот DIVКак открыть текстовое диалоговое окно JQuery, которое равно ширине всех элементов в DIV?

<div id="loginBox" style="display:none;"> 
    <div>Login/Sign Up To Save Your Race Results</div> 
    <div id="loginLogos"> 
      <a href="#"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Google_plus.svg/491px-Google_plus.svg.png" height="75" /></a> 
      <a href='#'><img src="https://hilalcenter.files.wordpress.com/2011/08/icon_facebook.png" height="75" /></a> 
      <a href='#'><img src="http://www.freeiconspng.com/uploads/twitter-icon-png-13-1.png" height="75" /></a> 
      <a href='#'><img src="https://image.freepik.com/free-icon/linkedin-logo_318-52856.png" height="75" /></a> 
    </div> 
</div> 

с этим стилем

#loginBox { 
    display: inline-block; 
    background-color: gray; 
} 

и вот JQuery, который создает модальное

var opt = { 
     autoOpen: false, 
     modal: true, 
    } 
    $("#loginBox").dialog(opt); 
    $("#loginBox").dialog("open"); 

но, как вы увидите из этого Fiddle - https://jsfiddle.net/fupcjLr4/3/, если вы щелкните по ссылке «Показать», как только диалог будет создан, один из элементов обернется на следующую строку, хотя есть достаточно места для отображения всех них, и, несмотря на то, что я указал «вытеснить ay: inline-block "на все. Как сделать мой modal открытым по размеру всех элементов на одной плоскости?

ответ

0

Try с

#loginLogos { white-space: nowrap;} 

, чтобы избежать упаковки на новую строку.

+0

я хочу, чтобы обернуть если не enoguh пространство. Смотрите этот скрипт - https://jsfiddle.net/fupcjLr4/4/. Вы не можете видеть все логотипы, когда вы нажимаете «Показать» – Dave

+0

. Затем я обработаю открытое событие диалога ui и внутри обработчика, устанавливая ширину диалога, зависящую от его ширины содержимого, см. Здесь, чтобы иметь представление: https: //jsfiddle.net/tL7mzhfg/3/ – Dario

+0

Когда я открываю этот Fiddle, значок твиттера не отображается на экране. – Dave

0

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

var opt = { 
    autoOpen: false, 
    modal: true, 
    width: 'auto', 
    focus: function(e) { 
     $(this).dialog('option', 'width', $("#loginBox").width()); 
    } 
} 

https://jsfiddle.net/o5r34a4q/3/

EDIT:

JQuery ширина иногда может возвращать округленное вниз значение, которое в этом случае сделали бы контейнер ширина просто немного короткий. Чтобы уточнить это, вы можете использовать getBoundingClientRect, который даст вам точную вычисленную ширину.Как это:

function open_login_dialog() { 
    var opt = { 
    autoOpen: false, 
    modal: true, 
    width: 'auto', 
    focus: function(e) { 
     $(this).dialog('option', 'width', $("#loginBox")[0].getBoundingClientRect().width); 
    } 
    } 
    $("#loginBox").dialog(opt); 
    $("#loginBox").dialog("open"); 
} 

https://jsfiddle.net/o5r34a4q/5/

См https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect

+0

Что-то странное - когда я увеличил размеры изображения, чтобы отразить то, что на самом деле будет моя ширина, Fiddle breaks - https://jsfiddle.net/o5r34a4q/4/. Обратите внимание, что логотип LInkedIn подходит к следующей строке. Есть ли способ исправить это? – Dave

0

Вы можете установить ширину и высоту #loginBox к опциям перед назначением его как диалог:

var opt = { 
     autoOpen: false, 
     modal: true, 
     width: $('#loginBox').width(), 
     height: $('#loginBox').height(), 
    } 
    $("#loginBox").dialog(opt); 
    $("#loginBox").dialog("open"); 

См .: http://codepen.io/anon/pen/qadoxm

+0

Ваш пример не работает, по крайней мере, не для меня на Mac Firefox или Chrome. Логотип LinkedIn появляется на следующей строке. Они все выглядят в одной строке (при условии, что имеется достаточно горизонтального пространства, которое есть) – Dave

0

добавить это к использованию width.css

#loginLogos img{ 
    width:23%; 
    margin-left:0.7%; 
} 

и height в %, то она будет меняться при изменении его parent.

или же удалить выше и добавьте следующие строки в js

$(document).ready(function(){ 
    var boxWidth = $("#loginBox").width(); 
    alert(boxWidth); 
    var imgWidth = boxWidth/5; 
    alert(imgWidth); 
    $("#loginLogos img").css({"width":imgWidth,"height":imgWidth,"margin-left":2}); 

}); 
+0

HOw Я делаю эту работу путем определения ширины в фиксированном пикселе, а не в процентах? – Dave

+0

это не «фиксированный размер», он занимает ширину контейнера и устанавливает ширину изображения как «23%» из ширины контейнера для каждого 'img' –

+0

Я хочу использовать фиксированные пиксельные ширины, потому что, когда я использую проценты, он выглядит ужасно. Это Fiddle у меня с вашим кодом - https://jsfiddle.net/o5r34a4q/11/. – Dave