Предполагая, что увеличенная ширина (вызванная наведением) всегда меньше ширины исходного элемента (до наведения), мы можем просто настроить его контейнер для добавления отступов. Имея этот отступ, контейнерный элемент может гарантировать, что вышеописанное поведение (то есть перенос элемента на следующую строку из-за добавленной ширины) не произойдет. Значение этого дополнительного отступа является точным значением увеличенного значения ширины. Добавленные отступы удаляются при наведении чипа (таким образом, позволяя ему красиво расширяться) и добавляются обратно, когда наведение чипа отсутствует. Это прекрасно работает, чтобы гарантировать, что расширение всегда может происходить без переноса элемента на следующую строку.
Работая на контейнере шириной 1567px
, я попробовал приведенный ниже код, и он прекрасно работает. Попробуйте отключить код JS и отрегулируйте поля так, чтобы последний элемент (chip
) в первой строке переносился во второй ряд при наведении курсора. Затем попробуйте снова включить код JS. Вот код:
const hoverWidthIncrease = (() => {
let aChip = document.querySelector('.chip')
let aChipExpand = aChip.querySelector('.chip--buttons')
let beforeExpandWidth = aChip.getBoundingClientRect().width
let afterExpandWidth
aChipExpand.style.display = 'inline' // Or whatever display it has
afterExpandWidth = aChip.getBoundingClientRect().width
aChipExpand.style.display = ''
return afterExpandWidth - beforeExpandWidth
})()
const container = document.querySelector('.container')
const chips = document.querySelectorAll('.chip')
container.style.paddingRight = `${hoverWidthIncrease}px`
chips.forEach(chip => {
chip.addEventListener('mouseover', e => {
container.style.paddingRight = '0px'
})
chip.addEventListener('mouseout', e => {
container.style.paddingRight = `${hoverWidthIncrease}px`
})
})
body {
font-family: sans-serif;
font-size: .75rem;
}
.container {
display: flex;
flex-wrap: wrap;
}
.chip {
border-radius: 30px;
margin: 10px;
padding: 15px;
background-color: #08112e;
color: white;
}
.chip--buttons {
color: #FFDDDDEE;
display: none;
}
.chip:hover .chip--buttons {
display: inline;
}
<div class = "container">
<div class = "chip">Tag Name asd <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name wefasd <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name asdfwew <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name asdf <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name asdfg <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name asdgcxz <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name jgh <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name ert <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name fghk <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name vbnm <span class = "chip--buttons">Expand</span></div>
<div class = "chip">Tag Name vbnmg <span class = "chip--buttons">Expand</span></div>
</div>