I made an HTML page that allows you to click a button to add row and column
division. At the moment, the row div
is added to the container
div. I want to switch from the standard div adding to one that is mouse-click driven. This means that when a user clicks
a button and selects a div
, a row block is appended to that div. Looking for a solution
var i = 0;
var j = 0;
let newColNode = null;
function addRow() {
const row = document.createElement('div');
row.className = 'bloc';
row.id = "b" + ++i;
document.getElementById('contentBox').append(row);
row.addEventListener('click', function(event) {
console.log(newColNode)
console.log(row)
if (newColNode != null)
row.appendChild(newColNode);
newColNode = null
});
}
// Column Addition
function addCol() {
const col = document.createElement('div');
col.className = 'bloc--inner';
col.id = "c" + ++j;
newColNode = col;
}
* {
box-sizing: border-box;
}
.wrapper {
float: left;
width: 100%;
height: 100vh;
}
body {
padding: 0;
margin: 0;
position: relative;
}
.main-content {
float: left;
width: calc(100%);
height: 100%;
background: #fafafa;
}
.header {
height: 60px;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 20px;
}
.content-box {
width: 100%;
height: calc(100% - 60px);
padding: 15px;
}
button {
background: #000;
border: 0;
padding: 0 20px;
height: 40px;
margin-left: 10px;
font-weight: 600;
color: white;
cursor: pointer;
}
.row-block {
width: 100%;
border: 2px dashed #848484;
padding: 20px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin-bottom: 20px;
}
.row-block:hover {
border-color: #2654d1;
}
.column-block {
position: relative;
width: 100%;
min-height: 1px;
padding-right: 10px;
padding-left: 10px;
margin: 0 10px;
-ms-flex-preferred-size: 0;
flex-basis: 0;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
max-width: 100%;
border: 2px dashed #848484;
background-color: #dedede;
padding: 20px;
}
.column-block:first-child {
margin-left: 0;
}
.column-block:last-child {
margin-right: 0;
}
.row-block .each-draggable-item {
position: relative;
width: 100%;
min-height: 1px;
padding-right: 10px;
padding-left: 10px;
-ms-flex-preferred-size: 0;
flex-basis: 0;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
max-width: 100%;
margin-bottom: 0;
}
.gu-mirror {
cursor: grabbing;
}
.container .ex-moved {
background-color: #e74c3c;
}
.container.ex-over {
background-color: rgba(255, 255, 255, 0.3);
}
.handle {
background-color: rgba(0, 0, 0, 0.4);
cursor: move;
margin-right: 5px;
padding: 0 5px;
}
.column-block h5 {
margin: 0;
}
/* .gu-mirror {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
position: fixed !important;
margin: 0 !important;
z-index: 9999 !important;
opacity: 1;
}
.gu-hide {
display: none !important;
}
.gu-unselectable {
-webkit-user-select: none !important;
-moz-user-select: none !important;
-ms-user-select: none !important;
user-select: none !important;
}
.gu-transit {
opacity: 0.4;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
filter: alpha(opacity=20);
} */
.gu-transit {
opacity: 0.4;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
filter: alpha(opacity=20);
transition: .3s ease-out;
}
.container {
width: 100%;
}
.bloc {
width: 100%;
border: 2px dashed #848484;
background: #ffefef;
margin-bottom: 20px;
padding: 20px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.bloc--inner {
margin: 0 10px;
-ms-flex-preferred-size: 0;
flex-basis: 0;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
max-width: 100%;
border: 2px dashed #848484;
background-color: #d4ecff;
padding: 20px;
}
.bloc--inner:first-child {
margin-left: 0;
}
.bloc--inner:last-child {
margin-right: 0;
}
.bloc--inner .bloc {
margin: 0;
}
<div class="wrapper">
<div class="main-content">
<div class="header">
<button class="add-row" onclick="addRow()">Add Row +</button>
<button class="add-column" onclick="addCol()">Add Column +</button>
</div>
<div class="content-box" id="main-container">
<div class="container" id="contentBox">
</div>
</div>
</div>
</div>
Thanks in advance!!
Currently the div is appedning to the container div
3
Answers
Is this what you want?
jsfiddle.net/tog40yaq/1
Is this more or less the intended result? Click on a
div
and then click on either button to add the appropriate element to the previously clickeddiv
?Perhaps I have this backwards – having re-read the question.
If the process is to be initialised using the button to determine what is to be added when the user clicks within the target area then perhaps this is better than the previous which does seem backwards to the perceived mode of operation.
Basically to get what you want, I added some states to the buttons that will enable / disable their functionality and just allow you to click where you want to add a row or col.