Jump to content

DIV одинаковой ширины и высоты всегда по центру


Melodyn
 Share

Recommended Posts

Гуглил эту тему, но как-то не попалось решение. Так как я нуб, сделал самое простое и очевидное решение и решил поделиться с нубами всего мира :)

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

<content>
  <div></div><div></div><div></div><div></div>
  <div></div><div></div><div></div><div></div>
</content>

В принципе, решение на CSS мне виделось примерно: height: width; -- но так к сожалению (или счастью) нельзя. Зато можно использовать фичу CSS3 для ширины:

content{
  display: block;
  height: 512px;
  width: auto;
  margin: 16px;
  padding: 4px;
  background: #fff;
}

content div{
  display: inline-block; /* блоки на одной строке */
  min-height: 128px;
  width: calc(100% / 4 - 8px); /* Используем CSS3 для расчёта ширины блоков,
                               вычтем отступы, созданные margin и padding */
  background: #ccc;
  margin: 4px;
}

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

 

И осталось только узнать ширину, подставив её в CSS:

$(function(){
  var myWidth = $('content div').width(); // получаем ширину
  $('content div').css("height", myWidth); // устанавливаем её
});

 

В итоге оно работает на jsfiddle.

 

Вот и всё! Делитесь своими решениями.

 

Link to comment
Share on other sites

51 минуту назад, Melodyn сказал:

с одинаковыми отступами

Отступы от краёв меньше отступов между элементов.

Цитата

одинаковой высотой и шириной

Растягиваю/сужаю окно - квадраты превращаются в вытянутые или растянутые прямоугольники.

Link to comment
Share on other sites

2 минуты назад, Launder сказал:

Отступы от краёв меньше отступов между элементов.

Растягиваю/сужаю окно - квадраты превращаются в вытянутые или растянутые прямоугольники.

Отступы между рядами действительно больше, потому что margin указан для четырёх краёв. Можете сделать margin-bottom нулевым.

 

Не забывайте про кнопку Run - JS не работает в реальном времени, в отличие от CSS.

Link to comment
Share on other sites

3 минуты назад, Melodyn сказал:

Не забывайте про кнопку Run - JS не работает в реальном времени, в отличие от CSS.

Да, вижу, ок.

Цитата

Отступы между рядами действительно больше, потому что margin указан для четырёх краёв.

Почему - я вижу.

Цитата

Можете сделать margin-bottom нулевым.

А можно вообще сделать так, чтоб контейнер был не фиксированным, а растягивался по высоте?

Link to comment
Share on other sites

5 минут назад, Launder сказал:

чтоб контейнер был не фиксированным, а растягивался по высоте?

Контейнер - content? Конечно можно. Поставьте height: auto вместо height: 512px и он будет изменяться вместе с количеством/размером содержимого.

Link to comment
Share on other sites

7 часов назад, by chris сказал:

Что-то не так:

Снимок.PNG

 

1 час назад, Igor Schnaider сказал:

padding-top можно использовать на псевдоэлементе (link).

Очень интересный подход! Есть, правда и траблы: при установке текста внутри блока он становится не квадратным. Как пофиксим? Пруф.

Снимок.PNG

Link to comment
Share on other sites

1 час назад, Igor Schnaider сказал:

Можно так.

Заметил, что у моего и вашего метода есть один недостаток - текст вылезает за пределы установленного padding. В принципе, это можно пофиксить, например, установив border, но может, есть идеи получше? http://codepen.io/anon/pen/bpRYvb?editors=1100

Link to comment
Share on other sites

12 минуты назад, by chris сказал:

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

При чем тут полосы прокрутки? У меня блоки квадратные, а у вас прямоугольные:

Снимок.PNGСнимок.PNG

Link to comment
Share on other sites

4 минуты назад, Melodyn сказал:

При чем тут полосы прокрутки? У меня блоки квадратные, а у вас прямоугольные:

А вы их даже не заметили))

 

4 минуты назад, Melodyn сказал:

У меня блоки квадратные, а у вас прямоугольные

Относительно. Сожмите поле с результатом и ваши блоки выстроятся ровными прямоугольниками. http://i.imgur.com/IT8P6l9.jpg

Пожалуйста, эквивалентные квадраты логике вашей разметки https://jsfiddle.net/9aL4oc76/8/

Link to comment
Share on other sites

9 минут назад, by chris сказал:

Пожалуйста, эквивалентные квадраты логике вашей разметки https://jsfiddle.net/9aL4oc76/8/

То ли лыжи не едут...

Название темы - блоки одинаковой высоты и ширины. Мой код действительно даёт прямоугольники, когда есть height: 128px или не было обновления страницы. Я смотрю на ваш код и вижу в нём блоки разной ширины и высоты, опять же два скрина с вашим и моим случаем: 

Снимок.PNG Снимок.PNG

Edited by Melodyn
Link to comment
Share on other sites

3 часа назад, Melodyn сказал:

В принципе, это можно пофиксить, например, установив border, но может, есть идеи получше?

Можно с помощью border. Ну или городить дополнительные элементы.

  • Like 1
Link to comment
Share on other sites

2 минуты назад, Launder сказал:

решение будет зависеть от размера шрифта.

От размера шрифта вряд ли что-то может зависеть. Наиболее актуальная версия: https://jsfiddle.net/9aL4oc76/6/ так как уже после того кода вылезло много новых вопросов ) Если получится сделать опрятный код, то и на чистом CSS вариант получится.

Link to comment
Share on other sites

2 минуты назад, Melodyn сказал:

От размера шрифта вряд ли что-то может зависеть.

Как это врят ли? Я специально поставил размер шрифта большой. Уберите в моём примере вертикальное выравнивание, и поставьте марджин-боттом, как Вы и говорили, и, увидите, что зависит.

Link to comment
Share on other sites

11 минуту назад, Launder сказал:

марджин-боттом

 

11 минуту назад, Launder сказал:

размер шрифта

Эм? Размер шрифта font-size, а margin-bottom - это отступ снизу. Вы уверены, что вы говорим об одном и том же? ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By jksnf
      Не работает transition при появлений модального окна:
      <a class="btn">Modal</a> <div class="modal"> <div class="overlay"> <div class="content"> <a class="close">X</a> <h1>Title</h1> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sunt repellat asperiores rerum animi officiis minus corporis iure voluptate accusantium, ut optio ratione iusto nemo delectus. Quasi illum libero dolorum neque?</p> </div> </div> </div> //scss .modal .overlay{ position: fixed; top: 0;left: 0; width: 100%;height: 100%; background: rgba($color: #000000, $alpha: .8); z-index: 1; display: none; } .modal .content{ width: 500px;height: 200px; position: absolute; top: 50%;left: 50%; transform: translate(-50%, -50%); background-color: #fff; z-index: 2; text-align: center; display: none; a{ line-height: 30px; font-weight: bold; color: #fff; top: -50px;; position: absolute; right: -50px; font-size: 40px; padding: 10px; } h1{ margin-bottom: 20px; } } .modal.active .overlay{ display: block; } .modal.active .content{ display: block; } //Jquery $(document).ready(function(){ $(".btn, .close").click(function() { $(".modal").toggleClass("active") }) }) Я понимаю что на display не работает transition. но и нельзя ставить opacity т.к перекрывает контент сзади него изначально.

      Что делать?
    • By DrRobotGranata
      Всем привет! Задача стоит следующая. Есть 8 элементов (IMG). Т.е. одна целая картинка разрезана на 8 частей(рамка)
      Нужно сверстать гибкой версткой макет, где эти 8 кусочков будут одним целым( рамкой) а внутри можно будет размещать любой текс, рамка по высоте подстраивается под текс, по ширине на всю ширину окна.
      Кручу верчу, все никак не получается. Подскажите в какую сторону думать. Каждый Img в отдельный div и все дивы в общий контейнер? и дальше как
    • By IsayR
      Всем привет! Подскажите, пожалуйста, как правильно сделать раскрывающиеся блоки со скрытым содержанием внутри? У меня в принципе все работает, блок открывается и закрывается, НО если я нажимаю на блок, а не на стрелочку, она у меня остается в таком же положении(а она должна у меня меняться, когда блок открывается), и получается куча мала, и выглядит это не очень презентабельно. Подскажите, пожалуйста!
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 1 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 1</div> </div> </div> </div> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 2 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 2</div> </div> </div> </div> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 3 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 3</div> </div> </div> </div> .div{ border: 1px solid #3A444E; border-radius: 10px; width: 300px; height: 64px; overflow: hidden; } .div.open { height: auto; background: #000; color: #fff; } .window-one { display: flex; align-items: center; justify-content: space-between; } .title { margin-bottom: 20px; } .arrow-test { content: ''; background: url('http://cdn.onlinewebfonts.com/svg/img_387044.png') no-repeat center center / 100%; width: 30px; height: 30px; cursor: pointer; } .arrow-test.open { content: ''; background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Eo_circle_yellow_arrow-up.svg/1024px-Eo_circle_yellow_arrow-up.svg.png') no-repeat center center / 100%; width: 30px; height: 30px; cursor: pointer; } $('.div, .arrow-test').click( function(){ $(this).toggleClass('open')});  
    • By vladdvin
      Верстаю макет с Фигмы - https://www.figma.com/file/2rdy1qjBTl7D6BAC8S4qlf/Webovio?node-id=0%3A1. Наверстал
      CSS
      В результате отображается следующая картинка

      в режиме инструментов разработчика. А вне режима вообще отображает

      Подскажите как добиться отображения текста как на макете.
    • By Hinn
      Всем приветик, начинающий фрилансер. Ищу первые заказы в данной сфере. Занимаюсь:
      • На малом уровне версткой;
      • Хорошо разбираюсь в таких CMS: как Wordpress и Tilta - легко и быстро разработаю одно страничные, многостраничные сайты, интернет-магазины (могу как дорабатывать, так и создания с нуля, так же занимаюсь переносом одного сервера на другой);
      • Увлекаюсь разработкой логотипов (логотипы с нуля, доработка логотипа, рисование логотипа по эскизу).
      Готов заниматься работой за любую плату. Так же присутствует портфолио, но за частую людям интересно когда о тебе есть отзывы. Поэтому пришел сюда за практическим опытом, и поиском постоянной работы.
      Использую:
      - Верстка: (HTML5/CSS3), верстаю из Figma, Photoshop, illustrator.
      - Разработка сайта: (CMS WordPress, Tilta).
      - Разработка логотипа: (Photoshop, illustrator)
      Если не знаю чего-то необходимого для Вашего проекта\работы -- обязательно разберусь (все-таки начинающий фрилансер).

      Если вы разработчик и вам некому спихнуть рутинную работу - я с радостью возьму её на себя;

      телеграмм: HinnWork;
      почта: balistic.baty@gmail.com

      Открыт для любых предложений. 
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy