#css #flexbox
#css #flexbox
Вопрос:
Используя flexbox, я создал следующий макет для страницы профиля пользователя:
Как вы можете видеть, изображение выше, чем текст, к которому оно прикреплено.
Вместо этого я пытаюсь масштабировать его точно до размера текста слева от него:
html,
body {
height: 100%;
}
body {
margin: 0;
}
.padder-wrap {
background: black;
height: 100%;
width: 100%;
display: flex;
justify-content: center;
}
.padder-content {
background: grey;
display: flex;
padding: 1em;
}
.whoami {
display: flex;
}
.whoami-names {
display: flex;
flex-direction: column;
}
.avatar {
padding-left: 1em;
}
/* Decorative styles */
.padder-wrap {
font-size: 18pt;
font-family: sans-serif;
line-height: 1;
}
.realname {
font-size: 200%;
}
.nickname {
color: #333;
align-self: flex-end;
}
.social-links {
text-align: right;
padding-top: .3em;
}
.social-link {
max-width: 1em;
}
<div class='padder-wrap'>
<div class='padder-content'>
<div class='whoami'>
<div class='whoami-names'>
<div class='realname'>John Doe</div>
<div class='nickname'>johndoe</div>
<div class='social-links'>
<a href='https://linkedin.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
<a href='https://github.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
<a href='https://twitter.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
</div>
</div>
<div class='avatar'>
<img src='https://via.placeholder.com/150'>
</div>
</div>
</div>
</div>
Текущий код здесь: https://jsfiddle.net/x91jhp27/32 /
Попытки до сих пор:
До сих пор я пробовал много разных вещей, используя только <img>
тот же реквизит, что и при переносе <div>
.
По какой-то причине кажется, что контейнер avatar либо игнорирует height
, max-height
либо вычисляет их на основе окна просмотра, а не родительского. position: relative
это не исправлено.
Использование flex-basis: 0
with flex-grow: 1
(чтобы сделать изображение высотой 0, но позволить ему увеличиваться до заполнения) также не сработало, поскольку изображение просто сохраняет свой обычный размер.
Я могу заставить контейнер сжиматься overflow: hidden
, но по какой-то причине ширина контейнера остается неизменной, даже когда его высота уменьшается. На самом деле это было проблемой даже для создания желаемого выходного снимка экрана, поскольку, когда я вручную устанавливал высоты на определенные значения пикселей, родительский flexbox не уменьшался (в Chrome Devtools flexbox был намного больше суммы его дочерних элементов, как если бы он содержал ширину изображения напрямую и игнорировал контейнер аватара). Мне пришлось вручную сбросить ширину фонового контейнера, чтобы заставить его уменьшиться до нужного размера.
Ответ №1:
Это всегда интересная тема «как исправить высоту». Так как ваш выбор — не устанавливать фиксированную высоту в вашем контейнере .whoami
, что, очевидно, было бы самым простым способом.
Единственный способ, который я вижу, это использовать jQuery или JS для сбора высоты из `.whoami-names.
Итак, я получаю высоту каждого элемента из блока .whoami-names
, а затем добавляю его в avatar
контейнер с помощью jQuery.
Это «сложная» часть.
Затем в CSS для настройки отзывчивости изображения я просто добавляю, как показано ниже:
.avatar {
display:flex;
}
.avatar img{
margin:auto;
max-width:100%;
max-height: 100%;
}
ДЕМОНСТРАЦИЯ:
var realnameHeight = $('.realname').first().outerHeight();
var nicknameHeight = $('.nickname').first().outerHeight();
var socialLinkHeight = $('.social-links').first().outerHeight();
var totalHeightwhoamiNames = realnameHeight nicknameHeight socialLinkHeight;
totalHeightwhoamiNames = 'px';
$('.avatar').first().css('height', totalHeightwhoamiNames)
html,
body {
height: 100%;
}
body {
margin: 0;
}
.padder-wrap {
background: black;
height: 100%;
width: 100%;
display: flex;
justify-content: center;
}
.padder-content {
background: grey;
display: flex;
padding: 1em;
}
.whoami {
display: flex;
}
.whoami-names {
display: flex;
flex-direction: column;
}
.avatar {
padding-left: 1em;
display:flex;
}
.avatar img{
margin:auto;
max-width:100%;
max-height: 100%;
}
/* Decorative styles */
.padder-wrap {
font-size: 18pt;
font-family: sans-serif;
line-height: 1;
}
.realname {
font-size: 200%;
}
.nickname {
color: #333;
align-self: flex-end;
}
.social-links {
text-align: right;
padding-top: .3em;
}
.social-link {
max-width: 1em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='padder-wrap'>
<div class='padder-content'>
<div class='whoami'>
<div class='whoami-names'>
<div class='realname'>John Doe</div>
<div class='nickname'>johndoe</div>
<div class='social-links'>
<a href='https://linkedin.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
<a href='https://github.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
<a href='https://twitter.com'>
<svg class='social-link' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect fill="#ddd" width="100" height="100"/>
<text fill="rgba(0,0,0,0.5)" font-family="sans-serif" font-size="30" dy="10.5" font-weight="bold" x="50%" y="50%" text-anchor="middle">100×100</text>
</svg>
</a>
</div>
</div>
<div class='avatar'>
<img src='https://via.placeholder.com/150'>
</div>
</div>
</div>
</div>