Сьезжает DIV с position:absolute при масштабировании
Я относительно недавно начал изучать css и html и столкнулся с одной проблемой: при уменьшении масштаба страницы у меня сьезжает блок c текстом GO AHEAD с абсолютным позиционированием. Свойству left и bottom прописал значение в процентах, но с уменьшением масштаба он все равно сьезжает по-тихоньку вправо. Подскажите пожалуйста решение данной проблемы, чтобы блок при изменения масштаба оставался в такой же позиции, в которой был вначале.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ScreenDesign</title>
<link rel="stylesheet" href="style.css">
<link href="https://fonts.googleapis.com/css2?family=Quicksand&family=Rokkitt&display=swap" rel="stylesheet">
</head>
<body>
<header class="header">
<div class="container">
<div class="header-intro">
<div class="logo"> Logo
</div>
<nav class="nav">
<a class="nav-links" href="#">Start</a>
<a class="nav-links" href="#">About me</a>
<a class="nav-links" href="#">Work</a>
<a class="nav-links" href="#">Contact</a>
</nav>
</div>
<div class="section2">
<div class="header-title">
<div class="header-title-item">
<h1 class="title-text">May I introduce myself?</h1>
</div>
<div class="header-subtitle-item">
<h2 class="subtitle-text">Frontend Design | UI/UX Design
</h2>
</div>
</div>
<a class="header-link" href="#">
<div class="header-button">
<div class="header-button-text">Go ahead
</div>
</div>
</a>
</div>
</div>
</header>
</body>
</html>
html {
font-size: 15px;
}
body {
margin: 0;
font-family: 'Quicksand', sans-serif;
font-family: 'Rokkitt', serif;
font-family: 'Myriad Pro', sans-serif;
font-size: 1rem;
line-height: 1;
background-color: white;
}
*,
*:before,
*:after {
box-sizing: border-box;
}
h1, h2, h3, h4, h5, h6 {
margin: 0;
}
p {
margin: 0;
}
.container {
width: 100%;
max-width: 1020px;
margin: 0 auto;
padding-top: 58px;
padding-right: 30px;
padding-left: 30px;
}
.header {
width: 100%;
height: 500px;
background: url(img/header.jpg) center no-repeat;
background-size: cover;
}
.section2 {
position: relative;
}
.header-intro {
display: flex;
align-items: center;
justify-content: space-between;
}
.logo {
text-transform: uppercase;
color: white;
font-family: 'Myriad Pro', sans-serif;
font-stretch: condensed;
font-size: 20px;
}
.nav-links {
text-decoration: none;
text-transform: uppercase;
color: white;
font-size: 19px;
font-family: 'Myriad Pro', sans-serif;
font-stretch: condensed;
margin: 0 15px;
transition: color 0.2s linear;
}
.nav-links:hover {
color: #1abc9c;
}
.header-title {
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
margin-top: 150px;
color: white;
}
.title-text {
font-family: 'Rokkitt', serif;
font-weight: normal;
font-size: 60px;
padding: 0 35px 10px 35px;
border-bottom: 1px solid white;
}
.subtitle-text {
font-family: 'Quicksand', sans-serif;
font-weight: normal;
margin-top: 15px;
}
.header-button {
text-decoration: none;
position: absolute;
bottom: -180%;
left: 38%;
width: 100%;
max-width: 220px;
height: 100%;
max-height: 60px;
background-color: rgba(26, 188, 156, 0.4);
margin: 0;
padding: 0;
}
.header-link {
text-decoration: none;
}
.header-button-text {
background-color: #1abc9c;
margin: 8px 8px 8px 8px;
padding: 10px 25px;
font-family: 'Rokkitt', serif;
font-size: 24px;
text-align: center;
text-transform: uppercase;
color: white;}
Ответы (3 шт):
А зачем вам нужен именно position:absolution? Если его убрать и применить стиль margin: 0 auto; к элементу .header-button, то этот элемент будет центрироваться автоматически, независимо от изменения размеров родителя.
Если позволите, несколько советов:
- Лучше избегать позиционирования в стиле
left: 10px, right -15px, bottom: 123.7px(все вместе) и так далее. Эти решения не ситуативны, то есть при изменении макета все может "поехать". Сейчас очень много технологий, которые позволяют верстать блоками: flex (который вы используете), grid, где позиционирование указывается лаконичнее. - стили
margin: 8px 8px 8px 8px;для лучшей читаемости можно заменить наmargin: 8px; - С точки зрения семантики будет правильней тег
<a>поместить внутрь блочного тега<div>. Функционал не пострадает, зато подобные решения в будущем помогут избежать головной боли :)
<a class="header-link" href="#">
<div class="header-button">
<div class="header-button-text">Go ahead
</div>
</div>
</a>
//почему не так?
<div class="header-button">
<a class="header-link" href="#">Go ahead</a>
</div>
Помещать тег a внутрь div - невалидно, нельзя блочный элемент помещать в строчный, даже если это переопределено стилями.
Размещать кнопку по центру вероятно правильней через центрирование либо внутри flex-контейнера, либо как inline-block и центрирование текста.
*,
*:before,
*:after {
box-sizing: border-box;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
}
p {
margin: 0;
}
.container {
width: 100%;
max-width: 1020px;
margin: 0 auto;
padding-top: 58px;
padding-right: 30px;
padding-left: 30px;
}
.header {
width: 100%;
background: black;
background-size: cover;
position: relative;
/* чтобы опустить кнопку относительно этого блока */
/* height: 500px; - не стоит ограничивать высоту, на мобильных контент попадет за пределы блока, лучше добавить отступ снизу */
padding-bottom: 5rem;
}
.section2 {
position: relative;
}
.header-intro {
display: flex;
align-items: center;
justify-content: space-between;
}
.logo {
text-transform: uppercase;
color: white;
font-family: 'Myriad Pro', sans-serif;
font-stretch: condensed;
font-size: 20px;
}
.nav-links {
text-decoration: none;
text-transform: uppercase;
color: white;
font-size: 19px;
font-family: 'Myriad Pro', sans-serif;
font-stretch: condensed;
margin: 0 15px;
transition: color 0.2s linear;
}
.nav-links:hover {
color: #1abc9c;
}
.header-title {
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
margin-top: 150px;
color: white;
}
.title-text {
font-family: 'Rokkitt', serif;
font-weight: normal;
font-size: 60px;
padding: 0 35px 10px 35px;
border-bottom: 1px solid white;
}
.subtitle-text {
font-family: 'Quicksand', sans-serif;
font-weight: normal;
margin-top: 15px;
}
.header-button {
text-align: center;
position: absolute;
left: 0;
right: 0;
/* чтобы половина кнопки была ниже блока*/
bottom: 0;
transform: translateY(50%);
/* фиксированная высота и ширина кнопке не нужна - ее размеры задаются динамичеки, шрифтом и отступами */
}
.header-link {
text-decoration: none;
background-color: rgba(26, 188, 156, 0.4);
display: inline-block;
}
.header-button-text {
background-color: #1abc9c;
margin: 8px;
padding: 10px 25px;
font-family: 'Rokkitt', serif;
font-size: 24px;
text-align: center;
text-transform: uppercase;
color: white;
}
<header class="header">
<div class="container">
<div class="header-intro">
<div class="logo"> Logo
</div>
<nav class="nav">
<a class="nav-links" href="#">Start</a>
<a class="nav-links" href="#">About me</a>
<a class="nav-links" href="#">Work</a>
<a class="nav-links" href="#">Contact</a>
</nav>
</div>
<div class="section2">
<div class="header-title">
<div class="header-title-item">
<h1 class="title-text">May I introduce myself?</h1>
</div>
<div class="header-subtitle-item">
<h2 class="subtitle-text">Frontend Design | UI/UX Design
</h2>
</div>
</div>
</div>
<div class="header-button">
<a class="header-link" href="#">
<div class="header-button-text">
Go ahead
</div>
</a>
</div>
</div>
</header>

