Страницы

Поиск по вопросам

пятница, 26 апреля 2019 г.

Как узнать url файла php?

Я делаю регистрация в своем андроид приложении,и мне нужно обратиться к php-файлу на хостинге,но я не знаю как узнать url к этому файлу.


Ответ

'; echo 'Полный путь к скрипту и его имя: '.$_SERVER['SCRIPT_FILENAME'].'
'; echo 'Имя скрипта: '.$_SERVER['SCRIPT_NAME']; ?>

Обязательно ли при переопределении equals переопределять и hashCode?

Я неоднократно слышал о том, что рекомендуют при переопределении метода equals переопределять и hashCode. Но так рекомендуют, что вроде и не откажешь.
Есть ли какое-то соглашение о том, что если я переопределяю equals, то и hashCode тоже обязан переопределять, а в противном случае код не будет считаться корректным? Или это просто рекомендация?


Ответ

Если Вы переопределите equals(...), но не переопределите hashCode(), то в некоторых случаях Ваша программа будет вести себя некорректно.
В частности это проявляется для объектов, которые являются ключами в HashMap
Если объекты равны, то и их хэш-коды должны быть равны.

Тестирование и избавление от связности классов.

Добрый день! У меня есть приложение asp.net mvc. В нем я пытаюсь создавать архитектуру "по уму" - с Dependency Injection, тестами и тд. В приложении есть классы-сервис, в которых сосредоточена бизнес-логика. Мне необходимо покрыть эти сервисы тестами. Многие сервисы используют класс настроек, экземпляры которых им передаются в конструкторах. Например:
public class AppSettings { public AppSettings() { SomeStr = WebConfigurationManager.AppSettings["str"]).ToString(); // и еще несколько подобных строк }
public string SomeStr { get;set; } }
public class MyService { public MyService(AppSettings settings) { _settings = settings; }
private readonly AppSettings _settings; }
Проблема тут вот какая. В конструкторе класса AppSettings происходит инициализация неких переменных, данные о которых получаются из файла web.config. В коде самого приложения это работает, а вот если я пытаюсь тестировать класс MyService в отдельном тестовом приложении, то возникает проблема: классу нужно передавать экземпляр AppSettings, но при его создании вываливается исключение из-за невозможности обратиться к web.config. Кроме того сами классы я напрямую не создаю, этим занимается DI-библиотека. Как быть в данном случае и как нормально протестировать MyService? К тому же мне кажется проблемой то, что в конструкторе класса AppSettings происходит обращение к `web.config. Подскажите пожалуйста как решить эту проблему? Заранее благодарю.


Ответ

Если вы используете класс AppSettings как класс настроек и IoC-контейнер, то опишите интерфейс IAppSettings и протестируйте с помощью Mock объектов.
Приведу пример. В классе MyService вы заменяете тип аргумента конструктора settings на IAppSetting. В IoC-контейнере регистрируете реализацию. Предположим, что вы используете Ninject, тогда kernel.Bind().To(). Тогда в методе тестирования вы можете настроить свой объект.
Mock() mock = new Mock(); mock.Setup(m => m.Field1).Returns(value1); MyService service = new MyService(mock.Object);
Здесь вы задаете, что при запрашивании Field1 должно вернуться значение value1.
Внимание поле Field1 должно быть определено в интерфейсе IAppSetting

Пример показан для Ninject

С++. Дважды прочитать файл. Библиотека fstream

Доброго времени суток.
Возник такой вопрос. Как в библиотеке fstream дважды прочитать файл без его закрытия?
Нашел функции rewind() и fseek(file,0L,SEEK_SET), но они отказываются работать, если открывать файл не функцией fopen из библиотеки stdio.h
Есть ли альтернатива для библиотеки fstream?


Ответ

Посмотрите на seekg(). И, если нарвались на конец файла или иные неприятности - не забывайте сбросить состояние ошибки с помощью clear()

Где найти исходники RichTextBox и FlowDocument?

Ищу исходники RichTextBox и FlowDocument.
У меня TextEditor унаследованный от RichTextBox
Свойства перекрываются этой строкой:
DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor), new FrameworkPropertyMetadata(typeof(TextEditor)));

public class TextEditor : RichTextBox
static TextEditor() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor), new FrameworkPropertyMetadata(typeof(TextEditor)));
Если её закоммнтировать то контроллер работает как RichTextBox.
Но не рааботают свойства TextEditor.
Без закомметирования - контроллер работает как TextEditor. Но в него нельзя вставлять картинки.
Частично пример моего кода здесь: Как вставить картинку в RichTextBox?
public class TextEditor : RichTextBox
public sealed class TextDocument : FlowDocument


Ответ

Набираем sourceof.net и ищем:
RichTextBox FlowDocument
Исходники тем со стилями можно найти локально в файлах Visual Studio. Например, у 2015-ой Студии они хранятся здесь:
%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\DesignTools\SystemThemes\Wpf
А строчкой
DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor), new FrameworkPropertyMetadata(typeof(TextEditor)));
вы перекрываете не свойства, а стиль контрола по-умолчанию: теперь он будет равен стилю, у которого TargetType выставлен в TextEditor
Стили кастомных контролов обычно задаются в файле Generic.xaml и выглядят следующим образом:

Важно понимать, что таким стилем переопределяется не только Template (по сути — разметка контрола), а и вообще все свойства базового стиля, т.к. BasedOn по-умолчанию равен null
Если в новом стиле нужно унаследовать некий существующий стиль (в вашем случае это стиль RichTextBox), и тем самым сохранить поведение и разметку RichTextBox, то укажите BasedOn явно, и не затирайте свойство Template
... ...

Можно ли из приложения на Framework 4 использовать библиотеку Framework 4,5

Допустим, есть ПК с Framework 4.5 и есть приложение, которое написано под 4,0.
Данное приложение расширяемое.
Возможна ли корректная работа такого приложения, если подсунуть ему DLL, которая будет собрано под 4,5?
Собственно, столкнулся с тем, что приложение собранное под 4,0 смогло работать с AngleSharp, который собран по 4,5. На машине пользователя стоял 4,5 фреймфорк . Не почудилось ли мне это? Всегда думал, что младший не может использовать функционал старшего.


Ответ

Коль скоро ваше приложение запускается под .NET 4.5, то вы можете загружать сборки, собранные под 4.5, и они будут работать корректно, вне зависимости от того, использованы ли в них фичи, которых не было в .NET 4.0. Потому что весь код -- и вашего приложения, и сторонней сборки -- будет работать под .NET 4.5.

Анимация display:none и opacity:0 для div блока

Здравствуйте!
Подскажите, пожалуйста, как одновременно совместить display:none и opacity
В данном случае, нужно, чтобы при наведении на

блоку(который находится внутри

Поведение таблиц в Lua при присваивании

Я новичок в lua, и для меня не очевидно такое поведение:
local a = { name = "A", counter = 0 }
function a:say () self.counter = self.counter + 1 print(self.name..": "..self.counter) end
local b = a b.name = "B"
a:say() -- результат B: 1 -- ожидалось A: 1 a:say() -- результат B: 2 -- ожидалось A: 2 a:say() -- результат B: 3 -- ожидалось A: 3 b:say() -- результат B: 4 -- ожидалось B: 1
Как мне скопировать новый экземпляр таблицы, а не наследовать от старой?


Ответ

В луа таблицы при присваивании не копируются,a и b - cсылки на таблицу, одну и ту же. Чтоб создать новую таблицу вам надо реализовать функцию копирования и использовать ее:
function table.copy (originalTable) local copyTable = {} for k,v in pairs(originalTable) do copyTable[k] = v end return copyTable end
local b = table.copy(a)

Почему нельзя сохраннять Activity в статическом объекте, при пересоздании

На официальном сайте Android'a имеется статья, где рекомендуется сохранять объемные объекты (а точнее их ссылки) изActivity, на время пересоздания, в фрагменте (который не имеет UI и не пересоздается).
Но я все же не могу понять: а почему нельзя использовать для тех же целей синглтоны? Получить его можно из любого экземпляра Activity (ссылки он, вроде как, тоже не теряет :)), так в чем же проблемы и почему это не является самым простым способом сохранения?


Ответ

Можно в Singleton, с одной поправкой: надо использовать естественный синглтон Android'а класс Application, который в любом месте можно получить через getApplication(). Технически надо создать собственный класс:
public class MyApplication extends Application { private MyData myData; private static MyApplication me;
public MyApplication() { me=this; }
public static MyApplication getApplication() { return me; } public MyData getMyData() { return myData; } }
Теперь в любом месте можно вызвать:
MyApplication.getApplication().getMyData();
или через контекст (если не нравится)
((MyApplication )context.getApplication()).getMyData();
P.S. Надо не забыть задекларировать MyApplication в манифесте.

С++ как передать строку в шаблон?

Число работает:
template class Parent {
};
class Child : public Parent<33> {
};
Но как передать строку?
template class Parent {
};
class Child : public Parent<"ololo"> {
};


Ответ

Нельзя использовать литеральную строку в шаблонах, так как не понятно, является ли она каждый раз разная, или той же самой. ПО этому придется создать переменную и использовать уже её:
template class Parent {
};
char text[] = "Ololo"; class Child : public Parent {
};

java. Необходимо исключить из строки элемент вида 123 123 321,09

Есть текстовый файл, кторый я хочу распарсить, а именно считать строку с данными но исключив из неё несколько элементов.
Примеры строк:
бла-бла-бла 12312312 бла-бла-бла-бла983-бла {1} {12 000 123,09} бла-бла-бла 123123123123 {3} {020 123,09} бла-бла-бла 12312312934393123 бла93-бла0-бла {123,09}
необходимо при считывании строки избавиться от чисел в фигурных скобках. Если что поставил фигурные скобки для выделения, по факту их нет. Как их исключить? Пробовал сплитовать регулярными выражениями что то типа:
String b = "строки"; String[] a = b.trim().split("^(?!0.*$)([0-9]{1,3}( [0-9]{3})?( [0-9]{3})?( [0-9]{3})?(,[0-9]{2})?)$")
Но подозреваю, что делаю не правильно. Прошу помочь примером.


Ответ

Попробуйте регулярное выражение (?:[\s,]\d{1,3})+$
b.replace("(?:[\\s,]\\d{1,3})+$", "");
Давайте разберёмся, что происходит:
(?: // Выделяем группу для повтора, но без захвата [\s,] // Пробельный символ или запятая \d{1,3} // От одной до трёх цифр )+ // Эта комбинация может повторяться $ // Всё это только в конце строки
Regex101.com

Как убрать #lorem из URL

Проблема в следующем. На сайте реализованы плавные якорные ссылки через https://github.com/cferdinandi/smooth-scroll Я дилетант в джаваскрипте и jQuery, поэтому не могли бы вы, пожалуйста, подсказать, каким образом можно реализовать это не через hash или как убрать "#"?


Ответ

Сделал минималистический пример на jQuery. В ссылку через # записывается id блока, к которому нужно перейти, однако в URL хеши не добавляются. Работает для любой ссылки на странице, в которой указан id блока для перехода.
// Page a Link Smooth Scrolling $("[href^='#']").click(function() { var idtop = $($(this).attr("href")).offset().top; $('html,body').animate( // Time animation {scrollTop: idtop}, 500); return false; });


Удалить конкретное activity из стека

Как удалить конкретное activity из стека? вот пример, есть activty A,B,C, пользователь переходит A->B->C, и в activty C в определенных условиях,
надо вернуться назад(activty B) (делаю finish) надо вернуться назад(сразу в activty A минуя activty B, при этом не пересоздавая activty A, как это сделать?)
//делаю так, он пересоздает activty A
Intent intent = new Intent(this, A); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);


Ответ

Городить код с запуском активити через onActivityResult() - нерационально. Следует назначить активити А android:launchMode="singleTask". И запустив startActivity(new Intent(this, A) активити А вытащится из стека не пересоздаваясь, попутно закрыв верхние активити.

Вращение текста вокруг оси Y

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

С Boxes - все обычные прямоугольные Boxes. Я просто не знаю с чего начать.
Мой код:
body { margin: 0px; margin-left: 15%; overflow: hidden; } .skewed { margin: -1px; height: 300px; border: 4px solid black; width: 70%; float: left; overflow: hidden; transform: perspective(200px) rotateY(45deg); } .skewed > img { filter: url("data:image/svg+xml;utf8,#grayscale") blur(3px); filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%) blur(3px); /* Chrome 19+ & Safari 6+ */ transition: 0.2s ease-in-out; } .skewed:hover > img { transform: scale(1.05); filter: none; -webkit-filter: grayscale(0%); }


Источник: Rotate text on th Y axis


Ответ

Это довольно просто с CSS 3D-transforms. Вы можете вращать каждый элемент по оси Y с помощью Transform:rotateY(xdeg);
Здесь пример:
div { font-size: 2em; width: 7em; margin: 0 auto; padding: 0.1em 0; text-align: center; transform: perspective(500px) rotateY(30deg); background: teal; } div:nth-child(2n) { transform: perspective(500px) rotateY(-30deg); background: tomato; }

some text
some text
some text
some text

Обратите внимание, что вам нужно будет добавить префиксы для поддержки браузера. Смотрите canIuse для получения дополнительной информации
Ответил: web-tiki

Как в DLL использовать пользовательский тип?

Есть dll на C++ и проект на C++. Как мне сделать так, чтобы функция в dll принимала ссылку на экземпляр некоторого класса (пользовательский тип, а не char или int) из проекта и обрабатывала его? Нужно ли описание этого класса вынести в отдельный хедер и включить его и в dll и в проект? Планируется использование динамического подключения dll к проекту.


Ответ

Нужно ли описание этого класса вынести в отдельный хедер и включить его и в dll и в проект?
Да, именно так, если вы хотите полноценно использовать этот класс внутри вашей DLL. "Полноценно использовать" - это значит иметь возможность объявлять объекты этого класса и/или доступаться к его членам.
Разумеется, если ваш класс содержит члены с не-inline определениями, то придется организовать соответствующую инфраструктуру. Члены класса будут объявляться в одном модуле (DLL или EXE), экспортироваться оттуда и импортироваться остальными модулями (DLL или EXE) (см. __declspec(dllexport) и пр.) Эти моменты зависят от реализации, но я подразумеваю, что вы ведете речь о MSVC.

Эквиваленты ли следующие операторы?

Допустим у меня есть инициализированная строка string s. Являются ли следующие операторы эквивалентными в плане поведения? Генерируется ли разный IL мне не важно.
// 1 s = s + "";
// 2 s = s ?? "";
// 3 s = $"{s}";
Если в каких-либо случаях есть отличия, то, пожалуйста, укажите их.


Ответ

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

Что представляет собой покупка доменного имени с технической точки зрения?

Несмотря на свою деятельность в веб-разработке, пока ещё не достиг глубокого понимания сущности интернета и этот вопрос - один из шагов на пути к осмыслению.
В Википедии, в статье "Интернет" среди юридических аспектов и общих свойств интернета приведено:
У Интернета нет собственника, так как он является совокупностью сетей, которые имеют различную географическую принадлежность.
Если это прочитает человек, не имевший ранее дело с интернетом, он наверняка может прийти в выводу, что всё, что нужно для опубликования своего сайта в интернет - подключённый к интернету компьютер и никаких хостинговых компаний и регистраторов доменных имён.
Насколько я уже знаю, для того, чтобы начать "транслировать" свой сайт в интернет, нужно открыть 80-ый порт (например, с помощью веб-сервера Apache, который является ПО). Конечно, безопасность персонального для компьютера такой трансляции - уже другой вопрос. Но что представляет собой технически покупка доменного имени? Почему мы не можем присовить произвольное доменное имя своему сайту хотя бы в пределах некоторых доменных зон и транслировать его со своего компьютера под этим доменным именем? Выходит, у интернета всё-таки есть собственник, который наделяет правом регистраторов доменов продавать эти доменные имена?


Ответ

Собственника у Интернета нет, но есть координатор. Исторически сложилось так, что координатором является ICANN
Почему же мы не можем просто так взять произвольное имя? Потому что это имя должно быть известно всем и однозначно разрешаться в IP-адрес компьютера. Для этого служит DNS. И именно за внесение записи в эту глобальную для всего мира таблицу соответствия имён и IP-адресов вы и платите при покупке доменного имени.
Можно ли не платить? Можно. Например, можно вписать соответствие имени и IP в локальный файл hosts. Но тогда сайт будет доступен только с тех компьютеров, где мы этот файл изменили. Можно поднять свой собственный DNS-сервер, на котором указать наше имя и использовать этот сервер для всех компьютеров, которым нужен наш сайт. Но вряд ли произвольный пользователь в Сети согласится на это. К тому же, если каждый сайт сделает такой сервер, то для клиента будет абсолютно неудобно этот адрес DNS-сервера постоянно переписывать. (Но это хорошее решение для внутренних сетей организаций.) Поэтому большинство предпочитает заплатить и не мучиться.
Есть ещё один способ получить имя бесплатно. Надо найти того, кто уже купил имя второго уровня (или более низкого), например, example.org, договориться с ним и попросить внести запись более низкого уровня, например, vasya.example.org. Это можно сделать, поскольку владелец домена может прописывать любые записи для всех поддоменов.

Распознавание символов и работа с изображенями

Имеется нейронная сеть, способная распознавать символы. При загрузке рисунка из Paint размеров 150 на 150 всё работает нормально.Фон здесь белый, буква нарисована чёрным цветом.

При загрузке картинки ( также 150 на 150) с прозрачным фоном программа работает "наоборот"
Для удобства понимания вывел цвета пикселей( во втором случае первый пиксель, который является прозрачным, почему-то распознаётся как чёрный, а чёрный соответственно не является почему-то чёрным).
Первая и вторая картинка имеет одинаковый формат .png
Каким образом можно настроить программу для работы с изображением на прозрачном фоне?
Метод считывания картинки
public void get(Bitmap map) { for (int x = 0; x < mbut.GetLength(0); x++) { for (int y = 0; y < mbut.GetLength(1); y++) { Color col = map.GetPixel(x, y); if (col.R == 0 && col.B == 0 && col.G == 0) mbut[x, y] = true; else label9.Text = "Цвет пикселя номер " + x + ":" + y+" "+ Convert.ToString(map.GetPixel(x, y)); } } label10.Text = "Цвет первого пикселя: " + Convert.ToString(map.GetPixel(0, 0)); }
Метод прорисовки весов
public void draw(int n) { using (Bitmap map = new Bitmap(150, 150)) { for (int x = 0; x < weight.GetLength(0); x++) { for (int y = 0; y < weight.GetLength(1); y++) { if (weight[x, y] > 1) { map.SetPixel(x, y, Color.Black); } } } map.Save(String.Format("Pictures/{0}.png",n), System.Drawing.Imaging.ImageFormat.Png); } }


Ответ

Предполагаю что проблема в работе с каналами цветного изображения в цветовой схеме ARGB. Когда Paint сохраняет изображение, он приводит её к RGB и проблем не возникает. При других редакторах цветовая схема остается ARGB
Вот какая складывается ситуация:
Вы берете цветовой схемы, в первом случае это RGB, и по каналу R определяете черный это или не черный. В итоге инициализация проходит успешно.
Во втором случае с схемой ARGB, в которой изображение имеет прозрачность, первым каналом является A - alpha(оно-же прозрачность) вы пытаетесь по прозрачным цветам определить черный и сталкиваетесь с ситуацией когда все пиксели которые прозрачны - получают черный цвет а те которые не прозрачны остаются белыми. В этом и кроется секрет вашей хитроумной инверсии :)

Помогите разобраться с селекторами css

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



Ответ

Для добавления стиля к элементам на основе нумерации в дереве элементов используется псевдокласс :nth-child
.class:nth-child(odd | even | <число> | <выражение>) {... // Styles }
Значения
odd - Все нечетные номера элементов.
even - Все четные номера элементов.
число - Порядковый номер дочернего элемента относительно своего родителя. Нумерация начинается с 1, это будет первый элемент в списке.
выражение - Задается в виде an+b, где a и b целые числа, а n — счетчик, который автоматически принимает значение 0, 1, 2...
Примеры
В вашем случае для стилизации второго элемента используйте псевдокласс :nth-child(2)
.child{ background:green; width:150px; height:100px; } .child:nth-child(2){ background:#ccc; width:100px; height:50px; }


А для стилизации первого элемента используйте псевдокласс :nth-child(1) или же :first-child
.child{ background:green; width:150px; height:100px; } .child:first-child{ background:#ccc; width:100px; height:50px; }

Масштабируемая сетка из шестигранников

Я загрузил из Интернета несколько изображений на мой сайт . Можно ли придать всем этим образам шестигранную форму в responsive grid?


...
Я нашел несколько способов сделать это, но мне необходимо заполнить src изображения в коде CSS. Это не подходит мне, потому что сайт загружает случайные изображения из интернета с jQuery, поэтому я не могу их использовать как фоновые изображения.
Я собираюсь поддерживать WebKit браузеры, Firefox, IE8 было бы хорошо, но не нужно - и мобильные браузеры
Моя попытка здесь: jsfiddle
перевод вопроса: Responsive grid of hexagons


Ответ

Здесь demo и репозиторий для responsive grid of hexagons. Код здесь не поддерживается. Он был перемещен в GitHub и сильно улучшены комментарии, вопрос отчетности и взносы должны быть сделаны туда.

Этот метод использует:
тег неупорядоченный список: каждый шестиугольник содержится в теге

  • и теге Использование transform rotateи skew, чтобы сделать шестигранные формы overflow:hidden; дочерние элементы nth-child() заполняют шестигранник в качестве pattern
    И еще, чтобы создать шестигранную сетку с тегом .
    Характеристики шестигранной сетки :
    Сетка будет реагировать, как это полагается, на изменение процентов ширины. Шестиугольники поддерживают своё соотношение сторон в соответствии с приемом padding-bottom technique и изображения изменяют размер, чтобы соответствовать форме шестиугольника. hover эффект поверх шестиугольников: текст скользит с прозрачным наложением над изображением. Каждый шестиугольник сохраняет свои границы: эффект hover (или событие click ) для каждого шестиугольника срабатывает только внутри реальной фигуры.
    Полный код
    Следующий фрагмент кода не является последней версией сетки. GitHub repo сохраняется и до настоящего времени. Вопросы и вклады могут быть сделаны там.
    * { margin: 0; padding: 0; } body { font-family: 'Open Sans', arial, sans-serif; background: rgb(123, 158, 158); } #hexGrid { overflow: hidden; width: 90%; margin: 0 auto; padding:0.707% 0; } #hexGrid:after { content: ""; display: block; clear: both; } .hex { position: relative; list-style-type: none; float: left; overflow: hidden; visibility: hidden; -webkit-transform: rotate(-60deg) skewY(30deg); -ms-transform: rotate(-60deg) skewY(30deg); transform: rotate(-60deg) skewY(30deg); } .hex * { position: absolute; visibility: visible; } .hexIn { display:block; width: 100%; height: 100%; text-align: center; color: #fff; overflow: hidden; -webkit-transform: skewY(-30deg) rotate(60deg); -ms-transform: skewY(-30deg) rotate(60deg); transform: skewY(-30deg) rotate(60deg); -webkit-backface-visibility: hidden; backface-visibility: hidden; } /* HEX CONTENT */ .hex img { left: -100%; right: -100%; width: auto; height: 100%; margin: 0 auto; } .hex h1, .hex p { width: 90%; padding: 0 5%; background-color: #008080; background-color: rgba(0, 128, 128, 0.8); font-family: 'Raleway', sans-serif; -webkit-transition: top .2s ease-out, bottom .2s ease-out, .2s padding .2s ease-out; transition: top .2s ease-out, bottom .2s ease-out, .2s padding .2s ease-out; } .hex h1 { bottom: 110%; font-style: italic; font-weight: normal; font-size: 1.5em; padding-top: 100%; padding-bottom: 100%; } .hex h1:after { content: ''; display: block; position: absolute; bottom: -1px; left: 45%; width: 10%; text-align: center; z-index: 1; border-bottom: 2px solid #fff; } .hex p { padding-top: 50%; top: 110%; padding-bottom: 50%; } /* HOVER EFFECT */ .hexIn:hover h1 { bottom: 50%; padding-bottom: 10%; } .hexIn:hover p { top: 50%; padding-top: 10%; } /* SPACING AND SIZING */ @media (min-width:1201px) { .hex { width: 19.2%; /* = (100-4) / 5 */ padding-bottom: 22.170%; /* = width / sin(60deg) */ } .hex:nth-child(9n+6), .hex:nth-child(9n+7), .hex:nth-child(9n+8), .hex:nth-child(9n+9) { margin-top: -4.676%; margin-bottom: -4.676%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(9n+6):last-child, .hex:nth-child(9n+7):last-child, .hex:nth-child(9n+8):last-child, .hex:nth-child(9n+9):last-child { margin-bottom: 0; } .hex:nth-child(9n+6) { margin-left: 0.5%; clear: left; } .hex:nth-child(9n+10) { clear: left; } .hex:nth-child(9n+2), .hex:nth-child(9n+ 7) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(9n+3), .hex:nth-child(9n+4), .hex:nth-child(9n+8) { margin-right: 1%; } } @media (max-width: 1200px) and (min-width:901px) { .hex { width: 24.25%; /* = (100-3) / 4 */ padding-bottom: 28.001%; /* = width / sin(60deg) */ } .hex:nth-child(7n+5), .hex:nth-child(7n+6), .hex:nth-child(7n+7) { margin-top: -6.134%; margin-bottom: -6.134%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(7n+5):last-child, .hex:nth-child(7n+6):last-child, .hex:nth-child(7n+7):last-child { margin-bottom: 0; } .hex:nth-child(7n+2), .hex:nth-child(7n+6) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(7n+3) { margin-right: 1%; } .hex:nth-child(7n+8) { clear: left; } .hex:nth-child(7n+5) { clear: left; margin-left: 0.5%; } } @media (max-width: 900px) and (min-width:601px) { .hex { width: 32.666%; /* = (100-2) / 3 */ padding-bottom: 37.720%; /* = width / sin(60) */ } .hex:nth-child(5n+4), .hex:nth-child(5n+5) { margin-top: -8.564%; margin-bottom: -8.564%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(5n+4):last-child, .hex:nth-child(5n+5):last-child { margin-bottom: 0; } .hex:nth-child(5n+4) { margin-right: 1%; margin-left: 0.5%; } .hex:nth-child(5n+2) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(5n+6) { clear: left; } } @media (max-width: 600px) { .hex { width: 49.5%; /* = (100-1) / 2 */ padding-bottom: 57.158%; /* = width / sin(60) */ } .hex:nth-child(3n+3) { margin-top: -13.423%; margin-bottom: -13.423%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(3n+3):last-child { margin-bottom: 0; } .hex:nth-child(3n+3) { margin-left: 0.5%; } .hex:nth-child(3n+2) { margin-left: 1%; } .hex:nth-child(3n+4) { clear: left; } }

    Изменение количества шестиугольников в ряду
    Сетка адаптирует количество шестиугольников в ряду в зависимости от ширины окна просмотра. С пятью шестиугольниками на экранах шире, чем 1200px, и до 2-х на экранах уже, чем 600px.
    Если вам не нужны media queries, но просто хотите изменить количество шестиугольников в строке, то вы можете сохранить CSS из соответствующего media queries и затем удалить ненужные из них.
    Для получения дополнительных настроек см. sizing and spacing of hexagons.
    Demos
    Для получения списка всех демок, посмотрите эту коллекцию на codepen: Responsive grids of hexagons с разным числом шестиугольников в каждом ряду, а также опции центрирования и многое другое ...
    Вот оригинал codepen demo с .pusher элементом, чтобы сделать неправильную сетку из шестиугольников. .pusher элемент используется для создания "дыр" в сетке с пустыми шестиугольниками.
    Перевод ответа: @web-tiki