• Сколько всего тегов в HTML (HTML5)?

    s0ci0pat
    @s0ci0pat
    I'm Awesome
    По последней спецификации в 14 категориях 104 элемента в которых 138 атрибутов, а так же 73 обработчика событий, 117 интерфейсов и 26 событий
    Ответ написан
    2 комментария
  • Socket.io, nodejs и mysql как организовать соединение для чата?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    конечно же первый вариант. А еще лучше - не одно постоянное соединение а целый пул соединений.
    Ответ написан
    4 комментария
  • Годные базовые курсы по HTML и верстки для новичка?

    @RaGe22
    HtmlAcademy
    htmlbook
    Плюс видео с ютюба/исходники сверстанных сайтов

    Понять теорию и не тянуть с практикой, взять какой нибудь простой макет и попытаться сверстать, найдется куча вещей которые по теории из головы делаются не так как кажется
    Ответ написан
    Комментировать
  • Годные базовые курсы по HTML и верстки для новичка?

    HTML Academy - хоть и нахожусь в веб-разработке уже довольно давно, порой захожу чтобы освежить в памяти тот или иной курс. Все очень хорошо показано на понятных интерактивных примерах
    Ответ написан
    Комментировать
  • Годные базовые курсы по HTML и верстки для новичка?

    @BLVST
    Frontend. Открыт к предложениям.
    htmlacademy.ru вполне себе годные
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    Здесь еще нужно очень хорошо разделять понятия авторизация и аутенфикация.

    Аутенфикация - это определения пользователя, то есть, что это за пользователь. Обычно этот этап проходит сразу же после ввода логина пароля. Если логин верный, ты мы и сразу можем сказать: "Пользователь аутенфицырован". К примеру, если использовать HTTP Basic аутенфикацию, то в случае не верного логина/пароля будет ошибка 401.

    Авторизация - это проверка прав пользователя к определенному ресурсу. К примеру, может ли пользователь редактировать какой-то материал (статью, коммент), может ли он просматривать какой-то ресурс.

    Очень часто еще может "всплыть" понятие "Фаервол" - это механизм определения для поведения системы аутенфикации/авторизации. К примеру: В личном кабинете, необходимо чтобы пользователь был обязательно авторизован, но вот на сайте (доки, другие страницы), нет. В результате, мы можем создать два фаервола, определяющих это поведение для разных URL-ов.

    Два этих механизма могут работать как угодно, так как Вы захотите, главное, это скажим соблюдать некие правила:
    1. Ни в коем случае не аутенфицировать по UserID, иначе, любой сможет получить доступ. К примеру: Вы сохраняете в куки только UserID для аутенфикации, тогда, кто-то сможет подменить со своей стороны куку, и ввойти под другим пользователем.
    2. Не храните в куках логин/пароль. Так как есть множество вирусов, которые могут прочитать куки и отправить на другой сервере.
    3. Пароль в БД должен быть хеширован, и проверка должна быть именно по хешам, а не по реальным паролям. Иначе, если кто-то у Вас свиснит БД, то очень вероятно, что и сможет получить доступ к множествам другим аккам, так как множество людей используют один и тот же пароль.

    Лично для своих проектов, я всегда использую Symfony Security, так как в этом пакете уже все сделано место Вас. Главное это верно подключить и настроить, и вауля :)
    Ответ написан
    1 комментарий
  • Есть ли примеры разработок сложного интерактивного сайта?

    @eskrano
    а попробуйте посмотреть интересные стримы на Livecoding.tv
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    deemytch
    @deemytch
    linux root, ruby/perl programmer, sql, backend.
    Если совсем коротко, то суть авторизации заключается в том, что пользователь взамен своего пароля и логина получает какую-то длинную малопредсказуемую строку, которую хранит все время сессии на своей стороне и предъявляет серверу на каждый чих. И кроме сервера эту строку никому-никому.

    А сервер хранит эту строку у себя, с привязкой к записи пользователя.

    Дополнительные детали - это хранение этой строки с ограничением по времени, с привязкой к IP адресу, версии браузера и другим деталям, с тем, чтобы можно было регулировать количество одновременных сессий, время сессии, и пытаться обнаружить воровство этой строки. Строка обычно называется хэш, хотя не факт. Строку можно не хранить, а сверять с другим хэшои, получаемым из первого. И так далее по мере роста фантазии и извращённости мыслей.
    Ответ написан
    Комментировать
  • Как правильно выставить заголовок ответа в IAS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Для этого не нужно писать код, можно в конфигах приложения, т.е. в /applications/appName/config/application.js задать параметр allowOrigin: '*' или вместо звезды там написать домен или маску доменов.
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    С полного нуля. Пользователь вводит логин + пароль:
    Пользователь входит через ВК


    Не имеет особого значения, ваша задача полученную информацию замапать на ID пользователя в ВАШЕЙ базе, с учетом необходимых проверок. ВК будет считаться доверенной стороной, т.е. ему вы доверяете процедуру проверки аутентичности юзера. Если аутентификация на вашей стороне - то проверяете вы (проверяете пароль по соленому хешу в базе, ну или как-то еще). Если у вас "быстрый вход" по ВК (без регистрации), то нужно сделать еще авторегистрацию, если userid не найден по данным от ВК. Правда, тут нужно быть готовым, что юзер захочет слинковать свои аккаунты, если он уже зарегался по логину/паролю. Ну или хотя бы предупредить при входе по ВК, что он в базе не найден и будет создан новый акк, чтобы он не удивлялся потом.

    Что писать в куки


    идентификатор сессии. Как уже сказали, должен быть сложным для копирования (скопированный идентификатор сессии - украденная сессия), уникальным. Погуглите алгоритмы или воспользуйтесь стандартыми. Сессии хранить или стандартными средствами, или попробовать редиску (там есть авто-expire, что приятно).

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

    проверять наличие сессии для данного пользователя (по ID пользователя с этапа аутентификации). Если сессия уже есть - убивать ее, создавать новую (новое устройство успешно зайдет, старое - "разлогинится"). Юзеру правда ничего не помешает скопировать идентификатор сессии из кукисов на другой девайс, так что можете еще в сессию IP писать, или user-агента (поменялся - пересоздаем сессию).

    А если с нескольких?

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

    Как на каждой странице организовать проверку авторизован пользователь или нет?

    идем в хранилище сессий (стандартные механизмы PHP/Redis), запрашиваем/стартуем сессию по идентификатору, пришедшему в куках. Если такой сессии нет (устарела, либо никогда и не было, идентификатор юзер сам придумал) - авторизацию не выполняем. Если сессия есть - то в зависимости от того, что мы там храним, либо достаем USERID, и пробиваем по основной БД его права, либо достаем права из самой сессии, если мы их там закешировали. "Выдача" прав - есть процедура авторизации. Теперь в зависимости от набора прав - меняем логику внутри скрипта. В больших системах применяют понятия ролей и групп - это все можно погуглить. Вкратце - при авторизации определяется, в каких группах состоит пользователь. Затем, по множеству групп сопоставляются роли, которые "играет" пользователь в системе (администратор данных/пользователей, администратор бэкапа, главбух, менеджер и т.д. и т.п.). Роли фиксированы, и зависят от логики приложения - в зависимости от имеющихся у пользователя ролей меняется и поведение приложения.
    Также сейчас можно встретить claim-based подход, особенно в asp.net - тоже погуглите.

    Что хранить в сессии?

    Как минимум - USERID, но можно еще и закэшировать информацию о его правах, чтобы не читать постоянно ее из основной базы. Плюс, тут же хранить данные, относящиеся к САМОЙ сессии, например тот же IP входа, время входа и т.д. Тут зависит от задачи.
    Ответ написан
    Комментировать
  • Как работать с картинками на gulp.js?

    ivandata
    @ivandata
    Веб разработчик
    Попробую ответить.
    1. Растр в спрайты. Под ретину можно 2@
    2. Есть несколько способов хранить и использовать svg спрайты. SVG спрайт — это всего лишь файл где поиск по svg элементам происходит по id.
    <symbol viewBox="0 0 21 21" id="add_icon">
        <title>add</title>
        <path d="M10.5 1C5.3 1 1 5.2 1 10.5S5.3 20 10.5 20s9.5-4.3 9.5-9.5S15.7 1 10.5 1zm0 1c4.7 0 8.5 3.8 8.5 8.5S15.2 19 10.5 19 2 15.2 2 10.5 5.8 2 10.5 2zM10 6v4H6v1h4v4h1v-4h4v-1h-4V6h-1z"/>
    </symbol>

    На странице используем тег 'use', где атрибут xlink:href — это ссылка на svg, у с указанием идентификатора, например:
    <svg class="ico-svg">
      <use xlink:href="/ico/ico-set.svg#add_icon"></use>
    </svg>

    Для поддержки отсталых браузеров используем полифил https://github.com/jonathantneal/svg4everybody. Управляем цветом через свойство fill
    3. Элементы интерфейса, такие, как иконки, лучше конечно в векторе хранить. Растр — сжимать.
    4. Мелкие элементы в base64. habrahabr.ru/post/116538
    Все это собирается, пакуется и т.д. сборщиками, все верно.
    Для SVG у нас используется очень замороченая система, которая: собирает svg-файлы от дизайнеров, клеит из них спрайт, генерирует png спрайты в разных цветах и генерирует стили для них. А еще парсит превью всего этого на отдельной странице, для теста.
    Мы используем gulp и плагины для этого:
    https://www.npmjs.com/package/gulp-optipng
    https://www.npmjs.com/package/gulp-raster
    https://www.npmjs.com/package/gulp.spritesmith
    https://www.npmjs.com/package/gulp-svg-sprite-plus
    https://www.npmjs.com/package/gulp-imagemin

    Еще один способ от Владимира Кузнецова. У него все проще, потому что задач таких, как у нас не стояло.
    Ответ написан
  • Как правильно подключать и использовать внешние модули в ImpressAS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Теперь подключение модулей несколько изменилось, для этого случая в /applications/my-app/config/sandbox.js в раздел api добавьте 'node-expat' и тереь из любого обработчика можно будет обращаться к нему как api.nodeExpat. Не забудьте обновить версию Impress до сегодняшней 0.1.372, там исправлена проблема с заменой тире в именах модулей, т.е. преобразованием spinalToCamel, например: node-expat в nodeExpat, потому, что писать api['node-expat'] как-то не красиво, лучше api.nodeExpat и я это поправил.

    Теперь о случае с аплоадом, в Вашем коде почему-то не видно где происходит аплоад файла, а сразу начинается парсинг. Если Вы хотите делать аплоад, то его нужно делать в обработчике post.js, а потом для парсинга уже и для других долгих операций ответветвлять процесс. Вообще, имеет ли смысл ответвлять процесс - это большой вопрос, потому как fork работает не быстро, а новый процесс ест память, так что, если парсинг быстрый (занимает десятки миллисекунд), то нет смысла его форкать, а если это несколько секунд блокирования процесса, то да - тут нужно форкать.
    Ответ написан
    Комментировать
  • В чем же сила Node.js ?

    BondDen
    @BondDen
    Есть еще один аспект: архитектура. В Node.Js формат работы с NPM (пакадж-менежер npmjs.com) стимулирует к инкапсуляции конкретного функционала в конкретные модули. Это, конечно, не Java и не C#, но сама амосфера сообщества стимулирует к разработке грамотной модульной архитектуры, пожалуй лучше, чем умные книги по "классике" Java и C++.
    Ответ написан
    Комментировать
  • Какие задачи нужно уметь выполнять на JS начинающему?

    copist
    @copist
    Empower people to give
    Какие задачи нужно уметь решать на чистом JS, перед тем как переходить к изучению библиотек и фреймворков?


    Кроме синтаксических конструкций, математических и логических выражений, нужно знать:
    • Область видимости переменных
    • Замыкания
    • Объектно-ориентированное программирование, в частности наследование через прототипы
    • Шаблон проектирования "модуль"
    • Операции над DOM
    • Понимание принципов событийно-ориентированного программирования
    Важно - нужно знать, откуда копипастить.
    Тебе нужно быть очень хорошо знакомым с одной-двумя-тремя популярными библиотеками на JavaScript. В идеале ты должен иметь представление о том, что определённый класс задач может быть решен с помощью определённых библиотек, хотя бы одной, но такие знания приходят с практикой. Вообще ты должен быть знаком с ними так близко, чтобы помнить, в какой части мануала по библиотеке можно найти описание форматов входных данных нужной тебе функции и какой будет результат, чтобы скопировать и вставить в свой код, а потом поправить, чтобы работало.

    Важно - инструменты программиста JavaScript
    У тебя должен быть удобный инструмент для разработки (IDE, Integrated Development Environment), чтобы он тебе подсвечивал код (syntax highlight) и подсказывал о синтаксических ошибках (syntax check), о формальных параметрах функций (type hinting), о стиле кодирования (code style), помогал писать код (live templates).
    Ты должен знать, как отлаживать скрипты в популярных браузерах (Firebug, Chrome Developer Tools и другое). Что такое точки останова, как управлять исполнением во время останова, как посмотреть и поменять содержимое переменных, как настроить останов по условию.

    Хотелось бы узнать что это за задачи(упомянутые вами 80%)


    Реальные задачи джунов:
    1. Возьми из сборника задач по javascript любой скрипт случайно и вслух расскажи, что он делает.
      Важно - читать и понимать чужой код намного важнее, чем писать свой. И на работе тебе это приддётся делать чаще, чем ты думаешь. Чтобы подключить к своему проекту чужую JS либу, нужно понимать что она делает, как она конфигурируется, как управлять её поведением. Скажу точно, что написать свой скрипт, который строит графики, намного сложнее, чем понять, как настраивается highcharts.

    2. Напиши скрипт на JS, который в заданном тексте удалит один или два символа, выбранных случайно
      1. Усложнение: удалять можно только буквы в словах, а знаки пунктуации и цифры удалять нельзя
      2. Усложнение: принять, что этот текст является программной на Javascript, удалить одну-две команды JS, но только если они не в строковых литерах (break как команду удалить можно, а в строке "break my heart" нельзя)
      3. Усложнение: воспользуйся этим скриптом и "попорти" код какого-нибудь другого скрипта на Javascript, а потом отладь, найди ошибку и восстанови работоспособность
      Важно - этим обычно все и занимаются - ищут баги. Только в реальной жизни они и без этого скрипта появляются. И не по одному, а прям пачками.

    3. На страницу HTML нужно встроить график курса доллара по отношению к рублю. Формат входного массива значений курса определи сам, исходя из своего скрипта для построения графиков.
      1. Усложнение: на одном графике должны быть два курса, по разным шкалам. Наприме, курс доллара к евро и курс юаня к рублю
      2. Усложнение: первоначально график вывести в детализации по месяцам, но чтобы можно было "приблизить" (drilldown) детализацию до дней
      3. Усложнение: первоначально график вывести текущем месяце, но чтобы можно было загрузить данные для предыдущего месяца без перезагрузки страницы (AJAX)

    4. При клике по картинкам, вставленным в текст HTML, показывать всплывающее окно для просмотра увеличенной картинки.
      1. Усложнение: в всплывающем окне сделать навигацию по картинкам, вперёд/назад и к нужной картинке
      2. Усложнение: в всплывающем окне вместо картинки показать видео-ролик с Youtube
      3. Усложнение: в всплывающем окне показать текст HTML

    5. По клику на кнопку "Click me" показать всплывающую форму.
      1. Усложнение: реализовать проверку данных на корректность перед отправкой формы (непустое значение, минимальное количество символов, максимальное количество символов, минимальное числовое значение, максимальное числовое значение)
      2. Усложнение: если в значении текстового поля встретилась гиперссылка, то считать её за 22 символа при любой длине этой ссылки (как в твитере)
      3. Усложнение: реализовать отправку формы на сервер через AJAX, без перезагрузки страницы
      4. Усложнение: саму форму в виде HTML загрузить с сервера через AJAX, в момент клика по кнопке "Click me", правила проверок данных должны как-нибудь "извлечься" из самой загруженной формы, например из аттрибутов полей ввода

    6. К форме ввода данных на поле ввода даты "навешать" всплывающий календарь для выбора даты.
      1. Усложнение: сделать форму календаря мультиязычной. Хотя бы через настройки на том же JavaScript
      2. Усложнение: сделать так, чтобы с помощью календаря можно было выбрать диапазон дат, чтобы она была привязана к двум полям формы "дата начала" и "дата окончания", и чтобы значение в поле "дата начала" обязательно была меньше чем в поле "дата окончания"
      3. Усложнение: сделать так, чтобы с помощью в календаре можно было видно визуально этот диапазон
      4. Усложнение: диапазон может быть открытым, но не пустым, то есть пользователь должен задать хотя бы дату начала или дату окончания.

    7. Сделать пред-просмотр веб-страницы HTML с разными темами. Тему страницы выбирать через селектор на javascript, а показывать в фрейме.
      1. Усложнение: сделать селектор "тип устройства", чтобы менять размер фрейма (например, "iPhone 5c 1136x640") и "чекбокс" для смены ориентации страницы "горизонтальная" или "вертикальная" (соответственно 1136x640 или 640x1136)
      2. Усложнение: в селекторе тем предусмотреть поиск тем по подстроке, и аналогично поиск устройств по части названия (авто-дополнение, auto-complete)
      3. Усложнение: тема страницы должна меняться без перезагрузки фрейма



    Задачи повышенной сложности, исходя из личного интереса
    1. Реализовать форму для многошагового мастера: форма должна состоять из нескольких страниц (шагов), пользователь может переключать страницы через какие-нибудь элементы управления "вперёд/назад" или "перейти на страницу".
      1. Усложнение: реализовать функциональную связь значений, когда некоторые данные зависят друг от друга (ввёл число в поле "количество" и в поле "сумма" значение пересчиталось)
      2. Усложение: доступность некоторых полей ввода должна зависеть от данных (например, если указал "есть личный самолёт", то значит можно ввести "марка самолёта")
      3. Усложение: видимость некоторых страниц должна зависеть от данных из предыдущих страниц (например, если указал "есть личный самолёт", значит появилась страница "ТТХ самолёта"; иначе страница должна скрыться)

    2. Реализовать однопользовательскую браузерную игру "змейка", "тетрис", "найди пару"
    3. Реализовать многопользовательскую браузерную игру "крестики-нолики", "морской бой" на два игрока в режиме "hot seat"
      1. Усложнение: два игрока на разных компьютерах, ходы передаются по websocket
      2. Усложнение: ограничение на ожидания окончания хода 15 секунд, по окончании ожидания автоматически делается случайный ход

    4. Реализовать todo-list. Пользователь вводит список, затем он превращается в строки с "чек-боксами". Когда "чекбокс" включен, строка зачёркивается.
      1. Усложнение: пользователь может переименовывать, удалять, добавлять строки
      2. Усложнение: список хранить в localStorage браузера, чтобы при перезагрузке страницы он восстанавливался
      3. Усложнение: пользователь может иметь несколько независимых списков todo

    5. Реализовать простой графический редактор. Пусть рисуется точка в месте, где пользователь кликнул.
      1. Усложнение: добавить переключатель режимов "точка"/"линия", в режиме "линия" рисуются линии между двумя последовательно кликнутыми точками
      2. Усложнение: можно менять толщину, цвет линий, размер точек
      3. Усложнение: последовательность кликов можно воспроизвести ещё раз с самого начала, равномерно или с реальной задержкой между кликами, с обычной скоростью или ускоренно
      4. Усложнение: можно выгрузить получившийся рисунок в формате PNG или SVG, причём SVG c анимацией воспроизведения



    Можно использовать любую существующую библиотеку.
    Например,
    для построения графиков www.highcharts.com
    для загрузки и передачи данных через AJAX: jquery.com + что-нибудь на сервере
    для всплывающих диалогов с картиками, видео и формами: fancyapps.com/fancybox и https://jqueryui.com/dialog/
    для валидации форм rickharrison.github.io/validate.js
    для календаря https://jqueryui.com/datepicker/
    для автодополнения https://jqueryui.com/autocomplete/
    для передачи данных между несколькими пользователями socket.io или обычный AJAX
    Ответ написан
    16 комментариев
  • Можно ли реализовать такой сценарий?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Ничего сложного в этом нет, вот только рекомендую переместить переменные, или скорее это константы в /init/constants.js, а то ведь на /server/requests.js они каждый раз создаются и теряются. Например так:
    application.constants = {
      'domain1.com': { field1: "value1", ... }
      'domain2.net': { field1: "value1", ... },
        ...
    };

    А в /server/requests.js их можно будет просто возвращать в зависимости от домена сайта:
    module.exports = function(client, callback) {
      client.cache('10m');  // кешируем на 10 минут
      // отдаем нужный набр переменных для сайта
      callback(application.constants[client.host]);
    };

    Ну и в /config/hosts.js настраиваем все на одно приложение:
    module.exports = [ '*' ];
    Ответ написан
    Комментировать
  • В чем писать конспекты?

    @LooksWorking
    Очень рекомендую попробовать любое MindMap-решение. XMind или Mindjet если Windows, Xmind если Linux и MindNode для Mac. Чтобы не терялось - DropBox/GDrive etc. Я много лет назад привык вести так все записи, конспекты, составлять план чего-либо или просто планы. Удобно, наглядно и быстро.
    Вики
    Ответ написан
    Комментировать
  • Есть какие-нибудь ресурсы по построению правильной серверной архитектуры на node.js/io.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Архитектурные принципы не очень связаны именно с нодой, они будут примерно одинаковыми, на каком бы языке вы не писали. Первое, что я могу посоветовать, когда Вы переходите от технологий программирования к архитектуре систем, это как переход от кладки кирпича к архитектуре зданий - нужно отложить все шаблоны, которые Вы знали до того и подняться на другой уровень абстракции. А именно, нужно перестать мыслить такими понятиями, как DI (dependency injection), REST, MVC, ORM, RPC, шаблонизаторы, компоненты, сокеты, промисы и прочее - это все технологии. Что же нужно понять это: слои (layers), модули, контракты, адаптеры, клиент-сервер, 3-звенная архитектура, микросервисы, СМО (системы массового обслуживания), и т.д. Где так все собрано в одном месте - не могу сказать, я лично по крупицам все осваивал, на что положил 20 лет профессиональной деятельности. Почитайте про ISO/OSI, загляните в три мои статьи habrahabr.ru/post/227753 и habrahabr.ru/post/204958 и habrahabr.ru/post/117791 Раньше хорошие статьи по архитектуре были на www.osp.ru но, к сожалению, давно не читал его. Можно начать с книг Гради Буча и освоения UML, этот дядька сформировал достаточно полный подход и методологию проектирования программных систем, которая ведет правильным путем, но на практике, в каждом отдельном случае может быть заменена интуицией архитектора и существенно упрощена. Удачи!
    Ответ написан
    6 комментариев
  • Как узнать обработчики событий на элементе?

    aen
    @aen
    Keep calm and 'use strict';
    В Chrome Dev Tools выделите нужный вам элемент и перейдите на вкладку Event Listeners (сайдбар во вкладке Elements).
    Ответ написан
    Комментировать
  • Почему нельзя задавать float:left всем блокам?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    Это правда.

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

    Вот вам пример сложности расположения плавающих элементов.

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

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

    Кстати, особенно смешно наблюдать использование float для построения горизонтальных лент с расчётом с помощью JS итоговой ширины. А вот для обтекания текстом плавающие блоки могут и должны использоваться. Стоп. Так они же для этого и были придуманы:)
    Ответ написан
  • Где найти перевод книги "think like a git"?

    Комментировать