2015-09-11 2 views
8

Проблемы Резюме

Мой желаемый макета должна быть в состоянии к центру (как по вертикали, так и по горизонтали) изображения неизвестного размера на этой странице. Если изображение слишком велико, чтобы вписаться в любом направлении, я хочу показать полосы прокрутки, чтобы пользователь мог прокрутить, чтобы увидеть полное изображение. Проблема, с которой я столкнулся, заключается в том, что, когда изображение слишком велико, чтобы соответствовать, верхнее и левое изображение (в зависимости от того, какая часть отключена) никогда не смогут прокручиваться.Центрирования Элементы с Flexbox и переполнением

Покушение Решение

Я пытаюсь использовать Flexbox для достижения желаемого макета, но Flexbox не является обязательным требованием. Вот небольшой пример, который воспроизводит проблему (обратите внимание, что я не поставил никаких префиксов браузера в CSS, так что вы хотите, чтобы просмотреть это в Chrome [или, возможно, Firefox тоже?]):

.body { 
 
    height: 600px; 
 
} 
 

 
.container { 
 
    margin: auto; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
    border: 1px solid red; 
 
    height: 100%; 
 
    overflow: auto; 
 
} 
 

 
img { 
 
    border: 5px solid black; 
 
}
<div class="body"> 
 
    <div class="container"> 
 
    <img src="http://placehold.it/700x700" /> 
 
    </div> 
 
</div>

Вы должны быть в состоянии увидеть границу полностью вокруг изображения, но левая и/или верхняя часть изображения обрезаются, когда окно сжимается. Все больше и больше изображения становятся недоступными, поскольку окно продолжает уменьшаться.

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

.body { 
 
    height: 600px; 
 
    margin-top: 80px; 
 
} 
 

 
.container { 
 
    margin: auto; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
    border: 1px solid red; 
 
    height: 100%; 
 
    overflow: auto; 
 
} 
 

 
.content { 
 
    border: 5px solid black; 
 
    width: 600px; 
 
    height: 600px; 
 
    background-color: gray; 
 
}
<div class="body"> 
 
    <div class="container"> 
 
    <div class="content"></div> 
 
    </div> 
 
</div>

Опять весь ДИВ всегда должен быть доступен с помощью прокрутки, но это не так.

Вопрос

Как я могу достичь желаемого макета, описанного выше , используя только HTML и CSS (JS ответы не принимаются)? Flexbox не требуется для решения проблемы, но это было бы неплохо.

Спасибо!

+0

Если вы центрирование изображение, которое больше, чем окна просмотра, в верхней и левой всегда будет отсечка. Вы не можете прокручивать верхнюю или левую сторону окна просмотра. Вам нужно изменить способ обработки изображения с этими размерами, чтобы это не происходило, вероятно, через медиа-запросы, которые не позволяют центрировать изображение или простое старое изображение, чтобы оно соответствовало видовому экрану. Если он всегда должен быть центрирован, вам не нужно будет центрировать изображение и использовать js для прокрутки до центра, когда окно просмотра сжимается. – brouxhaha

+0

Можете ли вы пояснить, что вы имеете в виду @brouxhaha? Если изображение слишком велико для окна просмотра, а элемент контейнера имеет набор прокрутки, я ожидаю, что вы сможете прокрутить весь контент в контейнере. –

+0

Как вы можете, с собственными измерениями, такими как 'min-content',' max-content' и 'fit-content'. Но они мало известны или используются очень часто ... Я понятия не имею, почему.Я уверен, что есть другие методы, но они ускользают от меня. – zer00ne

ответ

0

Итак, критерии в том, что вы всегда хотите, чтобы центрированное изображение было вертикально и горизонтально, и прокручивайте его независимо от того, насколько маленький или большой видовой экран? Взгляните на этот фрагмент и сообщите мне, если я рядом. Если я полностью ошибаюсь, у меня есть план B. Если я преуспел или почти там, я объясню, что я сделал.

РЕЗЮМЕ

  1. Определение <body>, потому что если вы не то вы не можете диктовать, как далеко ваши скроллбары идти.

    position: relative, top, bottom, right, и left в 0 растягивает <body>, чтобы закрыть окно просмотра.

    width и height тел являются 100vw и 100vh исполнения ограничения на <body>

    ♦ Поскольку <body> представляет собой контейнер, все flexbox свойств будут влиять на .x для центрирования по горизонтали.

    Поскольку вы подчеркнули использование полос прокрутки, полосы прокрутки overflow: scroll будут сохраняться, даже если они не нужны. Что хорошо в обстоятельствах, связанных с динамическим контентом, потому что не было бы никаких прыжков.

  2. Наружный контейнер .x имеет flexbox свойства для центрирования внутреннего контейнера .y. Кроме того, вы заметите очень малоизвестное свойство.

  3. .y имеет flex-flow: column nowrap, чтобы разделить изображение.

  4. body имеет min-content применяется как height и width, который заставит его границы контент-в плотный пакет. Таким образом вы можете видеть границы изображения без обычного обрезания.

UPDATE

Это демо имеет несколько простых JS, чтобы продемонстрировать, что изображения любого размера являются:

  1. По центру горизонтально
  2. По центру вертикально
  3. Все стороны можно рассматривать в любом размере.

Примечание: Все под DEMO полностью безопасно удалить или закомментировать.

// DEMO 
 
var s = document.getElementById('s'); 
 
s.addEventListener('click', function(event) { 
 
    event.preventDefault(); 
 
    var w = document.getElementById('w'), 
 
    h = document.getElementById('h'), 
 
    pic = document.getElementById('pic'), 
 
    wv = w.value, 
 
    hv = h.value; 
 
    pic.src = "http://placehold.it/" + wv + "x" + hv + "/"; 
 
}, false);
/* RESET */ 
 

 
html { 
 
    box-sizing: border-box; 
 
    font: small-caps 400 16px/1.45'Source Code Pro'; 
 
} 
 
*, 
 
*:before, 
 
*:after { 
 
    box-sizing: inherit; 
 
    margin: 0; 
 
    padding: 0; 
 
    border: 0 solid transparent; 
 
} 
 
/* REQUIRED */ 
 

 
body { 
 
    position: relative; 
 
    top: 0; 
 
    left: 0; 
 
    bottom: 0; 
 
    right: 0; 
 
    width: 100vw; 
 
    height: 100vh; 
 
    overflow: auto; 
 
    margin: auto; 
 
    width: -moz-min-content; 
 
    width: -webkit-min-content; 
 
    width: min-content; 
 
    height: -moz-min-content; 
 
    height: -webkit-min-content; 
 
    height: min-content; 
 
} 
 
.x { 
 
    height: 600px; 
 
    flex-flow: row nowrap; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
    align-content: center; 
 
} 
 
.y { 
 
    margin: auto; 
 
    display: flex; 
 
    flex-flow: column nowrap; 
 
    align-items: center; 
 
    justify-content: center; 
 
    align-content: center; 
 
    border: 2px dashed red; 
 
} 
 
/* DEMO */ 
 

 
.ui { 
 
    position: fixed; 
 
    top: 1em; 
 
    left: 1em; 
 
    width: 500px; 
 
    line-height: 1.3; 
 
    z-index: 1; 
 
} 
 
fieldset { 
 
    border: 1px solid lightgrey; 
 
    border-radius: 6px; 
 
} 
 
input { 
 
    width: 48px; 
 
    line-height: 1.2; 
 
    border: 1px solid grey; 
 
    border-radius: 6px; 
 
    padding: 2px; 
 
    margin: 2px 1px; 
 
} 
 
label { 
 
    margin: 2px 0 2px 2px; 
 
}
<!doctype html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>C.R.A.P.D. -=- Changing Rectangle Alignment, Position, and Dimensions</title> 
 
</head> 
 

 
<body> 
 
    <!-- DEMO --> 
 
    <header class="ui"> 
 
    <fieldset> 
 
     <legend>Changing Rectangle Alignment Position and Dimensions</legend> 
 
     <label for="w">Width 
 
     <input id="w" type="text" value="300" /> 
 
     </label> 
 
     <label for="h">Height 
 
     <input id="h" type="text" value="300" /> 
 
     </label> 
 
     <input id="s" type="submit" value="Submit" /> 
 
    </fieldset> 
 
    </header> 
 
    <!-- REQUIRED --> 
 
    <main class="x"> 
 
    <section class="y"> 
 
     <img id="pic" src="http://placehold.it/300x300/" /> 
 
    </section> 
 
    </main> 
 
</body> 
 

 
</html>

+0

Спасибо @ zer00ne. Это решение не похоже на вертикальное центрирование. –

+0

Посмотреть полную страницу. Верх и низ находятся в полном окне просмотра, то есть по существу сосредоточены. – zer00ne

+0

Мой плохой. Вы правы, сэр! Я просто посмотрел на фрагмент на моем портфолио, ориентированном на портфолио, и действительно, он не был вертикально центрирован. Я исправил это, см. Обновленный фрагмент. – zer00ne

0

В случае, если вы все еще ищете, или для тех, кто еще заинтересован в простом решении:

Вы можете достичь этого, обернув изображение в контейнере в пределах гибкого контейнера следующим образом:

  • Flex контейнер
    • display: flex
    • height: 100vh
  • Внутренний контейнер
    • margin: auto

Это все, что вам нужно, чтобы получить изображение неизвестного размера центрируется в области просмотра как по вертикали, так и по горизонтали, не теряя возможности прокрутки к любой его части, если она не подходит ни в одном направлении.

Пример 1: (Изображение центрируется в окне просмотра)

body { 
 
    margin: 0; /* Override user agent styles */ 
 
} 
 

 
.flex { 
 
    display: flex; 
 
    height: 100vh; 
 
} 
 
.container { 
 
    margin: auto; 
 
}
<body class="flex"> 
 
    <main class="container"> 
 
    <img src="http://placehold.it/100x100"> 
 
    </main> 
 
</body>

Пример 2: (Изображение не помещается в окне просмотра, но по-прежнему можно прокручивать)

body { 
 
    margin: 0; /* Override user agent styles */ 
 
} 
 

 
.flex { 
 
    display: flex; 
 
    height: 100vh; 
 
} 
 
.container { 
 
    margin: auto; 
 
} 
 
img { 
 
    border: 1px solid red; 
 
}
<body class="flex"> 
 
    <main class="container"> 
 
    <img src="http://placehold.it/1000x1000"> 
 
    </main> 
 
</body>

Работает в последней версии Chrome, Firefox, Opera и Edge.

0

Просто снимите justify-content с вашего контейнера и добавьте margin: auto к изображению.

.body { 
 
    height: 600px; 
 
} 
 

 
.container { 
 
    margin: auto; 
 
    display: flex; 
 
    /* align-items: center; // no need for this anymore */ 
 
    /* justify-content: center; // remove this */ 
 
    border: 1px solid red; 
 
    height: 100%; 
 
    overflow: auto; 
 
} 
 

 
img { 
 
    border: 5px solid black; 
 
    margin: auto; /* add this */ 
 
}
<div class="body"> 
 
    <div class="container"> 
 
    <img src="http://placehold.it/700x700" /> 
 
    </div> 
 
</div>

Смежные вопросы