Некоторый контекст о моем приложении:
Я использую простой шаблон создания-реагирования-приложения и имею список кнопок, каждая кнопка имеет значок закрытия и текст. При нажатии на значок закрытия кнопка удаляется из списка.
CSS Эффекты: я применяю эффект линейного эффекта к кнопке при наведении курсора.
Проблема:
Вкл. ios safari / chrome, если я уберу первую кнопку; эффект наведения добавлен ко второй кнопке. Этого не происходит в Android Chrome.
GIF для проблемы:
Код, связанный с проблемой :
Компонент:
export default function App() {
const [items, updateItem] = React.useState(["apple", "ball", "cat"]);
const removeItem = itemToBeRemoved => {
updateItem(currentItems =>
currentItems.filter(currentItem => !currentItem.includes(itemToBeRemoved))
);
};
return (
<div className="filters">
{items.map(item => (
<a key={item}>
<span onClick={() => removeItem(item)}>✕</span>
<span>{item}</span>
</a>
))}
</div>
);
}
Стили:
.filters {
margin: 0 -3px;
max-width: 100%;
}
a {
display: inline-flex;
justify-content: center;
align-items: center;
border-radius: 3px;
border: 1px solid transparent;
min-height: 30px;
word-wrap: break-word;
padding: 5px 12px;
line-height: 1.2rem;
background-color: #eee;
cursor: pointer;
user-select: none;
transition: all 0.3s ease;
margin: 2px 3px;
padding: 5px 8px;
font-size: 0.85rem;
}
a:hover,
a:focus {
background-color: #ccc;
}
a:focus {
outline: 0;
border-color: 1px solid blue;
box-shadow: 0 0 0 2px #0000ff;
}
a span:first-child {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
a span:last-child {
display: flex;
height: 100%;
top: 0;
align-items: center;
border-left: 1px solid gray;
padding-left: 8px;
margin-left: 8px;
}
a:hover span:last-child,
a:focus span:last-child {
text-decoration: line-through;
}
Codesandbox Ссылка: https://codesandbox.io/s/suspicious-swanson-o5jgi
Мое понимание:
Safari предполагает, что указатель остается на том же месте до следующего нажатия (в другом месте), т.е. почему мы видим состояние наведения на следующей кнопке. Дайте мне знать, если я ошибаюсь.