2013-03-09 21 views
9

Korzystając z interfejsu jQuery, jak mogę użyć funkcji podobnej do splittera, takiej jak ta pod adresem http://methvin.com/splitter/3csplitter.html?jQuery UI i Splitter

Pytam o to, ponieważ potrzebuję 2 rzeczy do wdrożenia na mojej stronie; Portlet (Draggable) :: http://jqueryui.com/sortable/#portlets i pionie Splitter :: http://methvin.com/splitter/3csplitter.html

nie jestem pewien, jak dobre kodowanie praktyka to, czy jestem w tym 2 oddzielne biblioteki (choć oba są oparte jQuery); jak http://host.sonspring.com/portlets/ dla Portlets i http://methvin.com/splitter/3csplitter.html dla Splitter

+0

zapewnia zmianę rozmiaru. za pomocą tego możesz zaimplementować splitter. Sprawdź także [to na zewnątrz] (http://stackoverflow.com/questions/5199368/resizable-split-screen-divs-using-jquery-ui) – Dogoku

+0

Potrzebowałem splittera podobnego do http://methvin.com/splitter/ 3csplitter.html – testndtv

Odpowiedz

17

Oto przykład, w jaki sposób stworzyć rozdzielacza przy użyciu jQuery UI:

HTML:

<div class="wrap"> 
    <div class="resizable resizable1"></div> 
    <div class="resizable resizable2"></div> 
</div> 

Scenariusz:

$(function() 
{ 
    $(".resizable1").resizable(
    { 
     autoHide: true, 
     handles: 'e', 
     resize: function(e, ui) 
     { 
      var parent = ui.element.parent(); 
      var remainingSpace = parent.width() - ui.element.outerWidth(), 
       divTwo = ui.element.next(), 
       divTwoWidth = (remainingSpace - (divTwo.outerWidth() - divTwo.width()))/parent.width()*100+"%"; 
       divTwo.width(divTwoWidth); 
     }, 
     stop: function(e, ui) 
     { 
      var parent = ui.element.parent(); 
      ui.element.css(
      { 
       width: ui.element.width()/parent.width()*100+"%", 
      }); 
     } 
    }); 
}); 

To popularny skrypt. Dodałem niewielkie modyfikacje układu płynów.

jsFiddle example

+0

Hahah. Szukałem tego skryptu W CAŁY DZIEŃ! Dzięki. – CIA

+0

Przy użyciu przeglądarki Firefox 32.0.1 niebieskie pole przechodzi do następnej linii podczas zmiany rozmiaru.Aby temu zapobiec, zastąp przecinki pojedynczymi deklaracjami 'var' zaczynającymi się od' var pozostałeSpace = ... ' – Loathing

+0

Zauważyłem również, że następujące dwa wiersze css były wymagane do uruchomienia go:' .ui-resizable {position: relative;} 'i' .ui-resizable-handle {position: absolute, rozmiar czcionki: 0.1px; Blok wyświetlacza; } ' – Loathing

2

Kiedyś odpowiedź Dmitriy jako podstawy mojej realizacji. Zauważ, że nic nie stoi na przeszkodzie, aby ta konkretna implementacja spowodowała podwojenie ramki ograniczającej, gdy suwak zostanie przeciągnięty w prawo.

Na razie potrzebowałem prostego, nie przesuwalnego splittera (z myślą o zmianie rozmiarów paneli w przyszłości), a moja aplikacja już używa jQuery, więc osiągnąłem to, zmieniając część jego kodu w następujący sposób:

$(function() 
{ 
    $(".resizable1").resizable(
    { 
     autoHide: false, 
     containment: "#wrap", 
     ... 

ja również zmienił styl css kursora (między innymi), aby zapobiec zmienny rozmiar kursora był wyświetlany w następujący sposób:

.ui-resizable-e { 
    cursor: default; 
    ... 

Dzięki Dmitriy!

0

Moja pierwsza myśl: najpierw wybieramy wszystkie pola oprócz ostatniego. Ci dostają rozgałęźnik po ich prawej stronie. Następnie, gdy rozdzielacz jest przesuwany, zmieniają się tylko dwa pola dotykające splittera.

Oto przykład kopiowania wklejek; działa tak, jak jest. Można tego użyć do dowolnej liczby kolumn; po prostu upewnij się, że dostosujesz również css.

Dodałem kilka przycisków, aby rozwinąć 1 pole; także przycisk resetowania.

<!DOCTYPE HTML> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>jQuery UI 4-Column Splitter</title> 
    <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.css" /> 
    <style> 
     body { 
     padding: 0; 
     margin: 0; 
     } 
     .wrap { 
     width: 100%; 
     white-space: nowrap; 
     background-color: #c0c0c0; 
     } 
     .resizable { 
      width: 25%; 
      height: 120px; 
      display: inline-block; 
      overflow: hidden; 
     } 
     .ui-resizable-e { 
      cursor: e-resize; 
      width: 10px; 
      top: 0; 
      bottom: 0; 
      background-color: gray; 
      z-index: 10; 
     } 
    </style> 
    </head> 
    <body> 
    <div class="wrap"> 
     <div class="resizable"> HELLO </div> 
     <div class="resizable"> WORLD </div> 
     <div class="resizable"> FOO </div> 
     <div class="resizable"> BAR </div> 
    </div> 
    <div id="controls"> 
     <input type="button" value="expand 0" data-index="0" class="expand"> 
     <input type="button" value="expand 1" data-index="1" class="expand"> 
     <input type="button" value="expand 2" data-index="2" class="expand"> 
     <input type="button" value="expand 3" data-index="3" class="expand"> 
     <input type="button" value="reset" class="reset"> 
    </div> 

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script> 
    <style type="text/css" media="all"> 
    </style> 
    <script type="text/javascript"> 
     $(function() { 
     // settings 
     var minWidth = 15; 
     var splitterWidth = 10; // this sh ould match the css value 

     var splitter = $('.ui-resizable-e'); 
     var container = $('.wrap'); 
     var boxes =  $('.resizable'); 

     var subBoxWidth = 0; 


     $(".resizable:not(:last)").resizable({ 
      autoHide: false, 
      handles: 'e', 
      minWidth: minWidth, 

      start: function(event, ui) { 
      // We will take/give width from/to the next element; leaving all other divs alone. 
      subBoxWidth = ui.element.width() + ui.element.next().width(); 
      // set maximum width 
      ui.element.resizable({ 
       maxWidth: subBoxWidth - splitterWidth - minWidth 
      }); 
      }, 

      resize: function(e, ui) { 
      var index = $('.wrap').index(ui.element); 
      ui.element.next().width(
       subBoxWidth - ui.element.width() 
      ); 
      }, 

     }); 
     // collapses all the other boxes to the minimum width; expands the chosen box to what ever width is left 
     $('.expand').click(function() { 
      var index = $(this).data('index'); 
      var boxesToCollapse = boxes.length - 1; 
      var widthLeft = container.width() - boxesToCollapse * (minWidth + splitterWidth); 
      for (var i=0; i<boxes.length; i++) { 
      boxes.eq(i).width(i==index ? widthLeft : minWidth); 
      } 
     }); 
     $('.reset').click(function() { 
      boxes.removeAttr('style'); 
     }); 
     }); 
    </script> 

    </body> 
</html> 
0

Splitter component częścią ram Tarcza UI pozwala na stosowanie mieszaniny rozgałęźniki poziomych i pionowych.