Reputation: 2346
I'm currently working on a project where I have to build a large-data table using <div>
elements. I won't use semantic <table>
(it's for some personal project and lab).
I did succeed with the main table structure, using the useful display: table
property but I'm encountering some difficulties when I try to apply CSS border style to the cells (fiddle link at the end of this post). The cell's width and height are increasing and I'm not able to avoid it playing out with the border properties.
HTML
<!-- Main Container -->
<div class="main-container">
<!-- Table container (where the display: table is applied) -->
<div class="table-container">
<!-- First row -->
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<!-- Second row -->
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<!-- Third row -->
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
</div>
</div>
CSS
body {
font-family: "Helvetica", "Open-sans", "sans-serif";
}
.main-container {
height: 200px;
overflow-y: auto;
}
.table-container {
display: table;
border: 1px solid #666666;
border-spacing: 5px;
border-collapse: collapse;
font-size: 13px;
}
.table-row {
display: table-row;
width: auto;
}
.table-cell {
display: table-cell;
min-width: 100px;
padding-left: 3px;
height: 100%;
height: 30px;
vertical-align: middle;
border: 1px solid #dde1e3;
overflow: visible;
}
.selected {
display: inline-block;
border: 1px solid #00b9e6 !important;
z-index: 100000 !important;
background: #EBF7FF !important;
}
JS
$(".table-cell").click(function() {
$(".selected").removeClass("selected");
$(this).addClass("selected");
});
Here is the fiddle: https://jsfiddle.net/Lc0rE/9ntxmLk4/
Can you please help me to understand how to avoid to change both width and height of the cell I'm clicking on?
Upvotes: 1
Views: 218
Reputation: 9329
I agree with @lonut but also, have you thought about not using a border? Here is an example using box-shadow: inset ...
. The benefit is, its a shadow, not a border, so it doesn't take up any of the space of the cell, which may be useful for not messing with the position of any text.
It's purely presentational rather than affecting the way the cell displays.
Code:
.selected{
box-shadow: inset 0 0 0 3px #ff0000;
}
So that means:
inset
– shadow the interior rather than the exterior0
– pixels on the x axis, so line up with the element0
– pixels on the y axis, so line up with the element0
- blur, so have a solid appearance 3px
- spread, so fill 3px (you can think of this in your case as border-width
)#ff0000
- make the box-shadow redHere is a working example:
https://jsfiddle.net/9ntxmLk4/1/
Upvotes: 1
Reputation: 11482
Use box-sizing: border-box;
on .selected
. It's a miracle worker:
$(".table-cell").click(function() {
$(".selected").removeClass("selected");
$(this).addClass("selected");
});
body {
font-family: "Helvetica", "Open-sans", "sans-serif";
}
.main-container {
height: 200px;
overflow-y: auto;
}
.table-container {
display: table;
border: 1px solid #666666;
border-spacing: 5px;
border-collapse: collapse;
font-size: 13px;
}
.table-row {
display: table-row;
width: auto;
}
.table-cell {
display: table-cell;
min-width: 100px;
padding-left: 3px;
height: 100%;
height: 30px;
vertical-align: middle;
border: 1px solid #dde1e3;
overflow: visible;
}
.table-header {
font-weight: bold;
}
.selected {
display: inline-block;
border: 1px solid #00b9e6 !important;
z-index: 100000 !important;
background: #EBF7FF !important;
box-sizing: border-box;
}
.selected-remove-border {
border: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main-container">
<div class="table-container">
<div class="table-row table-header">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
<div class="table-row">
<div class="table-cell">
<span>Table cell</span>
<div class="draggable-container">
<div class="draggable-bar"></div>
</div>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
<div class="table-cell">
<span>Table cell</span>
</div>
</div>
</div>
</div>
Upvotes: 1