box-shadow обрезается если у элемента списка overflow:scroll
Если ограничена высота списка и установлено overflow:scroll, тень обрезается снизу и сверху всего списка и у каждого элемента справа и слева
https://codepen.io/JuliaGinkul/pen/XWEQBGP
.Container {
position: relative;
}
.Select {
position: absolute;
top: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
min-width: 160px;
width: 249px;
display: inline-block;
vertical-align: middle;
z-index: 1;
}
.Menu {
border: 1px solid gray;
list-style-type: none;
padding-left: 0;
border-radius: 4.44px;
margin: 0;
max-height: 128px;
overflow-y: scroll;
}
.Item {
font-weight: 400;
font-size: 14px;
color: grey;
padding: 7px 10px;
border-bottom: 1px solid #000;
cursor: pointer;
display: flex;
align-items: center;
}
.Item:last-child {
border-bottom: 0;
}
.Item:hover {
box-shadow: 0 0 0 3px blue;
color: #000;
border-radius: 4.44px;
}
<div class="Container">
<div class="Select">
<ul class="Menu">
<li class="Item">пункт 1</li>
<li class="Item">пункт 2</li>
<li class="Item">пункт 3</li>
<li class="Item">пункт 4</li>
<li class="Item">пункт 5</li>
<li class="Item">пункт 6</li>
<li class="Item">пункт 7</li>
</ul>
</div>
</div>
Ответы (2 шт):
Автор решения: soledar10
→ Ссылка
.Menu --> padding: 3px;, т.к box-shadow: 0 0 0 3px blue;
Пример
.Container {
position: relative;
}
.Select {
position: absolute;
top: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
min-width: 160px;
width: 249px;
display: inline-block;
vertical-align: middle;
z-index: 1;
}
.Menu {
border: 1px solid gray;
list-style-type: none;
padding-left: 0;
border-radius: 4.44px;
margin: 0;
max-height: 128px;
overflow-y: scroll;
padding: 3px;
}
.Item {
font-weight: 400;
font-size: 14px;
color: grey;
padding: 7px 10px;
cursor: pointer;
display: flex;
align-items: center;
position: relative;
}
.Item+.Item::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: calc(100% + 6px);
margin-left: -3px;
height: 1px;
background-color: #000;
}
.Item:last-child {
border-bottom: 0;
}
.Item::before {
content: '';
position: absolute;
top: 0;
left: -1px;
width: 100%;
height: 100%;
box-shadow: 0 0 0 3px blue;
border-radius: 2px;
pointer-events: none;
opacity: 0;
transition: opacity .3s ease;
}
.Item:hover {
color: #000;
}
.Item:hover::before {
opacity: 1;
}
<div class="Container">
<div class="Select">
<ul class="Menu">
<li class="Item">пункт 1</li>
<li class="Item">пункт 2</li>
<li class="Item">пункт 3</li>
<li class="Item">пункт 4</li>
<li class="Item">пункт 5</li>
<li class="Item">пункт 6</li>
<li class="Item">пункт 7</li>
</ul>
</div>
</div>
Автор решения: Инквизитор
→ Ссылка
так и должно быть. Overflow, который обрезает по размеру элемента (hidden/scroll/auto) обрежет и тень.
вариант 1 - изображать что-то похожее, городя жуть на css и js. желаемый вами результат точно стоит этих извращений?
вариант 2 - сделать паддинги LI-шкам, а тени применять к внутреннему элементу:
.Container {
position: relative;
}
.Select {
position: absolute;
top: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
min-width: 160px;
width: 249px;
display: inline-block;
vertical-align: middle;
z-index: 1;
}
.Menu {
border: 1px solid gray;
list-style-type: none;
padding-left: 0;
border-radius: 4.44px;
margin: 0;
max-height: 128px;
overflow-y: scroll;
}
.Item {
font-weight: 400;
font-size: 14px;
color: grey;
padding: 3px;
cursor: pointer;
display: flex;
align-items: center;
}
.Item div {
padding: 7px 10px;
border-bottom: 1px solid #000;
width: 100%;
}
.Item:last-child {
border-bottom: 0;
}
.Item:hover div {
box-shadow: 0 0 0 3px blue;
color: #000;
border-radius: 4.44px;
}
<div class="Container">
<div class="Select">
<ul class="Menu">
<li class="Item">
<div>пункт 1</div>
</li>
<li class="Item">
<div>пункт 2</div>
</li>
<li class="Item">
<div>пункт 3</div>
</li>
<li class="Item">
<div>пункт 4</div>
</li>
<li class="Item">
<div>пункт 5</div>
</li>
<li class="Item">
<div>пункт 6</div>
</li>
<li class="Item">
<div>пункт 7</div>
</li>
</ul>
</div>
</div>