Почему не работает normalize css

Нормальный сброс

Расскажите про ресеты и нормалайзы, что лучше использовать?

Знаете, это как отвёртка и молоток — что лучше? Все хороши.

HTML хорош тем, что вы набросали тегов и всё — они сразу выглядят. И во всех браузерах всё примерно одинаково: чёрным Таймсом по белому , да с синими ссылками. Эх, красота! Но в том и дело, что почти: точные стили для всех элементов хоть и рекомендованы сегодня в HTML5, но в каждом браузере свои.

В HTML 4 было всего 78 строк стилей по умолчанию, вроде head < display: none >или text-decoration: underline для ссылок. В WebKit, Chrome и Firefox сегодня около 1000 строк стилей, в которые смело можно снаряжать археологическую экспедицию. Но мы не будем, у нас и так дел хватает.

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

Звёздочка выбирает все элементы, а дальше начинается: margin: 0 , padding: 0 , border: 0 , джоффри , серсея , фрей и все остальные свойства, которые мешают вам жить. Способ довольно варварский: не только потому, что выбирает элементы, которым ничего не нужно сбрасывать, но и потому, что некоторые стили лучше не трогать, иначе всё развалится — например, элементы форм.

Читайте также:  Сломался кран кого вызывать

Следующей попыткой сделать из HTML стерильный набор кубиков, стал CSS Reset из Yahoo UI, который сбрасывал стили только там, где это было нужно. Ещё большую популярность получил Reset CSS Эрика Мейера, сделанный по мотивам Yahoo UI. Эти ресеты не только сбрасывали отступы, но и приводили к единому значению размер и семейство шрифта, выравнивание для текста и другие свойства.

Между ресетами Yahoo и Мейера были различия: Эрик, например, разумно не трогал элементы форм. Было много других решений, но все они решали единую задачу — сделать из сложных стилей по умолчанию простой констуктор, чтобы вы сразу могли писать свои стили, не сбрасывая встроенные.

Эти ресеты никогда не были чистыми сбросами браузерных стилей: нет-нет, да назначались цвета, выравнивание, начиналась борьба за кроссбраузерность. В итоге все проекты несли печать предпочтений конкретных авторов. Самым нейтральным из ресетов до сих пор остаётся Reset CSS Мейера, но даже он убрал вредный :focus < outline: 0 >— и правильно сделал.

Многих ресеты раздражали: для внутренних блоков с содержимым приходилось восстанавливать стили не только для списков, но и базовых текстовых элементов вроде , , «` и других. У Yahoo даже был CSS Base, который назначал правильные базовые стили. После ресета, который отменял неправильные. Почему бы и нет.

Николас Галлахер и Джонатан Нил зашли с другой стороны: вместо того, чтобы сбрасывать примерно одинаковые браузерные умолчания, они подробно изучили все различия и проблемы — и сделали Normalize.css. Он делает везде одинаково и решает много проблем по пути.

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

Видите? Совсем другую задачу решает проект. Я на днях видел сайт, на котором после Normalize.css подключают Reset CSS, чтобы оставить нормализацию, но при этом получить нейтральный конструктор. Это конечно глупости, которые приводят к распуханию глобальных стилей. Уж лучше собрать свой гибрид — кода там всего ничего.

Благо Normalize.css дотошно документирован: у каждого свойства стоит объяснение зачем оно нужно. В сомнительных местах, которые не нормализуют, а назначают более подходящие (по мнению авторов) умолчания — стоят пометки. Это помогает не просто слепо копировать его из проекта в проект, а использовать только нужные части.

Представьте, что вы в рамках проекта делаете модуль, который потом будет использоваться на другом сайте. У вас есть Normalize, а у них? Или наоборот: на ваш проект приходит сторонний модуль — а там нет Normalize и всё подогнано под браузерные баги, ну или особенности. Или даже есть Normalize, но другой версии. Так себе модульность получается.

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

Источник

Кастомный подход для нормализации и сброса стилей (custom-reset.css)

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

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

Надеюсь вы подчеркнете для себя что-то полезное, здесь вы можете ознакомиться с ним.
custom-reset.css

Краткое описание

Определение блочной модели

Такое определение дает возможность переопределить box-sizing , в случае необходимости, для определенной области, например, если на проект был добавлен компомент у которого был box-sizing: content-box;

Базовые настройки

  • text-rendering — определяет как браузеру оптимизировать рендеринг текста.
    optimizeLegibility – качественное отображение важнее скорости, разрешает кернинг и лигатуры.
  • text-decoration-skip: objects;
    Делает подчеркивание с помощью text-decoration: underline; необрывистым (там где это работает).

  • -webkit-text-size-adjust: 100%; — запретить корректировку размера шрифта после изменения ориентации в iOS.
  • -webkit-font-smoothing: antialiased; — делает текст более тонким в Сафари на Маках (начертание сглаженное и четкое одновременно, приятно читать.).
  • -webkit-tap-highlight-color: transparent; — убирает синее подсвечивание при клике на девайсах.


    focus это важно, а outline нет

    Состояние фокуса это очень важный момент для взаимодействия с интерективными элементами. (Как и почему здесь). Но outline зачастую не вписывается в дизайн. И сами дизайнеры редко прорисовывают это состоние, потому частой практикой стало дублирование стилей ховера.

    Это ленивый способ.

    Нормальные дизайнеры всегда прорисовывают состояние фокуса.

    Три основных состояния должны всегда присутствовать на каждом интерактивном элементе ( :hover, :focus, :active ).

    Отступы

    Отступы обнулены, текстовые свойства наследуются.

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

    Текстовый контент тоже нужно уметь правильно верстать выставляя правильные отступы и высоту строки.

    Вот статья на эту тему.

    О том, каким может быть пользовательский контент:

    Текстовые элементы

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

    Цвет и подчеркивание ссылки мешает когда эта ссылка в виде кнопки или в виде большой кнопки с картинкой и текстом.

    Элементы форм:

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

    Бывает, возникают неудобства с кнопками при смене тегов, чаще всего это бывает с ссылки на кнопку и наоборот.

    (Тег button нельзя использовать как флекс контейнер. На IOSах сломается.)

    fieldset и legend

    Часто встречал, что эти семантические элементы форм использовались в декоратиыных целях.

    Никогда так не делайте, это пример худшей практики. Вот пару примров с нормальной реализацией:

    (Тег fieldset нельзя использовать как флекс контейнер. Не работает просто.)

    select

    Отменяем стандартное отображение select’а

    → Оформляем select сами: codepen

    placeholder

    Плейсхолдер наслудует цвет. Исчезает при фокусе.

    svg (работа с иконками)

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

    Расскажу, как мы работаем с иконками:

    Иконочный шрифт мы не используем.

    У нас есть 2 типа иконок:

    — одноцветные
    — цветные (иконки и мелкие изображения).

    Все они в формате svg.

    Для одноцветных используется svg спрайт, котрых хранится отдельно, и кешируется. Выглядит это так:

    И инклюдится на страницу он так:

    И стили для него: (этот код добавляется в файл)

    Для цветных используется css спрайт:

    И стили для него:

    Загружается css спрайт асинхронно

    Генерируется это, понятное дело, галпом.

    Что дает такой подход

    Для иконки делается контейнер нужного размера и не зависимо от того, будет иконка цветной или нет, она в него отлично впишется.

    hidden

    Атрибут, который скрывает элемент. Пригодится.

    :disabled

    Правильный курсор. Так как задизейбленной кнопкой может быть ссылка, то псевдокласс уже не сработает, так как ссылка не элемент формы. Для этого добавляйте класс.

    ::-ms-clear

    Псевдоэлемент в инпуте IE для очистки текста.

    :-webkit-autofill

    С помощью внутренней тени закрашиваем этот псевдоэлемент под нужный цвет. И наследует заданный цвет.

    ::selection

    Классы

    .clearfix

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

    .visually-hidden

    Для семантики: Когда надо спрятать заголовок, который должен быть, но его нет в дизайне. Скрытие этим способом не игнорируется скринридером.

    Для кастомизация цекбоксов/радиобаттонов:

    Скрывать с помощью display: none; или атрибута hidden плохая идея, так как инпут теряет способность получать фокус, а фокус (как мы знаем) это важно.

    А если скрывать с помощью класса .visually-hidden то инпут не теряет способность получать фокус.

    Метод «padding-bottom» для изображений (.cover-pic, .contain-pic.)

    В работе с изображениями, а именно с тегом

    есть некоторые сложности:

    • Пока изображение не загрузилось, оно не имеет высоты, что обычно приводит к дерганью верстки при подгрузке.
    • Если изображение не загрузилось, верстка может «ломаться».
    • Не подходящие размеры и пропорции изображений.

    Метод «padding-bottom» отлично подходит для решения этих проблем. Контроль размеров изображения происходит за счет обертки.

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

    И чтоб этого не происходило, высота задается за счет padding в % для псевдоэлемента обертки (:before). Как известно padding в % берет значение ширины родителя, не зависимо заданы вертикальные или горизонтальные значения.

    (padding в % некоректно отображается в мозиле, если он задан флекс итему).

    Само изображение нужно спозиционировать абсолютно относительно обертки. Когда необходимо, чтоб изображение занимало все пространство (на подобии background-size: cover;). Используется класс .cover-pic

    Когда необходимо, чтоб изображение занимало не все пространство (на подобии background-size: contain;). Используется класс .contain-pic

    В итоге получается:

    • Изображение резинится.
    • Имеет нужные пропорции (заданы дизайном).
    • Не дергает контент при подгрузке.

    Из недостатков: Поддержка object-fit IE. Потому приходится использовать полифил.

    Тем же методом сверстаны изображения в инстаграмме, только они нарезаются нужной формы и необходимость в object-fit отпадает.
    → Пример

    Прижатие футера

    Фикс при прижатии футера для IE. В блоке с min-height (которым в данном случае служит body) flex некоректно работает.

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

    Так почему не ресет или не нормалайз? Они не могут полноценно подготовить проект, в любом случае приходится немало дописывать, и потому практически у каждого верстальщика есть свои наработки.

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

    P. S. Советую ознакомиться с публикацией Организация отступов в верстке (margin/padding). И советую использовать css линтеры. И кому интересно, может решить css задачку.

    Источник

  • Оцените статью