The columns
multicol attribute is a little underused, but still handy for certain situations where flexbox is less helpful but grid is overkill. Particularly if you want the rows of a column to have arbitrary heights, or in my main case, column-first rows with arbitrary #s of items.
However, I'm running into an issue where I'm trying to break a child element free from the column layout.
Is there a way to break out of the column
layout for children of elements inside the columns
node, or is the relative position of a child element of the column the biggest culprit?
If I were to switch to grid based display, could the child dropdown break out of the grid layout?
After a failed attempt and some googling (https://stackoverflow.com/a/44092580/3780922), the answer is no, grid
cannot solve this column first problem, even though it DOES let children break from the grid system.
In the Examples, you can see that without an empty transform: translate3d(0,0,0)
, the dropdown list will wrap to the next column, even if you use z-index and absolute positioning.
If you add the transform hack to create a totally new render context, it changes the root columns element's height/layout, and items not in the first column get clipped.
Examples: https://codepen.io/mix3d/pen/yLNpoMY and copied here: Note: Used Alpine.JS just to repeat items and add interactivity quickly, please do not add comments regarding that part of the template.
let items = (new Array(20)).fill(0).map((i, idx)=>({show:false, index:idx}))
items.push({show:false, index: "Super long title to show why I need this row for some reason."})
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
padding: 20px;
}
.columns {
background: #efefef;
columns: auto;
column-width: 200px;
column-gap: 2em;
padding: 12px;
overflow: show;
}
.key {
display: flex;
flex-direction: row;
break-inside: avoid;
margin-bottom: 0.75em;
align-items: flex-start;
}
label {
flex-grow: 1;
margin-right: 1em;
}
.v-select {
min-width: 93px;
}
.testing .vs__dropdown-menu {
transform: none;
}
/**From vue-select*/
.v-select {
position: relative;
font-family: inherit;
}
.v-select, .v-select * {
box-sizing: border-box;
}
.vs--disabled .vs__clear, .vs--disabled .vs__dropdown-toggle, .vs--disabled .vs__open-indicator, .vs--disabled .vs__search, .vs--disabled .vs__selected {
cursor: not-allowed;
background-color: #f8f8f8;
}
.v-select[dir=rtl] .vs__actions {
padding: 0 3px 0 6px;
}
.v-select[dir=rtl] .vs__clear {
margin-left: 6px;
margin-right: 0;
}
.v-select[dir=rtl] .vs__deselect {
margin-left: 0;
margin-right: 2px;
}
.v-select[dir=rtl] .vs__dropdown-menu {
text-align: right;
}
.vs__dropdown-toggle {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
display: flex;
padding: 0 0 4px;
background: none;
border: 1px solid rgba(60, 60, 60, 0.26);
border-radius: 4px;
white-space: normal;
}
.vs__selected-options {
display: flex;
flex-basis: 100%;
flex-grow: 1;
flex-wrap: wrap;
padding: 0 2px;
position: relative;
}
.vs__actions {
display: flex;
align-items: center;
padding: 4px 6px 0 3px;
}
.vs--searchable .vs__dropdown-toggle {
cursor: text;
}
.vs--unsearchable .vs__dropdown-toggle {
cursor: pointer;
}
.vs--open .vs__dropdown-toggle {
border-bottom-color: transparent;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.vs__open-indicator {
fill: rgba(60, 60, 60, 0.5);
-webkit-transform: scale(1);
transform: scale(1);
transition: -webkit-transform 0.15s cubic-bezier(1, -0.115, 0.975, 0.855);
transition: transform 0.15s cubic-bezier(1, -0.115, 0.975, 0.855);
transition: transform 0.15s cubic-bezier(1, -0.115, 0.975, 0.855), -webkit-transform 0.15s cubic-bezier(1, -0.115, 0.975, 0.855);
transition-timing-function: cubic-bezier(1, -0.115, 0.975, 0.855);
}
.vs--open .vs__open-indicator {
-webkit-transform: rotate(180deg) scale(1);
transform: rotate(180deg) scale(1);
}
.vs--loading .vs__open-indicator {
opacity: 0;
}
.vs__clear {
fill: rgba(60, 60, 60, 0.5);
padding: 0;
border: 0;
background-color: transparent;
cursor: pointer;
margin-right: 8px;
}
.vs__dropdown-menu {
display: block;
position: absolute;
top: calc(100% - 1px);
left: 0;
z-index: 1000;
padding: 5px 0;
margin: 0;
width: 100%;
max-height: 350px;
min-width: 160px;
overflow-y: auto;
box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.15);
border: 1px solid rgba(60, 60, 60, 0.26);
border-top-style: none;
border-radius: 0 0 4px 4px;
text-align: left;
list-style: none;
background: #fff;
transform: translate3d(0, 0, 0);
float: left;
}
.vs__no-options {
text-align: center;
}
.vs__dropdown-option {
line-height: 1.42857143;
display: block;
padding: 3px 20px;
clear: both;
color: #333;
white-space: nowrap;
}
.vs__dropdown-option:hover {
cursor: pointer;
}
.vs__dropdown-option--highlight {
background: #5897fb;
color: #fff;
}
.vs__selected {
display: flex;
align-items: center;
background-color: #f0f0f0;
border: 1px solid rgba(60, 60, 60, 0.26);
border-radius: 4px;
color: #333;
line-height: 1.4;
margin: 4px 2px 0;
padding: 0 0.25em;
}
.vs__deselect {
display: inline-flex;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
margin-left: 4px;
padding: 0;
border: 0;
cursor: pointer;
background: none;
fill: rgba(60, 60, 60, 0.5);
text-shadow: 0 1px 0 #fff;
}
.vs--single .vs__selected {
background-color: transparent;
border-color: transparent;
}
.vs--single.vs--open .vs__selected {
position: absolute;
opacity: 0.4;
}
.vs--single.vs--searching .vs__selected {
display: none;
}
.vs__search::-ms-clear, .vs__search::-webkit-search-cancel-button, .vs__search::-webkit-search-decoration, .vs__search::-webkit-search-results-button, .vs__search::-webkit-search-results-decoration {
display: none;
}
.vs__search, .vs__search:focus {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
line-height: 1.4;
font-size: 1em;
border: 1px solid transparent;
border-left: none;
outline: none;
margin: 4px 0 0;
padding: 0 7px;
background: none;
box-shadow: none;
width: 0;
max-width: 100%;
flex-grow: 1;
}
.vs__search::-webkit-input-placeholder {
color: inherit;
}
.vs__search:-ms-input-placeholder {
color: inherit;
}
.vs__search::-ms-input-placeholder {
color: inherit;
}
.vs__search::placeholder {
color: inherit;
}
.vs--unsearchable .vs__search {
opacity: 1;
}
.vs--unsearchable .vs__search:hover {
cursor: pointer;
}
.vs__spinner {
align-self: center;
opacity: 0;
font-size: 5px;
text-indent: -9999em;
overflow: hidden;
border: 0.9em solid rgba(100, 100, 100, 0.1);
border-left-color: rgba(60, 60, 60, 0.45);
-webkit-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: vSelectSpinner 1.1s linear infinite;
animation: vSelectSpinner 1.1s linear infinite;
transition: opacity 0.1s;
}
.vs__spinner, .vs__spinner:after {
border-radius: 50%;
width: 5em;
height: 5em;
}
.vs--loading .vs__spinner {
opacity: 1;
}
<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.js"></script>
<h4>Issues Example with Wrap Problem</h4>
<div class="columns testing" x-data="{items}">
<template x-for="item in items" :key="item">
<div class="key">
<label x-text="['label-'+item.index]">label</label>
<div dir="auto" class="v-select vs--single vs--unsearchable">
<div class="vs__dropdown-toggle" @click="item.show = !item.show">
<div class="vs__selected-options">
<span class="vs__selected">None</span>
<input readonly="readonly" aria-label="Search for option" role="combobox" type="search" autocomplete="off"
class="vs__search">
</div>
<div class="vs__actions">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="10" role="presentation"
class="vs__open-indicator">
<path
d="M9.211364 7.59931l4.48338-4.867229c.407008-.441854.407008-1.158247 0-1.60046l-.73712-.80023c-.407008-.441854-1.066904-.441854-1.474243 0L7 5.198617 2.51662.33139c-.407008-.441853-1.066904-.441853-1.474243 0l-.737121.80023c-.407008.441854-.407008 1.158248 0 1.600461l4.48338 4.867228L7 10l2.211364-2.40069z">
</path>
</svg>
</div>
</div>
<ul role="listbox" class="vs__dropdown-menu" x-show="item.show" @click="item.show = false">
<li role="option" class="vs__dropdown-option">
None
</li>
<li role="option" class="vs__dropdown-option">
0
</li>
<li role="option" class="vs__dropdown-option">
1
</li>
<li role="option" class="vs__dropdown-option">
2
</li>
<li role="option" class="vs__dropdown-option">
3
</li>
<li role="option" class="vs__dropdown-option">
4
</li>
<li role="option" class="vs__dropdown-option">
5
</li>
<li role="option" class="vs__dropdown-option">
6
</li>
<li role="option" class="vs__dropdown-option">
7
</li>
<li role="option" class="vs__dropdown-option">
8
</li>
<li role="option" class="vs__dropdown-option">
9
</li>
<li role="option" class="vs__dropdown-option">
A
</li>
<li role="option" class="vs__dropdown-option">
B
</li>
<li role="option" class="vs__dropdown-option">
C
</li>
<li role="option" class="vs__dropdown-option">
D
</li>
<li role="option" class="vs__dropdown-option">
E
</li>
<li role="option" class="vs__dropdown-option">
F
</li>
<li role="option" class="vs__dropdown-option">
G
</li>
<li role="option" class="vs__dropdown-option">
H
</li>
<li role="option" class="vs__dropdown-option">
I
</li>
<li role="option" class="vs__dropdown-option">
J
</li>
<li role="option" class="vs__dropdown-option">
K
</li>
<li role="option" class="vs__dropdown-option">
L
</li>
<li role="option" class="vs__dropdown-option">
M
</li>
<li role="option" class="vs__dropdown-option">
N
</li>
<li role="option" class="vs__dropdown-option">
O
</li>
<li role="option" class="vs__dropdown-option">
P
</li>
<li role="option" class="vs__dropdown-option">
Q
</li>
<li role="option" class="vs__dropdown-option">
R
</li>
<li role="option" class="vs__dropdown-option">
S
</li>
<li role="option" class="vs__dropdown-option">
T
</li>
<li role="option" class="vs__dropdown-option">
U
</li>
<li role="option" class="vs__dropdown-option">
V
</li>
<li role="option" class="vs__dropdown-option">
W
</li>
<li role="option" class="vs__dropdown-option">
X
</li>
<li role="option" class="vs__dropdown-option">
Y
</li>
<li role="option" class="vs__dropdown-option">
Z
</li>
<li role="option" class="vs__dropdown-option">
F1
</li>
<li role="option" class="vs__dropdown-option">
F2
</li>
<li role="option" class="vs__dropdown-option">
F3
</li>
<li role="option" class="vs__dropdown-option">
F4
</li>
<li role="option" class="vs__dropdown-option">
F5
</li>
<li role="option" class="vs__dropdown-option">
F6
</li>
<li role="option" class="vs__dropdown-option">
F7
</li>
<li role="option" class="vs__dropdown-option">
F8
</li>
<li role="option" class="vs__dropdown-option">
F9
</li>
<li role="option" class="vs__dropdown-option">
F10
</li>
<li role="option" class="vs__dropdown-option">
F11
</li>
<li role="option" class="vs__dropdown-option">
F12
</li>
<li role="option" class="vs__dropdown-option">
NumPad0
</li>
<li role="option" class="vs__dropdown-option">
NumPad1
</li>
<li role="option" class="vs__dropdown-option">
NumPad2
</li>
<li role="option" class="vs__dropdown-option">
NumPad3
</li>
<li role="option" class="vs__dropdown-option">
NumPad4
</li>
<li role="option" class="vs__dropdown-option">
NumPad5
</li>
<li role="option" class="vs__dropdown-option">
NumPad6
</li>
<li role="option" class="vs__dropdown-option">
NumPad7
</li>
<li role="option" class="vs__dropdown-option">
NumPad8
</li>
<li role="option" class="vs__dropdown-option">
NumPad9
</li>
<li role="option" class="vs__dropdown-option">
Left
</li>
<li role="option" class="vs__dropdown-option">
Right
</li>
<li role="option" class="vs__dropdown-option">
Up
</li>
<li role="option" class="vs__dropdown-option">
Down
</li>
<li role="option" class="vs__dropdown-option">
Delete
</li>
<li role="option" class="vs__dropdown-option">
Insert
</li>
<li role="option" class="vs__dropdown-option">
Home
</li>
<li role="option" class="vs__dropdown-option">
End
</li>
<li role="option" class="vs__dropdown-option">
PageDown
</li>
<li role="option" class="vs__dropdown-option">
PageUp
</li>
<li role="option" class="vs__dropdown-option">
Enter
</li>
<li role="option" class="vs__dropdown-option">
Escape
</li>
<li role="option" class="vs__dropdown-option">
Space
</li>
<li role="option" class="vs__dropdown-option">
Tab
</li>
<li role="option" class="vs__dropdown-option">
PrintScreen
</li>
</ul>
</div>
</div>
</template>
</div>
<br>
<br>
<h4>Issues Example with Using 3d Transform context</h4>
<div class="columns" x-data="{items}">
<template x-for="item in items" :key="item">
<div class="key">
<label x-text="['label-'+item.index]">label</label>
<div dir="auto" class="v-select vs--single vs--unsearchable">
<div class="vs__dropdown-toggle" @click="item.show = !item.show">
<div class="vs__selected-options">
<span class="vs__selected">None</span>
<input readonly="readonly" aria-label="Search for option" role="combobox" type="search" autocomplete="off"
class="vs__search">
</div>
<div class="vs__actions">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="10" role="presentation"
class="vs__open-indicator">
<path
d="M9.211364 7.59931l4.48338-4.867229c.407008-.441854.407008-1.158247 0-1.60046l-.73712-.80023c-.407008-.441854-1.066904-.441854-1.474243 0L7 5.198617 2.51662.33139c-.407008-.441853-1.066904-.441853-1.474243 0l-.737121.80023c-.407008.441854-.407008 1.158248 0 1.600461l4.48338 4.867228L7 10l2.211364-2.40069z">
</path>
</svg>
</div>
</div>
<ul role="listbox" class="vs__dropdown-menu" x-show="item.show" @click="item.show = false">
<li role="option" class="vs__dropdown-option">
None
</li>
<li role="option" class="vs__dropdown-option">
0
</li>
<li role="option" class="vs__dropdown-option">
1
</li>
<li role="option" class="vs__dropdown-option">
2
</li>
<li role="option" class="vs__dropdown-option">
3
</li>
<li role="option" class="vs__dropdown-option">
4
</li>
<li role="option" class="vs__dropdown-option">
5
</li>
<li role="option" class="vs__dropdown-option">
6
</li>
<li role="option" class="vs__dropdown-option">
7
</li>
<li role="option" class="vs__dropdown-option">
8
</li>
<li role="option" class="vs__dropdown-option">
9
</li>
<li role="option" class="vs__dropdown-option">
A
</li>
<li role="option" class="vs__dropdown-option">
B
</li>
<li role="option" class="vs__dropdown-option">
C
</li>
<li role="option" class="vs__dropdown-option">
D
</li>
<li role="option" class="vs__dropdown-option">
E
</li>
<li role="option" class="vs__dropdown-option">
F
</li>
<li role="option" class="vs__dropdown-option">
G
</li>
<li role="option" class="vs__dropdown-option">
H
</li>
<li role="option" class="vs__dropdown-option">
I
</li>
<li role="option" class="vs__dropdown-option">
J
</li>
<li role="option" class="vs__dropdown-option">
K
</li>
<li role="option" class="vs__dropdown-option">
L
</li>
<li role="option" class="vs__dropdown-option">
M
</li>
<li role="option" class="vs__dropdown-option">
N
</li>
<li role="option" class="vs__dropdown-option">
O
</li>
<li role="option" class="vs__dropdown-option">
P
</li>
<li role="option" class="vs__dropdown-option">
Q
</li>
<li role="option" class="vs__dropdown-option">
R
</li>
<li role="option" class="vs__dropdown-option">
S
</li>
<li role="option" class="vs__dropdown-option">
T
</li>
<li role="option" class="vs__dropdown-option">
U
</li>
<li role="option" class="vs__dropdown-option">
V
</li>
<li role="option" class="vs__dropdown-option">
W
</li>
<li role="option" class="vs__dropdown-option">
X
</li>
<li role="option" class="vs__dropdown-option">
Y
</li>
<li role="option" class="vs__dropdown-option">
Z
</li>
<li role="option" class="vs__dropdown-option">
F1
</li>
<li role="option" class="vs__dropdown-option">
F2
</li>
<li role="option" class="vs__dropdown-option">
F3
</li>
<li role="option" class="vs__dropdown-option">
F4
</li>
<li role="option" class="vs__dropdown-option">
F5
</li>
<li role="option" class="vs__dropdown-option">
F6
</li>
<li role="option" class="vs__dropdown-option">
F7
</li>
<li role="option" class="vs__dropdown-option">
F8
</li>
<li role="option" class="vs__dropdown-option">
F9
</li>
<li role="option" class="vs__dropdown-option">
F10
</li>
<li role="option" class="vs__dropdown-option">
F11
</li>
<li role="option" class="vs__dropdown-option">
F12
</li>
<li role="option" class="vs__dropdown-option">
NumPad0
</li>
<li role="option" class="vs__dropdown-option">
NumPad1
</li>
<li role="option" class="vs__dropdown-option">
NumPad2
</li>
<li role="option" class="vs__dropdown-option">
NumPad3
</li>
<li role="option" class="vs__dropdown-option">
NumPad4
</li>
<li role="option" class="vs__dropdown-option">
NumPad5
</li>
<li role="option" class="vs__dropdown-option">
NumPad6
</li>
<li role="option" class="vs__dropdown-option">
NumPad7
</li>
<li role="option" class="vs__dropdown-option">
NumPad8
</li>
<li role="option" class="vs__dropdown-option">
NumPad9
</li>
<li role="option" class="vs__dropdown-option">
Left
</li>
<li role="option" class="vs__dropdown-option">
Right
</li>
<li role="option" class="vs__dropdown-option">
Up
</li>
<li role="option" class="vs__dropdown-option">
Down
</li>
<li role="option" class="vs__dropdown-option">
Delete
</li>
<li role="option" class="vs__dropdown-option">
Insert
</li>
<li role="option" class="vs__dropdown-option">
Home
</li>
<li role="option" class="vs__dropdown-option">
End
</li>
<li role="option" class="vs__dropdown-option">
PageDown
</li>
<li role="option" class="vs__dropdown-option">
PageUp
</li>
<li role="option" class="vs__dropdown-option">
Enter
</li>
<li role="option" class="vs__dropdown-option">
Escape
</li>
<li role="option" class="vs__dropdown-option">
Space
</li>
<li role="option" class="vs__dropdown-option">
Tab
</li>
<li role="option" class="vs__dropdown-option">
PrintScreen
</li>
</ul>
</div>
</div>
</template>
</div>