2016-08-12 117 views
10

我想使用jQuery UI和Bootstrap行/面板製作一組可拖動的面板。我有一些主要工作,我的問題是,當您拖動面板佔位符的大小不正確。它是整行的大小而不是元素的大小。帶有Bootstrap行的jQuery UI可排序佔位符

$('.row').sortable({ 
 
\t connectWith: ".panel", 
 
\t handle: ".panel-heading", 
 
\t placeholder: "panel-placeholder" 
 
}); 
 

 
$('.panel').on('mousedown', function(){ 
 
\t $(this).css('cursor', 'move'); 
 
}).on('mouseup', function(){ 
 
\t $(this).css('cursor', 'auto'); 
 
});;
.panel-placeholder { 
 
\t border: 1px dotted black; 
 
\t margin: 1em 1em 1em 1em; 
 
\t height: 50px; 
 
}
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/> 
 
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
 
<div class="container-fluid"> 
 
\t <div class="row"> 
 
\t \t <div class="col-md-3"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-4"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-8"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div> 
 
</div>

$('.col-md-4').sortable({ 
    connectWith: ".col-md-4", 
    handle: ".panel-heading", 
    placeholder: "panel-placeholder" 
}); 

的jsfiddle:https://jsfiddle.net/zdfb3e0p/8/

任何想法?

+1

我編輯的CSS在你的小提琴,改變你的'.panel-placeholder'的'margin'屬性'保證金:1EM 1EM 1EM 1EM;'似乎工作不夠好爲了我。或者你可以使用'margin:15px 1em 1em 15px;'這更符合bootstrap的邊距和填充。 –

回答

6

OpherV解決方案可對此進行測試。然而,這是一個簡化的版本,仍然有效,並試圖通過在CSS代碼上留下CSS事項來保持關注的分離。 我試圖保持js代碼本身的填充/邊距交互最小。

的想法是一樣的,我得到的widthheight直接從.panel,我複製所有的col- DIV的類。但邊距和填充通過CSS設置以匹配Bootstrap的默認值。

你可以在下面的代碼片段找到它,或者在jsfiddle上找到它。https://jsfiddle.net/zdfb3e0p/16/

$('.row').sortable({ 
 
    connectWith: ".panel", 
 
    handle: ".panel-heading", 
 
    placeholder: "panel-placeholder", 
 
    start: function(e, ui){ 
 
     ui.placeholder.width(ui.item.find('.panel').width()); 
 
     ui.placeholder.height(ui.item.find('.panel').height()); 
 
     ui.placeholder.addClass(ui.item.attr("class")); 
 
    } 
 
}); 
 

 
$('.panel').on('mousedown', function(){ 
 
    $(this).css('cursor', 'move'); 
 
}).on('mouseup', function(){ 
 
    $(this).css('cursor', 'auto'); 
 
});;
.panel-placeholder { 
 
    border: 1px dotted black; 
 
    border-radius: 4px; 
 
    margin: 0 15px 20px 15px; 
 
    padding: 0; 
 
    height: 50px; 
 
}
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/> 
 
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
 
<div class="container-fluid"> 
 
\t <div class="row"> 
 
\t \t <div class="col-md-3"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-4"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-8"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div> 
 
</div>

+0

優雅!唯一需要注意的是,如果你的元素有Bootstrap以外的其他類,但我想你可以將它們過濾掉 – OpherV

+1

是的,爲了公平,我認爲你的解決方法更加「防彈」,特別是在班級管理上。但是由於OP要求簡化的解決方案,我認爲我可以用我的沙粒做出貢獻。 –

+1

因爲他是第一個提出工作解決方案的人,所以我授予了OpherV的觀點。我授予你接受的答案,因爲它是我最終使用的解決方案。 –

2

Bootstrap的網格系統有一個默認的30px填充(每邊15px)。由於您正在與.row綁定,因此您需要對此進行解釋。將.panel-placeholder上的margin值更改爲15px將使其符合Bootstrap的Grid Framework。

$('.row').sortable({ 
 
\t connectWith: ".panel", 
 
\t handle: ".panel-heading", 
 
\t placeholder: "panel-placeholder" 
 
}); 
 

 
$('.panel').on('mousedown', function(){ 
 
\t $(this).css('cursor', 'move'); 
 
}).on('mouseup', function(){ 
 
\t $(this).css('cursor', 'auto'); 
 
});;
.panel-placeholder { 
 
\t border: 1px dotted black; 
 
\t margin: 15px; 
 
\t height: 50px; 
 
}
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/> 
 
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
 
<div class="container-fluid"> 
 
\t <div class="row"> 
 
\t \t <div class="col-md-3"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-4"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="col-md-3"> 
 
\t \t \t <div class="panel panel-primary"> 
 
\t \t \t \t <div class="panel-heading"> 
 
\t \t \t \t \t <h3 class="panel-title">Panel title</h3> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t Panel content 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div> 
 
</div>

https://jsfiddle.net/Lhmujrzz/

14

如果你希望你的佔位符有該項目的確切尺寸,您可以使用可排序start事件,as described in the API,計算和影響同一造型的拖動開始。

一旦您引用了佔位符元素以及事件中的句柄元素,就可以複製每個相關的CSS屬性。

另外,爲了保持原始元素在網格中的位置,您必須確保從原始元素中分配合適的col類。我也解釋了一些怪癖,例如默認情況下,jQuery佔位符被分配了一個內聯邊距,並且虛線邊框也佔用了一些空間。

$('.row').sortable({ 
    connectWith: ".panel", 
    handle: ".panel-heading", 
    placeholder: "panel-placeholder", 
    start: function(event, ui){ 
     var classes = ui.item.attr('class').split(/\s+/); 
     for(var x=0; x<classes.length;x++){ 
      if (classes[x].indexOf("col")>-1){ 
      ui.placeholder.addClass(classes[x]); 
      } 
     } 

     ui.placeholder.css({  
      width: ui.item.innerWidth() - 30 + 1, //account for margin and border 
      height: ui.item.innerHeight() - 15 + 1, //account for margin and border  
      padding: ui.item.css("padding"), //use original padding 
      marginTop: 0 //dispose of the jQuery margin 
     });  

    } 
    } 
}); 

這裏有一個working fiddle example

我確信在所有的響應模式

enter image description here

+0

你幾乎在那裏。您需要將代碼放在小提琴中並解決佔位符的邊距。 –

+0

有趣。當我做我最初的設計時,我沒有想到這一點。授予賞金的最短時間限制是24小時,但如果沒有簡單的解決方案,我會將獎金頒發給您。 –

+1

你是怎麼製作這個neato gif的? – adamdport