Как остановить 3 изображения бок о бок внутри div от переноса на следующую строку?

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

Итак, когда вы входите в режим адаптивного дизайна или перетаскиваете экран браузера по ширине, чтобы уменьшить его, все 3 изображения остаются рядом внутри div без переноса на следующую строку.

Но автоматически начать изменять размер, чтобы соответствовать измененному размеру div.

3 изображения начинают правильно изменять размер внутри div только тогда, когда третье изображение обернуто под второе изображение. Вот так это выглядит ниже.

[]
[] 
[]

После того, как все изображения выровнены по вертикали, изображения начинают правильно сжиматься. Но этот перенос изображения под следующее изображение не подходит для меня, так как при просмотре веб-сайта на мобильном телефоне или при изменении размера экрана изображения все еще очень большие.

Должен быть способ остановить эти изображения от наложения друг на друга и просто оставаться в строке, но автоматически изменять их размер. при уменьшении ширины div / page?

Я пробовал white-space: nowrap; дисплей: встроенный; встроенный блок; даже дисплей: таблица-ячейка; ничего не кажется делать то, что мне нужно. Однако, если я использую только одно изображение вместо 2 или 3, то оно работает отлично.

Вы, наверное, думаете, почему бы просто не поместить все 3 изображения в одно изображение в фотошопе? Каждый img - это ссылка href, так что это невозможно. Даже перемещение изображений влево по-прежнему не помогает.

Вот мой CSS / HTML

img {

max-width: 100%;
height: auto;

}

тогда

<div style = "width: 930px; max-width: 100%; border: 1px solid blue;">
<img src = "camera.png"> <img src = "lights.png"> <img src = "action.png">
</div>

Может кто-нибудь подскажет, где я могу ошибиться, пожалуйста? Как я могу остановить обертывание изображений под другими изображениями, когда родительский контейнер сжимается.

Мне пришлось прибегнуть к использованию нескольких запросов @media с разными предварительно фиксированными размерами изображений для каждой точки останова. Но должен быть гораздо более простой способ. Что-то настолько простое, чего мне не хватает.

вы можете использовать ширину в процентах или flexbox для этого

Lewis Briffa 13.05.2018 23:27

Здравствуйте, спасибо за ответ. Но и этот процентный метод не работает. Я пробовал проценты на div, даже до 3-го изображения. Несмотря на это, изображения по-прежнему переходят на следующую строку. Да, он может работать с использованием Flexbox, но мне бы хотелось знать, можно ли это сделать и без свойств Flex для браузеров, которые его не поддерживают.

GraphiX 14.05.2018 12:48
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
6 062
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

вы можете использовать для этого inline-block. вам нужно будет изменить ширину с помощью медиа-запросов, когда ваш экран станет меньше

img {
display:inline-block;
width: 33%;
height: auto;
}

вам также следует обернуть образы в div.container и дать этому divwidth:100%

Возможно, вы захотите использовать width: calc(100% / 3);, поскольку использование 33% может привести к значительной разнице, когда вы хотите, чтобы все было идеально выстроено. Например, макеты с использованием начальной загрузки обычно имеют размер до 1200 пикселей, а это будет 12 пикселей. Конечно, это 1% от 1200, но все же складывается.

Thomas 14.05.2018 00:02

@Thomas, это чтобы показать спрашивающему, что процентная ширина и встроенный блок - это то, что он / она хочет здесь. Фактически вы обнаружите, что если вы используете width: calc(100% / 3);, вам придется добавлять отрицательные поля, чтобы все было в порядке, когда экран сжимается.

Claire 14.05.2018 00:40

@ Том и Томас спасибо, что нашли время ответить. Я видел так много ответов, когда дело доходит до изображений. Все всегда используют ширину: 33%, даже если это меньше / больше 3 изображений. Может кто-нибудь объяснить, что это за значение ширины: 33%; или 33,333%, и почему всегда используется именно это значение?

GraphiX 14.05.2018 12:59

@GraphiX значение 33,33% в этом случае означает, что изображение займет 33,33% своего родительского контейнера. Я бы не сказал, что это значение «всегда используется», но оно используется много для 3 элементов подряд, потому что 33,33 x 3 = 99,99 или 100% родительского контейнера. В идеале вы должны использовать width:33.33% в качестве основы, а затем использовать медиа-запросы, чтобы изменить ширину до 50% или 100%, когда экран сжимается до ваших точек останова.

Claire 15.05.2018 01:27

@GraphiX, если вы поместите свой код в скрипку и воспроизведете свою проблему, я могу вам помочь

Claire 15.05.2018 01:28

Ширина изображения, установленная на 100%, занимает все горизонтальное пространство контейнера, так как вы хотите разместить три изображения, встроенных друг в друга, разделите 100% на 3, чтобы при изменении размера контейнера три изображения занимали одну треть доступного космос. margin-left: -2px должен следить за тем, чтобы граница изображения не касалась края, в противном случае она будет перенесена на новую строку. Попробуйте этот образец:

CSS:

img {
  display: inline-block;
  width: 33%;
  height: auto;
  margin-left: -2px;
  box-sizing: border-box;
}

HTML-элемент:

<div style = "width: 930px; max-width: 100%; border: 1px solid blue;">
  <img src = "camera.png"> 
  <img src = "lights.png"> 
  <img src = "action.png">
</div>

просто дубликат моего ответа

Claire 13.05.2018 23:52

В то время, когда я писал ответ, никто не опубликовал никакого ответа. Я увидел это, когда нажал кнопку отправки.

Cocest 14.05.2018 00:00
Ответ принят как подходящий

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

.container{
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: flex-start;
}

img {
flex: 1;
max-width: 100%;
height: auto;
max-height: 310px;
}
<div class = "container" style = "width: 930px; max-width: 100%; border: 1px solid blue;">
<img src = "https://cdn.vox-cdn.com/uploads/chorus_image/image/44336734/fujifilmx100t-1.0.0.jpg"> 
<img src = "https://d3k7s9wfq6lao0.cloudfront.net/latest/37504/main/7.jpg"> 
<img src = "https://upload.wikimedia.org/wikipedia/commons/3/33/Clapperboard%2C_O2_film%2C_September_2008.jpg">
</div>

Вы можете добавить align-items: flex-start; или его вариант в .container, чтобы изображения не растягивались по вертикали до размеров контейнера.

subhaze 14.05.2018 00:17

Отличное предложение. Я пошел дальше и соответственно обновил ответ :)

Michael Sorensen 14.05.2018 00:25

Спасибо @MichaelSorensen и subhaze, есть ли способ расширить это только для учебных целей. Я также хочу сделать это для старых браузеров, которые не поддерживают новый гибкий макет. Можно как-то без флекса это сделать?

GraphiX 14.05.2018 12:53

Если вы новичок в flex, я настоятельно рекомендую вам ознакомиться со статьей CSS-tricks на эту тему здесь: css-tricks.com/snippets/css/a-guide-to-flexbox. Если вас беспокоит поддержка браузеров, хорошая новость заключается в том, что в настоящее время Flex довольно широко поддерживается, см. Здесь: caniuse.com/#search=flex. Наконец, другие решения в этом потоке также действительны для наборов из 3 изображений. Однако это решение может поддерживать любое количество изображений, которые вы хотите выстроить в ряд.

Michael Sorensen 14.05.2018 18:34

@MichaelSorensen Спасибо за вашу помощь. Я посмотрел ваш профиль и вашу биографию. Я хочу с вами связаться. Я сейчас возился с flex, и в Chrome возникают странные проблемы. Я хотел бы, чтобы вы помогли / посмотрите, почему. Не знаю, как разместить здесь код.

GraphiX 26.05.2018 16:55

@GraphiX извините за это. Я разместил свое электронное письмо на странице своего портфолио, которое вы сможете найти в профиле SO. Не стесняйтесь писать мне туда по электронной почте. Неправильно размещать здесь контактную информацию.

Michael Sorensen 04.06.2018 02:18

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

Проблема с max-width: 100% заключается в том, что относительный размер не начинает работать до тех пор, пока каждое изображение не перерастет своего родителя, в данном случае div. Поскольку все изображения имеют абсолютный размер по умолчанию, основанный на их src изображения, они заставляют себя перейти на новую строку перед изменением размера, и только тогда max-width начнет делать то, что вы хотите. Согласно ответу Тома, процентное изменение размера 33% заставляет изображения иметь относительный размер, что приводит к их немедленному сжатию.

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

img {
  width: 33.3%;
}

И вот самая большая проблема, с которой я столкнулся при работе со встроенными изображениями.

A display of inline and inline-block is respective of the whitespace that exists within your HTML markup.

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

img {
  width: 33.3%;
}
<div style = "width: 930px; max-width: 100%; border: 1px solid blue;">
  <img src = "https://picsum.photos/250/250/?random1">
  <img src = "https://picsum.photos/250/250/?random2">
  <img src = "https://picsum.photos/250/250/?random3"> 
</div>

Но как только этот пробел будет удален, все изображения будут идеально помещаться на экране при изменении размера.

img {
  width: 33.3%;
}
<div style = "width: 930px; max-width: 100%; border: 1px solid blue;"><img src = "https://picsum.photos/250/250/?random1"><img src = "https://picsum.photos/250/250/?random2"><img src = "https://picsum.photos/250/250/?random3"></div>

Теперь сжатие разметки HTML, приведенной выше, делает ее довольно громоздкой, поэтому в качестве альтернативы вы можете использовать метод с плавающей запятой. Устанавливая плавающее значение left для каждого изображения, вы заставляете каждый тег img располагаться на одном уровне, независимо от дополнительного промежутка между ними. Просто убедитесь, что родительский div также имеет плавающее значение left или переполнение auto, чтобы предотвратить его коллапс.

img {
  width: 33.3%;
  float: left;
}

это очень подробно, и спасибо, что нашли время объяснить, что это за волшебные 33,3%, которые я видел повсюду. Белое пространство, которое вы показали выше, идеально подходит, только изображения будут иметь отступ 40 пикселей или поле для их разделения. Затем это вызывает проблему с пустым пространством, когда div разрушается. Даже когда изображения плавают слева. display: flex кажется лучшим способом сделать это. Просто надеялся, что смогу точно воспроизвести метод гибкости, используя другие методы.

GraphiX 14.05.2018 20:01

в этом случае попробуйте объединить его с «box-sizing: border-box», как показано в ответе Cocest, это приведет к тому, что ширина изображений будет занимать 33,3% только оставшегося пространства после применения отступов;)

Lewis Briffa 14.05.2018 20:24

После многих дней тестирования различных способов, вот идеальный способ сделать это без изгиба. Убедитесь, что каждое изображение заключено в отдельный div, что важно.

<style>
* {
    box-sizing: border-box;
}

img {

width: 100%;
max-width: 100%;
height: auto;

}

.column {
    float: left;
    width: 33.33%;
    padding: 5px;
}

/* Clearfix (clear floats) */
.row::after {
    content: "";
    clear: both;
    display: table;
}

</style>

Теперь вот где я немного изменил его для большей гибкости. Поскольку каждое изображение теперь находится в своем собственном div, мы можем сделать изображение ширина: 100%; или максимальная ширина: 100%;, а затем вместо этого добавить часть ширина: 33,33%;, которая раньше находилась под img {}, в каждый из трех новых столбцов div.

<div class = "row">
  <div class = "column"> /* 33.33% width */ 
    <img src = "flash-tooltip.png">
  </div>

  <div class = "column"> /* 33.33% width */ 
    <img src = "html-tooltip.png">
  </div>

  <div class = "column"> /* 33.33% width */ 
    <img src = "portables-tooltip.png">
  </div>

</div>

Многие люди дали отличные советы.

Самый простой способ - использовать flex. Но кое-что люди не говорят вам при использовании flexbox. Вы все равно должны заключить каждое из изображений в отдельный контейнер div. В противном случае вы столкнетесь с некоторыми странными вещами, если заключите их в якоря гиперссылок, то есть если все три изображения просто будут помещены в первый div гибкого контейнера. И без собственного контейнера div изображения не сохранят никакого соотношения сторон при сжатии / увеличении. Они просто сжимаются и перекосятся вместе.

И напоследок очень важно! Всегда убедитесь, что все изображения внутри гибкого контейнера настроены одинаково. Либо ширина: 100%;, либо максимальная ширина: 100%;, в противном случае изображения не будут сокращаться вверх / вниз вообще в Google Chrome.

Я включил тот же метод, что и выше, только на этот раз в версии flexbox.

Другие вопросы по теме