Вопрос или проблема
На моем сайте я пытаюсь создать список плиток, каждая из которых имеет приложение:
body { background-color: gray; }
.tile {
width: 200px;
height: 250px;
white-space: nowrap;
overflow: hidden;
display: inline-block;
border: 5px solid white;
border-radius: 5px;
background-color: white;
margin: 50px;
text-wrap: wrap;
}
.tile:hover {
height: auto;
/* Показать описание */
scale: 105%;
cursor: pointer;
}
<div class="tile">Плитка 1</div>
<div class="tile">Плитка 2</div>
<div class="tile">Плитка 3</div>
<div class="tile">Плитка 4</div>
Когда вы наводите курсор на одну из этих плиток, она увеличивается и показывает описание (что увеличивает высоту). Однако при этом каждая другая плитка в списке прыгает, чтобы соответствовать новой высоте/выравниванию. Это довольно раздражает, и я хотел бы, чтобы этого не происходило. Как я могу сделать так, чтобы «соседние» плитки игнорировали выравнивание данной плитки?
</div><div class="s-prose js-post-body" itemprop="text">
Вот что вы пытаетесь достичь
- Обернуть все четыре плитки в родительский div
- Дать родителю класс
- Установить родителю display как flex и настроить свойства
body { background-color: gray; }
.parent {
display: flex;
flex-direction: row;
align-items: start;
}
.tile {
width: 200px;
height: 250px;
white-space: nowrap;
overflow: hidden;
display: inline-block;
border: 5px solid white;
border-radius: 5px;
background-color: white;
margin: 50px;
text-wrap: wrap;
}
.tile:hover {
height: auto;
/* Показать описание */
scale: 105%;
cursor: pointer;
}
<div class="parent">
<div class="tile">Lorem Ipsum - это просто фиктивный текст печатной и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом этой индустрии с 1500-х годов, когда неизвестный печатник взял набор и перемешал его, чтобы создать образец шрифта. Он выжил не только пять веков, но и переход в электронную верстку, оставаясь по сути неизменным. Он был популяризирован в 1960-х годах с выходом листов Letraset, содержащих фрагменты Lorem Ipsum, а также более недавно с программами настольной публикации, такими как Aldus PageMaker, включая версии Lorem Ipsum.</div>
<div class="tile">Lorem Ipsum - это просто фиктивный текст печатной и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом этой индустрии с 1500-х годов, когда неизвестный печатник взял набор и перемешал его, чтобы создать образец шрифта. Он выжил не только пять веков, но и переход в электронную верстку, оставаясь по сути неизменным. Он был популяризирован в 1960-х годах с выходом листов Letraset, содержащих фрагменты Lorem Ipsum, а также более недавно с программами настольной публикации, такими как Aldus PageMaker, включая версии Lorem Ipsum.</div>
<div class="tile">Lorem Ipsum - это просто фиктивный текст печатной и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом этой индустрии с 1500-х годов, когда неизвестный печатник взял набор и перемешал его, чтобы создать образец шрифта. Он выжил не только пять веков, но и переход в электронную верстку, оставаясь по сути неизменным. Он был популяризирован в 1960-х годах с выходом листов Letraset, содержащих фрагменты Lorem Ipsum, а также более недавно с программами настольной публикации, такими как Aldus PageMaker, включая версии Lorem Ipsum.</div>
<div class="tile">Lorem Ipsum - это просто фиктивный текст печатной и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом этой индустрии с 1500-х годов, когда неизвестный печатник взял набор и перемешал его, чтобы создать образец шрифта. Он выжил не только пять веков, но и переход в электронную верстку, оставаясь по сути неизменным. Он был популяризирован в 1960-х годах с выходом листов Letraset, содержащих фрагменты Lorem Ipsum, а также более недавно с программами настольной публикации, такими как Aldus PageMaker, включая версии Lorem Ipsum.</div>
</div>
Если вы используете flexbox и устанавливаете align-items: start
, другие плитки в том же ряду не будут смещаться, когда вы наводите курсор на плитку. Однако плитки в последующих рядах все равно будут смещаться вниз. Это тот эффект, который вы ищете?
body {
margin: 50px;
background-color: gray;
display: flex;
flex-wrap: wrap;
gap: 50px;
align-items: start;
}
.tile {
width: 200px;
border: 5px solid white;
border-radius: 5px;
background-color: white;
transition: 250ms;
padding: 1em;
box-sizing: border-box;
}
.tile > h4 {
margin: 0;
}
.tile > p {
display: none;
margin-bottom: 0;
}
.tile:hover {
cursor: pointer;
}
.tile:hover > p {
display: block;
}
<div class="tile">
<h4>Плитка 1</h4>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempor nunc mauris, sit amet placerat tortor lobortis dapibus.</p>
</div>
<div class="tile">
<h4>Плитка 2</h4>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempor nunc mauris, sit amet placerat tortor lobortis dapibus.</p>
</div>
<div class="tile">
<h4>Плитка 3</h4>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempor nunc mauris, sit amet placerat tortor lobortis dapibus.</p>
</div>
<div class="tile">
<h4>Плитка 4</h4>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempor nunc mauris, sit amet placerat tortor lobortis dapibus.</p>
</div>
.
Ответ или решение
Как избежать изменения выравнивания соседних элементов при наведении на элемент на веб-сайте
На вашем веб-сайте, вы столкнулись с проблемой, когда при наведении курсора на один из элементов (плиток) он увеличивается по высоте, и это вызывает смещение других элементов в ряде. Это может негативно сказываться на опыте взаимодействия пользователей с вашим сайтом. К счастью, есть несколько способов решения этой проблемы с помощью CSS.
Решение
Для того чтобы избежать смещения соседних элементов при наведении на одну плитку, вы можете использовать CSS Flexbox. Flexbox позволяет легко управлять расположением элементов и их свойствами, что в данном случае является идеальным решением.
Шаги по реализации
-
Обертка для плиток: Всегда начинайте с оборачивания всех ваших плиток в родительский контейнер. Это позволит применить к ним свойства flexbox.
-
Настройка стилей родительского контейнера: Примените к родительскому контейнеру CSS-свойства flexbox.
-
Изменение стилей плиток: Настройте стили плиток, чтобы они не смещались друг относительно друга.
Пример реализации
Вот код, который решает вашу проблему:
<div class="parent">
<div class="tile">
<h4>Плитка 1</h4>
<p>Описание для плитки 1.</p>
</div>
<div class="tile">
<h4>Плитка 2</h4>
<p>Описание для плитки 2.</p>
</div>
<div class="tile">
<h4>Плитка 3</h4>
<p>Описание для плитки 3.</p>
</div>
<div class="tile">
<h4>Плитка 4</h4>
<p>Описание для плитки 4.</p>
</div>
</div>
body {
background-color: gray;
display: flex;
flex-wrap: wrap;
gap: 50px;
margin: 50px;
}
.parent {
display: flex;
flex-direction: row;
align-items: flex-start;
}
.tile {
width: 200px;
border: 5px solid white;
border-radius: 5px;
background-color: white;
transition: height 0.25s ease;
padding: 1em;
box-sizing: border-box;
}
.tile > h4 {
margin: 0;
}
.tile > p {
display: none;
margin-bottom: 0;
}
.tile:hover {
cursor: pointer;
}
.tile:hover > p {
display: block;
}
Объяснение кода
-
display: flex;
— Применяя это к родительскому контейнеру, мы превращаем его в flex-контейнер, что позволяет удобно управлять расположением дочерних плиток. -
align-items: flex-start;
— Устанавливает выравнивание дочерних элементов по верхнему краю. Это предотвратит их смещение при наведении на один из них. -
transition: height 0.25s ease;
— Добавляет плавный переход для изменения высоты плитки, что улучшает пользовательский интерфейс. -
Скрытие и отображение описания — Используя свойство
display
, мы скрываем описание по умолчанию и показываем его при наведении.
Заключение
Использование flexbox — это эффективный способ предотвратить смещение соседних элементов при наведении на один из них. Это не только улучшает восприятие вашего веб-сайта, но и делает его более профессиональным и удобным для пользователя.
Убедитесь, что структура кода и стили поддерживают согласованность вашего дизайна. Если у вас есть дополнительные вопросы или вам необходимо детализированное объяснение процесса, не стесняйтесь обращаться за помощью.