2016-08-12 2 views
10

jQuery UI 및 부트 스트랩 행/패널을 사용하여 드래그 가능한 패널 세트를 만들려고합니다. 내가 주로 작동하는 뭔가가있어, 내 문제는 자리 표시자가 패널을 끌 때 올바르게 크기가 없다는 것입니다. 요소의 크기 대신 전체 행의 크기입니다.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

https://jsfiddle.net/zdfb3e0p/16/

나는 마진'에'.panel-placeholder'의'margin' 속성을 변경하여 바이올린의 CSS 편집 나를 위해. 또는 '여백 : 15px 1em 1em 15px;'를 사용할 수 있습니다.이 방법은 부트 스트랩의 여백과 패딩에 더 가깝습니다. –

답변

6

OpherV 솔루션 작동 모든 응답 모드에서이 테스트해야했다입니다. 그러나 여전히 작동하는 단순화 된 버전이 있으며 은 CSS 코드를 CSS 코드에 남겨 두어 번거 로움을으로 분리하려고합니다. js 코드 자체에 패딩/여백 상호 작용을 최소한으로 유지하려고했습니다.

아이디어는 내가 직접 .panel에서 widthheight을 얻을하고 col- 사업부에 모든 클래스이기 때문에 나는 복사, 동일합니다. 그러나 마진과 패딩은 CSS를 통해 부트 스트랩의 기본값과 일치하도록 설정됩니다.

아래 스 니펫이나 여기 jsfiddle에서 찾을 수 있습니다.`충분히 잘 작동하는 것 같다; 1em 1em 1em은 1em :

$('.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

우아한! 유일한주의 사항은 요소에 부트 스트랩 클래스 이외의 클래스가있는 경우입니다. 그러나 필터를 제거 할 수 있다고 생각합니다. – OpherV

+1

네, 솔직히 말해서 클래스 관리에 대한 해결책을 "총알 방지"라고 생각합니다. 그러나 OP는 단순한 해결책을 요구했기 때문에 나는 모래알로 공헌 할 수 있다고 생각했습니다. –

+1

나는 OpherV에게 그가 처음으로 해결책을 내놓았을 때 그 점을 수여했다. 나는 그것이 내가 결국 사용했던 해결책 인 것처럼 받아 들여진 대답을 당신에게주었습니다. –

2

부트 스트랩의 그리드 시스템의 기본값은 30px 패딩 (한 면당 15px)입니다. 너가 .row에 종류를 매고 있기 때문에 너는 그것을 위해 설명 할 필요가있다. margin 값을 .panel-placeholder에서 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

관련 문제