Для элемента просто не хватает места для изображения (без переноса).«Сумасшедшие прыжки» не такие уж сумасшедшие, если вы об этом думаете:
- вы зависаете и
onmouseover
запускается - изображение добавляется и элемент списка переносится
- из-за нехватки места это вызывает событие
onmouseleave
(мышь больше не зависает) - изображение удаляется, и элемент возвращается на место
- и снова и снова ...
Для предотвращения упаковки элементов удалите flex-wrap: wrap;
из списка.Но это может означать, что элементы не помещаются в контейнер.
В качестве альтернативы вы всегда можете зарезервировать место для изображения.Это означает, что вы всегда визуализируете изображение, скрываете его по умолчанию и показываете его при наведении.В приведенном ниже примере для отображения / скрытия изображения используется курсор мыши:
let ul = document.getElementById("fileList");
// Create new list item
let listItem = document.createElement("li");
listItem.textContent = "Crazy jumping";
// Create remove icon
let removeIcon = document.createElement("img");
removeIcon.classList.add("removeIcon");
removeIcon.setAttribute("id", "remove");
removeIcon.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARElEQVR42mNgGAVUAApAfB+I/6Ph+1A5ssB/MvHgsYAugOauH7Vg1IJRC0YtIAI8IsHwR+RY4AHEj4kw/DFU7SggDwAAyTHHV/YXjncAAAAASUVORK5CYII=");
// Append items
listItem.appendChild(removeIcon);
ul.appendChild(listItem);
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333;
display: flex;
align-items: center;
flex-wrap: wrap;
}
li {
display: flex;
font-family: sans-serif;
background-color: gold;
float: left;
padding: 8px;
margin-right: 8px;
margin-bottom: 8px;
border-radius: 10px;
text-align: center;
align-items: center;
}
li:hover {
background-color: #FFFFFF;
}
li:hover .removeIcon {
visibility: visible;
}
.removeIcon {
visibility: hidden;
}
<ul class="fileList" id="fileList">
<li>
<span class="text">Home</span>
</li>
<li>
<span class="text">Home2</span>
</li>
<li>
<span class="text">Home3</span>
</li>
<li>
<span class="text">Home4</span>
</li>
<li>
<span class="text">Home5</span>
</li>
<li>
<span class="text">Home6Bigger</span>
</li>
</ul>
Редактировать:
Кажется нелогичным говорить "когда мышьесли элемент не переносится, просто переполнится "или что-то в этом роде.
Как я уже говорил, удалите flex-wrap: wrap
из списка, чтобы предотвратить его перенос.Вы также можете предотвратить перенос текста, добавив white-space: nowrap
(см. Пример ниже).
Разве невозможно установить свойство в onmouseover?Вопрос также будет в том, какое свойство?
Я рекомендую использовать CSS для стилей вместо JavaScript, где это возможно, например, для скрытия при наведении и т. Д. (Как пример выше). Но изКонечно, вы можете использовать события onmouseover
и onmouseleave
для переключения класса removeIconVisible
:
let ul = document.getElementById("fileList");
// Create new list item
let listItem = document.createElement("li");
listItem.textContent = "Crazy jumping";
// Create remove icon
let removeIcon = document.createElement("img");
removeIcon.classList.add("removeIcon");
removeIcon.setAttribute("id", "remove");
removeIcon.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARElEQVR42mNgGAVUAApAfB+I/6Ph+1A5ssB/MvHgsYAugOauH7Vg1IJRC0YtIAI8IsHwR+RY4AHEj4kw/DFU7SggDwAAyTHHV/YXjncAAAAASUVORK5CYII=");
listItem.onmouseover = function () {
removeIcon.classList.add("removeIconVisible");
};
listItem.onmouseleave = function () {
removeIcon.classList.remove("removeIconVisible");
};
// Append items
listItem.appendChild(removeIcon);
ul.appendChild(listItem);
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333;
display: flex;
align-items: center;
/*flex-wrap: wrap;*/
white-space: nowrap;
}
li {
display: flex;
font-family: sans-serif;
background-color: gold;
float: left;
padding: 8px;
margin-right: 8px;
margin-bottom: 8px;
border-radius: 10px;
text-align: center;
align-items: center;
}
li:hover {
background-color: #FFFFFF;
}
.removeIcon {
display: none;
visibility: collapse;
}
.removeIconVisible {
display: flex;
visibility: visible;
}
<ul class="fileList" id="fileList">
<li>
<span class="text">Home</span>
</li>
<li>
<span class="text">Home2</span>
</li>
<li>
<span class="text">Home3</span>
</li>
<li>
<span class="text">Home4</span>
</li>
<li>
<span class="text">Home5</span>
</li>
<li>
<span class="text">Home6Bigger</span>
</li>
</ul>
Альтернатива
Вы также можете расположить значок абсолютно, поместив его над (маскируя) текстомпри наведенииЭто предотвратит переполнение и переполнение элемента.
li {
position: relative;
}
li:hover .removeIcon {
background-color: white;
position: absolute;
right: 2px;
}