Рецепты CSS

Рецепты CSS

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

Проблема

Стилизация одного угла элемента (обычно верхнего правого или нижнего правого) так, чтобы он выглядел загнутым, с разной степенью реализма — это дизайнерский прием, не теряющий своей популярности вот уже много лет. Сегодня в его применении нам помогают несколько решений на чистом CSS, первое из которых было опубликовано еще в 2010 году мастером работы с псевдоэлементами Николасом Галлахером. Основной путь решения — добавить два треугольника в верхнем правом углу: один для представления загнутого уголка страницы и второй — закрывающий собой угол главного элемента. Эти треугольники чаще всего создаются с помощью проверенного временем трюка с рамкой. В свое время эти решения смотрелись весьма впечатляюще, но сегодня мы понимаем, насколько они ограниченны. В некоторых ситуациях они попросту неприменимы: ‰ когда фон, находящийся позади нашего элемента, не залит сплошным цветом, а оформлен с использованием узора, текстуры, фотографии, градиента или фонового изображения любого другого типа; ‰ когда мы хотим загнуть уголок под другим углом, отличным от 45°, или же добавить легкое вращение.

В нескольких ранних версиях дизаqна веб-саqта http://css-tricks.com загнутые уголки исgользовались для оформления верхнего правого угла полей, содержащих отдельные статьи сайта
Существует ли более гибкое решение для создания загнутых уголков с помощью CSS, которое не буксует в подобных случаях?

Проблема

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

Разметка выглядит так:
HTML
<main>
<blockquote>
"The only way to get rid of a temptation[…]"
<footer>—
<cite>
Oscar Wilde,
The Picture of Dorian Gray
</cite>
</footer>
</blockquote>
</main>
Здесь мы используем термин подложка» для обозначения той части страницы, которая находится под элементом и которая проглядывает сквозь его полупрозрачный фон.
А CSS-код выглядит так (для краткости все незначительные детали опущены):
body {
background: url("tiger.jpg") 0 / cover fixed;
}
main {
background: hsla(0,0%,100%,.3);
}


Как вы видите, текст прочитать очень сложно, так как изображение яркое и содержит множество деталей, а фоновый цвет непрозрачен только на 25%. Разумеется, мы могли бы улучшить читабельность, увеличив параметр альфа-канала в определении фонового цвета, но тогда эффект будет не таким интересным. В традиционном печатном дизайне эту проблему часто решают путем размывания фрагмента фотографии, находящегося прямо под текстовым контейнером. Размытые фоны не такие шумные, и, следовательно, текст поверх них читается намного проще. Поскольку эффект размытия дорогостоящ в терминах вычислительных ресурсов, в прошлом эту технику невозможно было использовать на веб-сайтах и в дизайне пользовательских интерфейсов. Однако графические процессоры непрерывно совершенствуются, а аппаратное ускорение становится доступным все в большем количестве разнообразных сценариев, поэтому сегодня мы сталкиваемся с эффектом размытия в оформлении интерфейсов довольно часто. За последние несколько лет нам довелось повстречать эту технику в новых версиях как Microsoft Windows, так и Apple iOS и Mac OS X.


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


В последние годы полупрозрачные пользовательские интерфейсы с размытой подложкой встречаются все чаще, так как нагрузка на системные ресурсы, которую оказывает эффект размытия, перестала быть чрезмерно дорогой (слева -  фрагмент интерфейса из Apple
iOS 8.1; справа - фрагмент интерфейса из Apple OS X Yosemite).

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

 

Проблема

Добавление цветового тона к изображению в оттенках серого (или к изображению, преобразованному в оттенки серого) — популярный и элегантный способ придания визуального единообразия группе фотографий, выполненных в совершенно непохожих стилях. Часто этот эффект применяется статически и убирается по событию  :hover и/или при других вариантах взаимодействия с изображением. Традиционно мы создаем две версии изображения в графическом редакторе и добавляем немного простого CSS-кода, задача которого — подменять одну версию другой. Этот подход работает, но он раздувает исходный код и требует дополнительных HTTP-запросов, а сопровождать такой веб-сайт — это настоящая головная боль. Представьте, что было принято решение изменить цвет, использующийся для создания этого эффекта. Вам придется перебрать все изображения и создать для каждого новую монохромную версию! Другие подходы включают наложение полупрозрачного цвета поверх изображения или изменение степени непрозрачности изображения и наложение его на подложку сплошного цвета. Однако это не настоящий тон: в таком решении не только цвета изображения не преобразуются в оттенки целевого цвета, но и существенно снижается контрастность.

Этот эффект используется для оформления фотографий лекторов. Полноцветное изображение оказывается при наведении указателя мыши и переводе фокуса на выбранный элемент
Также существуют сценарии, превращающие изображения в элемент  <canvas> и применяющие тон средствами JavaScript. При этом действительно получается реальное тонированное изображение, но решение работает очень медленно и накладывает множество ограничений. Согласитесь, было бы намного проще и удобнее применять цветовые тона к изображениям прямо в коде CSS?

Проблема

Свойство  box-shadow прекрасно работает, когда нам требуется тень, отбрасываемая прямоугольником или любой другой фигурой, которую можно создать с помощью border-radius (несколько примеров вы найдете здесь). Однако от него гораздо меньше пользы, когда мы работаем с псевдоэлементами или другими полупрозрачными вариантами декорирования, потому что  box-shadow бессовестно игнорирует прозрачность. Приведу несколько примеров:‰ полупрозрачные изображения, фоновые изображения и рамки, созданные с применением  border-image (например, винтажная рама с позолотой); ‰ штрихпунктирные рамки, рамки с точечным пунктиром и полупрозрачные рамки без фона (или со значением  background-clip , отличным от  border-box ); ‰ облачко с текстом, указатель для которого создан с помощью псевдоэлемента; ‰ скошенные углы, аналогичные тем, которые мы учились делать в секрете "Как срезать углы на css"; ‰ большинство эффектов загнутого уголка, включая описанный далее в этой
главе; ‰ контуры, создаваемые с помощью  clip-path , например ромбовидные изображения из секрета «Как сделать ромб на css».

 Элементы, стилизованные с помощью CSS, с которыми использование box-shadow теряет всякий смысл (здесь применяется значение свойства box-shadow, равное 2px 2px 10px rgba(0,0,0,.5))
Существует ли решение для подобных случаев или нам придется вообще отказаться от использования теней?

Проблема

Один из наиболее часто задаваемых вопросов относительно свойства  box-shadow, которые я получаю на веб-сайтах с вопросами и ответами, — как создать тень только с одной стороны (или, реже, только с двух). Быстрый поиск по  http://stackoverflow.com возвращает около тысячи результатов по данному запросу. И ничего удивительного, ведь отображение тени только с одной стороны создает более утонченный, но настолько же реалистичный эффект. Часто потерявшие надежду разработчики даже отправляют сообщения в список рассылки рабочей группы CSS, запрашивая создание новых свойств вроде  box-shadow-bottom,которые могли бы обеспечить такой результат. Однако подобные эффекты уже возможны при умном использовании старого доброго свойства  box-shadow, которое мы все знаем и любим.

Как сделать тень с одной стороны

Проблема

Секторные диаграммы — даже в самой простой своей двухцветной форме — всегда славились сложностью создания с помощью веб-технологий, несмотря на широкое распространение и массу вариантов использования: от представления простых статистических данных до индикаторов прогресса и таймеров. Реализации чаще всего означают создание нескольких изображений для разных значений секторной диаграммы во внешнем графическом редакторе или необходимость прибегать к помощи объемных каркасов JavaScript, предназначенных для куда более сложных диаграмм. Хотя это уже и вышло из категории невозможного, простого однострочного решения для данной задачи пока что нет. Однако уже сегодня существует несколько хороших способов достичь нужного результата, обеспечивающих к тому же пригодный для дальнейшей поддержки CSS-код.

 

Проблема

Трапеции — это еще более генерализованные фигуры, чем параллелограммы: у них только две параллельные стороны. Две оставшиеся могут быть наклонены под любым углом. Эти фигуры тради- ционно славятся сложностью создания с помощью чистого CSS, но при этом очень часто используются в веб-дизайне, особенно для оформления вкладок. Если разработчики не имитируют их посредством скрупулезно подготовленных фоновых изображений, то воссоздают с помощью прямоугольника с двумя треугольниками, сделанными из рамок, по бокам. Хотя эта техника экономит HTTP-запросы, которые могли бы понадобиться вследствие использования дополнительных изображений, и легко адаптируется к изменению размеров элементов, она все же далека от совершенства. Нам приходится создавать практически бесполезные псевдоэлементы, а кроме того, мы невероятно ограничены в вариантах стилизации. Например, попробуйте добавить рамку, фоновый узор или скругленные углы к такой вкладке.

 


В Cloud9  все открытые документы отображаются на вкладках в форме траgеций

 В одном из предыдущих дизайнов веб-сайта https://css-tricks.com/ также фигурировали вкладки в форме трапеций, хотя они были скошены только с одной стороны
Так как все хорошо известные техники создания трапеций довольно запутанны и порождают хаотичный, сложный в поддержке код, большинство вкладок, которые мы встречаем в Сети, не имеют скошенных сторон, хотя реальные вкладки в приложениях чаще всего выглядят как раз как трапеции. Существует ли разумный и гибкий способ определять трапециевидные вкладки?

Проблема

Срезание углов — это не только быстрый способ достичь цели, но и популярный вариант стилизации как в печатном дизайне, так и в веб-дизайне. Чаще всего он подразумевает обрезание одного или нескольких уголков контейнера под углом 45°. В последнее время, в связи с тем, что скевоморфизм начал сдавать позиции плоскому дизайну, этот эффект пользуется особенной популярностью. Когда углы срезаются только с одной стороны и каждый из них занимает 50% высоты элемента, это создает фигуру в форме стрелки, что также часто используется в оформлении кнопок и элементов навигации типа «хлебные крошки».

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


 Пример веб-сайта, где срезанный угол (нижний левый у полупрозрачного поля Find & Book) отлично вписывается в дизайн

 

Проблема


Обрезка изображений до ромбовидной формы — распространенный прием в визуальном дизайне, но реализовать его на CSS далеко не просто. На самом деле до недавнего времени это было практически невозможно.

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

Проблема

Параллелограммы — это расширенная версия прямоугольников: их стороны параллельны, но углы не обязательно прямые. В визуальном дизайне они часто используются для придания оформлению динамичности и передачи ощущения движения.
Давайте попробуем создать ссылку, оформленную с помощью CSS в стиле скошенной кнопки. Нашей отправной точкой будет обычная плоская кнопка с очень простым оформлением. Форму скошенного прямоугольника мы придадим ей с помощью трансформации  skew() , (о трансформациях в css я писал здесь) вот так:
transform: skewX(-45deg);
Однако в результате этого содержимое кнопки также исказилось, стало некрасивым и нечитаемым. Существует ли способ создавать скошенные контейнеры так, чтобы их содержимое при этом не перекашивалось?

Нетология

TemplateMonster

Поиск по сайту

Связной трэвел

Google+