垂直滚动时标题几乎没有上下移动。我不能使用 CSS 粘性,因为我的父母有水平滚动。滚动页面(垂直)时,将标题位置保持在页面顶部。
可以吗?
const table = document.querySelector('.table');
const header = document.querySelector('.table header');
window.addEventListener('scroll', function() {
const tableRect = table.getBoundingClientRect();
const headerRect = header.getBoundingClientRect();
// Проверяем, когда шапка должна прилипнуть к верхней части экрана
if (tableRect.top < 0 && tableRect.bottom > headerRect.height) {
const topOffset = Math.abs(tableRect.top);
header.style.transform = `translateY(${topOffset}px)`; // Используем translateY для плавного перемещения
//header.classList.add('header-fixed'); // Добавляем класс при фиксации
} else {
header.style.transform = `translateY(0px)`; // Сброс перемещения
// header.classList.remove('header-fixed'); // Убираем класс, если шапка не фиксируется
}
});
.mobile-container {
background-color: ;
width: 30%;
border: 1px solid red;
display:flex;
flex-direction: column;
align-items: center;
position:relative;
}
h1 {
text-align: center;
}
.table {
display: grid; /* если поменять на table пропадает горизонтальный скрол, зато шапка таблицы фиксируется наверху */
overflow-x: auto;
border: 1px solid #DCDCDC;
border-radius: 0.5rem;
width: 90%;
box-sizing: border-box;
position: relative;
}
.table header {
height: 2.625rem;
display: grid;
padding: 0.6875rem 1.25rem;
color: #8C8C8C;
border-bottom: 1px solid #DCDCDC;
box-sizing: border-box;
background: #FAFAFA;
grid-template-columns: repeat(2, 15rem) repeat(2, 5rem);
white-space: nowrap;
column-gap: 1rem;
z-index:10;
top: 0;
position: sticky; /* Используем позицию sticky */
width: 100%;
/*transition: transform 0.16s linear, opacity 0.16s linear; */
div:nth-child(1) {
display: none;
}
}
.table main {
> div {
display: grid;
grid-template-columns: repeat(2, 15rem) 6rem;
row-gap: 0.25rem;
column-gap: 1rem;
padding: 0.5rem 1.25rem;
border: 1px solid #DCDCDC;
box-sizing: border-box;
div:first-child {
grid-column: 1 / -1;
position: sticky;
left: 1.25rem;
z-index: 1;
white-space: nowrap;
width: min-content;
}
}
}
<div class="mobile-container">
<h1>Мобильная версия</h1>
<div class="table">
<header>
<div>Название</div>
<div>Описание</div>
<div>Цена</div>
<div>Количество</div>
</header>
<main>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<div>
<div>Телевизор</div>
<div>Большой цветной телевизор</div>
<div>1000р</div>
<div>10 штук</div>
</div>
<main>
</div>
</div>
border
规则* {
margin: 0;
box-sizing: border-box;
}
.mobile-container {
width: 30%; /* DEMO ONLY */
height: 300px; /* DEMO ONLY */
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
text-align: center;
}
.table {
display: grid;
overflow: auto;
border: 1px solid #DCDCDC;
border-radius: 0.5rem;
width: 90%;
box-sizing: border-box;
position: relative;
}
.table header {
height: 2.625rem;
display: grid;
padding: 0.6875rem 1.25rem;
color: #8C8C8C;
border-bottom: 1px solid #DCDCDC;
box-sizing: border-box;
background: #FAFAFA;
grid-template-columns: repeat(2, 15rem) repeat(2, 5rem);
white-space: nowrap;
column-gap: 1rem;
z-index: 2;
top: 0;
position: sticky;
div:nth-child(1) {
display: none;
}
}
.table main {
>div {
display: grid;
grid-template-columns: repeat(2, 15rem) 6rem;
row-gap: 0.25rem;
column-gap: 1rem;
padding: 0.5rem 1.25rem;
border: 1px solid #DCDCDC;
border-width: 0 0 1px 0; /* Improved borders */
div:first-child {
grid-column: 1 / -1;
position: sticky;
left: 1.25rem;
z-index: 1;
white-space: nowrap;
width: min-content;
}
}
}
<div class="mobile-container">
<h1>Mobile version</h1>
<div class="table">
<header>
<div>Name</div>
<div>Description</div>
<div>Price</div>
<div>Quantity</div>
</header>
<main>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
<div>
<div>TV</div>
<div>Large color TV</div>
<div>1000 rubles</div>
<div>10 units</div>
</div>
</main>
</div>
</div>