Jump to content

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


Melodyn
 Share

Recommended Posts

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

 

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

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

Link to comment
Share on other sites

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

при изменении размера шрифта, меняется размер вертикальных расстояний

Просто в той ссылке вообще нет никакого текста, т.е. изменение font-size без текста ну просто ничего не даст. Скорее всего вы чего-то не понимаете или я не понимаю вас, т.к. единственный вариант с текстом - шестой. И там изменение font-size никак не влияет на margin-bottom. 

3 часа назад, by chris сказал:

код скрипта можно модернизировать

Модернизируйте, выкладывайте ) Будет маленькая база решений одной задачи.

  • Like 1
Link to comment
Share on other sites

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

7я строчка

Это уже не отступы, а фишка родительского элемента, который здесь в качестве фона. Он изменяет вместе с размером шрифта межстрочный интервал, что по сути line-height, а не margin-bottom. Это тооонкая такая грань, которая действительно может вызывать порой косяки в вёрстке ) 

 

Чтобы не быть голословным: https://jsfiddle.net/9aL4oc76/11/ - можете в 9й строке менять размер шрифта.

Link to comment
Share on other sites

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

Это тооонкая такая грань, которая действительно может вызывать порой косяки в вёрстке )

Ну так я же привёл пример, чтоб она не вызывала :-)

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

Если получится сделать опрятный код, то и на чистом CSS вариант получится.

Ну вот в самом первом приближении раз и два.

Link to comment
Share on other sites

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

Это всё костыли, как, в принципе и любое из решений. Я вот решил пока заменить padding на border, что даёт весьма хороший результат: https://jsfiddle.net/9aL4oc76/12/

Link to comment
Share on other sites

Ну и вариант Игоря работает, элементы ровненько заполняются рядами.

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

Он изменяет вместе с размером шрифта межстрочный интервал, что по сути line-height, а не margin-bottom.

Тут дело не в межстрочном интервале, а в вертикальном выравнивании.

Link to comment
Share on other sites

Чуть более причёсанные решения: раз, два и три. Первый вариант работает только с overflow: hidden, второй и третий, может, также принимать значения и auto. Люди, а подскажите, как flex-контейнер сделать квадратным?...

Link to comment
Share on other sites

@jkikksa, ваш пример с фикисрованным размером блоков, а надо переменным, чтобы при изменении ширины страницы менялась ширина блока и высота оставалась равной ширине. Тут вся тема вокруг этой фичи, а наделать просто квадратных блоков можно и не через флекс.

Edited by Melodyn
Link to comment
Share on other sites

Ещё более причёсанная версия. Можно поставить и более амбициозную задачу: резиновый прямоугольник, чтоб в нём располагались резиновые прямоугольники на равноудалённом расстоянии между друг друга и границ.
Частный случай для квадратов в два ряда я решил. Но в общем виде сложно представить как это можно решить без программирования.

С помощью программирование решение не сложное:

для квадратов: ширина содержащего бокса(.element-to-stretch) принимается за 100%. паддинг бокса +%. Итого получится больше 100%. Каждый квадрат равен 100% поделённый на количество квадратов, минус марджин, равный паддингу бокса. Итого для каждого квадрата действует двойной паддинг свой и соседнего квадрата, если же сторона квадрата "смотрит" на границу содержащего бокса, то марджин квадрата суммируется с паддингом бокса (который мы назначаем равным марджину квадрата), итого получается тот же двойной марджин квадрата, отступы равны.

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

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

Итак мы знаем количество рядов. суммарное высота отступов равна 100% минус высота квадрата, умноженная количество рядов. + ещё нужно назначить вертикальные паддинги с двух сторон равные половине высоты отступа между квадратами. Напомню, для соседних квадратов действует двойной марджин, а для крайних квадратов нужен внешний паддинг, чтоб визуально расстояние до края бокса была равно расстоянию между квадратами.

Итак у нас есть значение 100% - (высота квадратов х количество рядов). Указанное значение нужно разделить на количество рядов, а потом ещё на два - поскольку у каждого квадрата два отступа сверху и снизу. Назначаем полученное значение вертикальному марджину квадрата и вертикальному паддингу бокса.

Для последнего ряда алгоритм тот же что и для высоты, но возникает дополнительная сложность - мы не можем назначить горизонтальный паддинг бокса так, чтоб это не повлияло на соседние ряды. Значит нужно будет иметь дело только с горизонтальными марджинами последнего ряда. Кстати как выделить последний ряд с помощью CSS тоже плохо себе представляю, есть псевдокласс :first-line, а вот псевдокласса :last-line или nth-of-line или, например, nth-last-of-line (которому можно было бы задать единичку), к сожалению, я не нашёл. Впрочем, надеюсь, с помощью скриптов, эта проблема решается...

Ну так вот, для последнего ряда мы имеем дело с тем паддингом бокса, который мы проставили в предыдущих рядах. Соответственно отнимаем от 100% общую ширину квадаратов (ширину квадратов на количество квадратов). Добавляем к полученному значению величину наших паддигов бокса, то есть горизонтальный паддинг бокса умноженный на два (у него же с двух сторон паддинг по ширине, справа и слева). Получаем общую ширину отступов. Делим получившееся значение на (количество рядов + 1) получаем расстояние между квадратами. То, что отступов на один больше, чем количество квадратов, вполне очевидно, достаточно себе представить квадраты в ряду и отступы, один отступ будет с двух сторон :-) Расстояние между квадратами делим на два, получаем марджин квадратов. Теперь нас интересует левый марджин самого левого квадрата и правый марджин самого правого - поскольку с крайней стороны у них нет квадрата с таким же марджином, нужно их марджин увеличить на столько же, насколько паддинг бокса меньше. У нас есть расстояние между квадратами. Отнимем от него паддинг бокса и получим значение искомых марджинов. Присвоим полученное значение крайним квадратам последнего ряда (наверное, как-то через присвоение классов) и получим ровненький последний рядок, вместе со всеми остальными! Вуа-ля, решение готово! :)

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

Обращу внимание, на решение на флэксбоксах. Поскольку флэксбокс, это модуль, с некоторыми ЗАДАННЫМИ алгоритмами, то как удвоить крайние отступы, откуда брать значения для марджинов-паддингов мне не понятно. Если у кого-то есть идеи, как сделать всё красиво с помощью флексбоксов, с интересом послушаю...

Возвращаясь к исходному примеру, стоит отметить один его существенный недостаток. Мне пришлось обнулить исходный шрифт содержащего бокса, поскольку при больших размеров шрифтов дочерних элементов не удаётся скомпенсировать горизонтальные отступы шрифта. Ни обнуление word-spacing, ни letter-spacing результата не дают. Можно, конечно, действовать в ещё более "ручном" режиме, но это уже не интересно. В общем, обнуление шрифта и последующее восстановление размера для дочернего элемента, при overflow в значении hidden или auto, не даёт "внутренним" шрифтам влиять на расстояние между квадратами. Отмечу что вертикальные отступы удалось решить с помощью vertical-align, который можно, например, поставить в значении middle или bottom, скажем, в последнем случае вертикальный отступ добавится, вероятно, только если высота шрифтовой площадки превысит размеры квадрата, что малореально для содержательной надписи - даже если на квадрате написана одна буква, размер её шрифтовой площадки врят ли превысит размер квадрата. Впрочем, если стоит цель заполнить буквой всё пространство квадрата (или прямоугольника), то нужно, видимо, использовать другие средства...

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

Link to comment
Share on other sites

Я тут тоже позанимался допилом. Очень неудобно оказалось на чистом CSS заполнять блоки текстом, поэтому решил сделать на jQ автоматическое обновление страницы и решать задачу примерно так:

https://jsfiddle.net/9aL4oc76/18/

Edited by Melodyn
Link to comment
Share on other sites

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

@jkikksa, ваш пример с фикисрованным размером блоков, а надо переменным, чтобы при изменении ширины страницы менялась ширина блока и высота оставалась равной ширине. Тут вся тема вокруг этой фичи, а наделать просто квадратных блоков можно и не через флекс.

так у вас в примере ширина не равна высоте

Link to comment
Share on other sites

Впрочем, и флексбоксы можно приручить. Складываем равноудалённые квадраты в область, фиксированный отступ по горизонтали, резиновый по вертикали. Можно и полностью резиновый вариант. Но нужно учитывать что, если общая ширина отступов больше одного квадрата, то флексбокс радостно уместит ещё один квадрат в первый ряд. В общем, без скриптов тут сложно обойтись.

Исходная же задача отлично решается и без скриптов, через padding-top.

Edited by Launder
Link to comment
Share on other sites

@jkikksa где, например? Мои публикации, на сколько видит мой глаз, везде с квадратами:

В 26.03.2016 в 21:26, Melodyn сказал:

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

В 27.03.2016 в 09:43, Melodyn сказал:
В 27.03.2016 в 16:22, Melodyn сказал:
10 часов назад, Melodyn сказал:

Не везде они с первого раза, но всё же.

 

@Launder ну потому что тут фуфло ) Ещё из таких же полезнейших решений была моя тема в этом же разделе, которой вряд ли кто-то в здравом уме пользуется (кроме меня, конечно). Труъ-программер решает поставленную мной задачу на JS или jQ за минуты, и выкладывает в Библиотеку здоровый код. А у нас код курильщика :)

Link to comment
Share on other sites

@Launder, тут не проблемы вёрстки. Я придумал фичу и решил ей поделиться, чтобы знающие меня закидали советами и какахами. В итоге, в процессе обсуждения, вылезли ранее незамеченные баги и были предложены несколько вариантов их решения. То есть хотелось обсуждение работы, а получилась работа над ошибками. Если кто-то сочтёт, что теме необходим переезд, то они его осуществят и без моего участия.

Но это уже всё оффтоп )

Edited by Melodyn
Link to comment
Share on other sites

Ребята, биде! При входе с мобильного браузера (Опера под Андроид) всё отображается хорошо, но при попытке пролистать страницу происходит обновление и перебрасывает вверх. На Едже под виндой перебрасывает вверх при ресайзе. Использую этот код:

В 01.04.2016 в 11:23, Melodyn сказал:

Будьте бобры, напишите коротенькое решение, чтобы и размер блоков менялся в реальном времени, и позиция скролла не терялась. А то я слишком нуб :)

Edited by Melodyn
Link to comment
Share on other sites

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

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

Вы зачем через location.reload() все это делаете?!

https://jsfiddle.net/07jdmwqt/

Link to comment
Share on other sites

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

Вы зачем через location.reload() все это делаете?!

Так приказали голоса в голове.

 

Не умею в программирование, бывает ) Спасибо, весьма лаконичное решение!

Link to comment
Share on other sites

  • 2 weeks later...
В 01.04.2016 в 11:18, Launder сказал:

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

Что-то я запамятовал, конечно же, это можно решить через rem.

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