Измените размер постоянно меняющегося изображения, чтобы соответствовать изменяющемуся размеру экрана, используя CSS - PullRequest
1 голос
/ 08 февраля 2020

У меня есть слайд-шоу изображений. Он состоит из нескольких компонентов:

  • Черный фон
  • Тонкая полоса в нижней части экрана, которая отображает заголовок текущего изображения (размер шрифта и вертикальные размеры в целом. не указано)
  • Кнопка для полноэкранного показа слайдов или выхода из полноэкранного режима, если она уже есть, размещенная на нижней панели
  • Набор из трех изображений на черном фоне, занимающий все доступное пространство сохраняя соотношение сторон.

Изображения располагаются друг над другом, перетасовывая между собой роли «спереди», «в середине» и «сзади». «Среднее» изображение имеет непрозрачность 1, остальные имеют непрозрачность 0. Каждые несколько секунд функция Javascript обозначает текущее «заднее» изображение как новое «среднее», а «среднее» изображение - как новое «переднее», соответственно изменяя их непрозрачность (переход CSS происходит в течение следующей секунды, превращая их друг в друга). Изображение, которое ранее находилось в «front», удаляется, а новое изображение загружается в «back» (путем непосредственного изменения атрибута src).

Я хочу, чтобы эти изображения заполняли весь текст доступного им пространства экрана - все, кроме этой нижней панели - при сохранении их аспекта rat ios. Какой размер является нижней границей размера изображения, определяет размер изображения. В то же время изображения должны быть центрированы в том направлении, в котором они не заполняются (т.е. горизонтально по центру для высоких изображений и вертикально по центру для широких изображений). Кроме того, изображения должны адаптироваться к изменяющемуся размеру экрана , предпочтительно , поскольку размер окна перетаскивается.

В настоящее время я использую длинную функцию Javascript для (1) найти доступное пространство, вычитая высоту нижней панели из высоты экрана, (2) вычисляя соотношение сторон изображения, (3) сравнивая, какой размер является ограничивающим фактором, и (4) изменяя размер и изменяя положение элемент соответственно. Эта функция запускается событием window.onresize и запускается вручную при каждом изменении изображения. Однако при нажатии и перетаскивании для изменения размера окна функция вызывается снова и снова. Это излишне сложное в вычислительном отношении, и я хотел бы вместо этого изменить размер в CSS, если это возможно.

Когда я столкнулся с этой проблемой для веб-сайта, который обычно отображает изображения, мое решение было calc() :

img.class {
    font-size:24pt; /* same font size as h1, which is the biggest title element. Used to calculate em */
    max-width: calc(100vw - 80px);  /* exactly enough to account for horizontal margins/padding */
    max-height: calc(100vh - 2em);  /* leave space for title but otherwise fill window */
}

Разница между этим и этим заключается в том, что ограничивающим фактором only был размер экрана, и я точно знал, насколько велики другие элементы, которые "должны" поместиться на экран был. Весь родительский элемент был центрирован (и, конечно, горизонтальное центрирование легко), и поскольку экран должен был прокручиваться, мне не пришлось беспокоиться о вертикальном центрировании. Так что это решение здесь не подлежит повторному использованию, я не думаю.

Интуитивно понятное решение, которое я пробовал, состояло в том, чтобы установить горизонтальное и вертикальное выравнивание в родительском <div> и установить max-width и max-height в терминах процентов (поскольку я не могу получить высоту другого элемента в CSS для математики):

#parent{
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    position: relative;
    padding: 0;
    margin: 0;
}

img {
    transition: opacity 1s;
    margin: auto;
    max-width: 100%;
    max-height: 100%;
}

Но это не только не отцентрировало изображения, но и вообще не показало их! Удаление max-width и max-height из <img> приводит к тому, что изображение появляется, но выходит за границы экрана и навигационной панели под ним, что тоже не то, что мне нужно. Как правильно выполнить sh эту задачу, используя CSS вместо длинного JavaScript?

1 Ответ

1 голос
/ 08 февраля 2020

Я думаю, что эта структура макета соответствует всем вашим требованиям. Здесь есть три изображения различного размера, я уменьшил непрозрачность, чтобы вы могли видеть, как все они масштабируются вместе

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>

        body {
            margin: 0;
        }

        .images {
            position: relative;
            height: 100%;
        }
    .image {
        position: absolute; 

        background-size: contain;
        background-repeat: no-repeat;
        background-position: center center;

        width: 100%;
        height: 100%;

        opacity: 0.5;

    }
    .image-container {
        position: relative;
        width: 100%;
        height: 100%;
    }
.container {
    display: flex;
    flex-direction: column;
    height: 100vh;
}

.footer {
    background-color: black;
    color: white;
    height: 50px;
    width: 100%;
    margin-top: auto;
}
    </style>
</head>
<body>
    <div class="container">
        <div class="images">
            <div class="image-container">
                <div class="image" style="background-image: url(https://unsplash.it/1000/425)"></div>
                <div class="image" style="background-image: url(https://unsplash.it/640/1000)"></div>
                <div class="image" style="background-image: url(https://unsplash.it/800/800)"></div>
            </div>
        </div>
        <div class="footer">Content</div>
    </div>
</body>
</html>
...