Статьи

CSS Refreshers: Границы

Конечно, мы все знакомы с границами. Есть ли что-то новое, что можно было бы представить? Бьюсь об заклад, в этой статье довольно много вещей, о которых вы никогда не знали!

Мало того, что CSS3 может использоваться для создания закругленных углов, но и простой CSS может также использоваться для отображения пользовательских форм. Это верно; В прошлом, до того, как эти методы были открыты, мы могли прибегать к использованию абсолютно расположенных фоновых изображений для отображения кругов или стрелок. К счастью, поскольку мы с радостью сделали еще один шаг от Photoshop, это уже не так.


Вы, вероятно, знакомы с самым основным использованием границ.

1
border: 1px solid black;

Приведенный выше код будет применять границу 1px к элементу. Легко и просто; но мы также можем немного изменить синтаксис.

1
2
3
border-width: thick;
border-style: solid;
border-color: black;

В дополнение к передаче определенного значения в border-width , альтернативно могут использоваться три ключевых слова: thin , medium и thick .

образ

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

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

1
2
3
4
5
6
7
.box {
    border: 1px solid red;
}
 
.box:hover {
    border: 1px solid green;
}

Более элегантный и СУХОЙ подход заключается в конкретном обновлении свойства border-color .

1
2
3
4
5
6
7
.box {
    border: 1px solid red;
}
 
.box:hover {
    border-color: green;
}

Кроме того, как вы вскоре увидите, этот метод длинных рук полезен при создании пользовательских форм с помощью CSS.


border-radius — золотое дитя CSS3 — первого нового свойства, получившего широкое распространение в сообществе. Это означает, что, за исключением Internet Explorer 8 и ниже, все браузеры могут отображать закругленные углы.

Ранее было необходимо использовать префиксы вендоров как для Webkit, так и для Mozilla, чтобы правильно применить стилизацию.

1
2
3
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;

Однако в наши дни мы можем не беспокоиться о версиях поставщиков и просто придерживаться официальной формы: border-radius .

образ

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

образ
1
2
3
4
border-top-left-radius: 20px;
border-top-right-radius: 0;
border-bottom-right-radius: 30px;
border-bottom-left-radius: 0;

В приведенном выше коде установка border-top-right-radius и border-bottom-left-radius в ноль была бы излишней, если только элемент не наследует значения, которые необходимо сбросить.

Как и в случае margin или padding , эти настройки могут быть при необходимости сведены в одно свойство.

1
2
/* top left, top right, bottom right, bottom left */
border-radius: 20px 0 30px 0;

В качестве примера (и как это часто делают веб-дизайнеры), форма лимона может быть воспроизведена с помощью CSS и свойства border-radius , например, так:

1
2
3
4
5
6
7
.lemon {
   width: 200px;
 
   background: #F5F240;
   border: 1px solid #F0D900;
   border-radius: 10px 150px 30px 150px;
}
образ

Многие дизайнеры с радостью придерживаются знаний, изложенных до сих пор в этой главе; Однако есть несколько способов, которыми мы можем продвинуться дальше!


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

В то время как solid , dashed и dotted являются наиболее частыми значениями свойства border-style , есть также несколько других, которые мы можем использовать, включая groove и ridge .

1
border: 20px groove #e3e3e3;

Или, с длинной формой:

1
2
3
border-color: #e3e3e3;
border-width: 20px;
border-style: groove;
образ

Хотя это, безусловно, полезно, эффект гребня или канавки не является множеством границ.

Самая популярная техника для создания двух границ — это использование свойства структуры.

1
2
3
4
.box {
   border: 5px solid #292929;
   outline: 5px solid #e3e3e3;
}
образ

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

Если метод outline недостаточен, альтернативный подход заключается в использовании преимуществ псевдоэлементов :before и :after и применении любых необходимых дополнительных границ к сгенерированному контенту.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.box {
  width: 200px;
  background: #e3e3e3;
  position: relative;
 
  border: 10px solid green;
}
 
/* Create two boxes with the same width of the container */
.box:after, .box:before {
  content: »;
  position: absolute;
  top: 0;
}
 
.box:after {
  border: 5px solid red;
  outline: 5px solid yellow;
}
 
.box:before {
  border: 10px solid blue;
}
образ

Это, возможно, не самый элегантный подход, но он, безусловно, получает работу. Одно предостережение в том, что легко спутать порядок, в котором будут применяться цвета границ. Определенный уровень «угадать и проверить» часто требуется для применения правильной последовательности.

Отличный способ создать бесконечное количество границ — воспользоваться параметром spread в свойстве CSS3 box-shadow .

1
2
3
4
5
6
7
.box {
    border: 5px solid red;
     box-shadow:
       0 0 0 5px green,
       0 0 0 10px yellow,
       0 0 0 15px orange;
}
образ

В этом случае мы ведем себя умно и используем box-shadow таким образом, который не обязательно был предназначен, когда спецификация была изначально написана.

Установив компоненты x , y и blur на 0 , мы можем вместо этого использовать значение spread для создания сплошных границ в желаемых местах. Поскольку box-shadow s можно сложить, используя запятую, количество возможных уровней бесконечно.

Эта техника изящно деградирует довольно хорошо. В старых браузерах, которые не распознают свойство box-shadow , это просто отображает одну красную границу 5px .

Помните: дизайн не обязательно должен быть одинаковым во всех браузерах. Напишите свой CSS для самых современных браузеров, а затем предоставьте подходящие запасные варианты, соответственно.


В дополнение к передаче одного значения в border-radius , мы можем альтернативно предоставить два — через / -, чтобы указать уникальные значения для горизонтального и вертикального радиусов.

Например…

1
border-radius: 50px / 100px;

…эквивалентно:

1
2
3
4
border-top-left-radius: 50px 100px;
border-top-right-radius: 50px 100px;
border-bottom-right-radius: 50px 100px;
border-bottom-left-radius: 50px 100px;

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

1
2
3
4
5
6
7
8
.box {
    width: 200px;
    background: #666;
 
    border-top-left-radius: 15em 1em;
    border-bottom-right-radius: 15em 1em;
 
}
образ

Возможно, самое лучшее использование границ — это когда они ловко применяются к элементам, которые имеют нулевую ширину и высоту. Смущает, а? Давайте посмотрим на демонстрацию.

Для следующих нескольких примеров предположим следующую разметку…

1
<div class=»box»></div>

… И следующий базовый стиль:

1
2
3
4
5
.box {
   width: 200px;
   height: 200px;
   background: black;
}

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

Ключом к пониманию того, как стрелка может быть сформирована с помощью CSS, является установка уникального border-color для каждой стороны, а затем уменьшение значений width и height для контейнера до 0 .

Предполагая div с классом arrow в качестве контейнера:

1
2
3
4
5
6
7
8
.arrow {
  width: 0;
 
  border-top: 100px solid red;
  border-right: 100px solid green;
  border-bottom: 100px solid blue;
  border-left: 100px solid yellow;
}

Как показано в начале этой главы, более чистый синтаксис будет состоять в том, чтобы не использовать всеобъемлющую сокращенную версию:

1
2
3
4
5
6
7
8
9
.arrow {
  width: 0;
 
  border: 100px solid;
  border-top-color: red;
  border-right-color: green;
  border-bottom-color: blue;
  border-left-color: yellow;
}

Мы можем даже уменьшить это, сгруппировав значения цвета.

1
2
3
4
5
6
.arrow {
  width: 0;
 
  border: 100px solid;
  border-color: red green blue yellow;
}
образ

Интересно, правда? Это имеет смысл, когда мы делаем шаг назад. Это единственный возможный способ выравнивания цветов, предполагая width и height нуля для контейнера. А что если мы установим прозрачные все цвета рамки, кроме синей стороны?

1
2
3
4
5
6
.arrow {
  width: 0;
 
  border: 100px solid;
  border-bottom-color: blue;
}
образ

Отлично! Но не кажется слишком семантическим создавать div .arrow , все с целью добавления стрелки на страницу. Вместо этого псевдоэлементы могут использоваться для применения стрелки после или перед соответствующим элементом.

Чтобы создать 100% речевой пузырь CSS, мы начнем с разметки.

1
<div class=»speech-bubble»>Hi there!</div>

Затем следует применить базовый стиль.

01
02
03
04
05
06
07
08
09
10
11
.speech-bubble {
    position: relative;
    background-color: #292929;
 
    width: 200px;
    height: 150px;
    line-height: 150px;
 
    color: white;
    text-align: center;
}
образ

Стрелка будет применена с использованием псевдоэлемента after .

1
2
3
.speech-bubble:after {
    content: »;
}

Элементы :before и :after psuedo могут использоваться для вставки сгенерированного содержимого до или после содержимого элемента.

На этом этапе просто нужно воспроизвести стрелку и расположить ее в нужном месте. Мы начинаем с абсолютного позиционирования контента, сброса width и height и применения цветов границ.

01
02
03
04
05
06
07
08
09
10
.speech-bubble:after {
  content: »;
  position: absolute;
 
  width: 0;
  height: 0;
 
  border: 10px solid;
  border-color: red green blue yellow;
}
образ

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

01
02
03
04
05
06
07
08
09
10
.speech-bubble:after {
  content: »;
  position: absolute;
 
  width: 0;
  height: 0;
 
  border: 10px solid;
  border-top-color: red;
}
образ

При создании форм CSS, поскольку мы не можем использовать свойство width для указания ширины стрелки, вместо этого следует использовать свойство border-width . В этом случае стрелка должна быть немного больше; таким образом, border-width может быть увеличена до 15px . Мы также разместим стрелку внизу и в центре контейнера, используя свойства top и left соответственно.

01
02
03
04
05
06
07
08
09
10
11
12
13
.speech-bubble:after {
  content: »;
  position: absolute;
 
  width: 0;
  height: 0;
 
  border: 15px solid;
  border-top-color: red;
 
  top: 100%;
  left: 50%;
}
образ

Почти готово; последний шаг — обновить цвет стрелки, чтобы он соответствовал фону контейнера. Позиционирование также необходимо изменить, чтобы учесть ширину границ ( 15px ). Пока мы здесь, мы также применим тонкий border-radius чтобы контейнер казался более похожим на пузырь.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
.speech-bubble {
   /* … other styles */
   border-radius: 10px;
}
 
.speech-bubble:after {
  content: »;
  position: absolute;
 
  width: 0;
  height: 0;
 
  border: 15px solid;
  border-top-color: #292929;
 
  top: 100%;
  left: 50%;
  margin-left: -15px;
}
образ

Не плохо, а? Абстрагируйте этот код от нескольких классов для повторного использования, и вы можете использовать все будущие проекты.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
   Speech Bubbles
   Usage: Apply a class of .speech-bubble and .speech-bubble-DIRECTION
   <div class=»speech-bubble speech-bubble-top»>Hi there</div>
*/
 
.speech-bubble {
  position: relative;
  background-color: #292929;
 
  width: 200px;
  height: 150px;
  line-height: 150px;
 
  color: white;
  text-align: center;
  border-radius: 10px;
 
  font-family: sans-serif;
}
 
.speech-bubble:after {
  content: »;
  position: absolute;
 
  width: 0;
  height: 0;
 
  border: 15px solid;
}
 
 
/* Position the Arrow */
 
.speech-bubble-top:after {
  border-bottom-color: #292929;
 
  left: 50%;
  bottom: 100%;
  margin-left: -15px;
}
.speech-bubble-right:after {
  border-left-color: #292929;
 
  left: 100%;
  top: 50%;
  margin-top: -15px;
}
 
.speech-bubble-bottom:after {
  border-top-color: #292929;
 
  top: 100%;
  left: 50%;
  margin-left: -15px;
}
 
.speech-bubble-left:after {
  border-right-color: #292929;
 
  top: 50%;
  right: 100%;
  margin-top: -15px;
}
образ

Недостатком использования line-height для вертикального центрирования текста является то, что вы ограничены одной строкой. Если текст требует двух или более строк, высота каждой строки будет слишком большой. Разумное решение состоит в том, чтобы установить display table для речевого всплывающего окна и display table-cell для абзаца, который переносит текст. Это позволяет нам выровнять текст по центру, соответственно.

1
2
3
<div class=»speech-bubble speech-bubble-top»>
    <p>Text goes here.</p>
</div>

Далее модифицированный CSS.

01
02
03
04
05
06
07
08
09
10
.speech-bubble {
 /* other styles */
 
  display: table;
}
 
.speech-bubble p {
  display: table-cell;
  vertical-align: middle;
}
образ

Если ссылки на display: table возвращают ужасные воспоминания о старомодных макетах на основе таблиц, не беспокойтесь. Эти свойства просто ссылаются на стиль, в котором должен отображаться элемент.

Мы не ограничены треугольниками; CSS способен создавать всевозможные формы — даже сердечки и знаки биологической опасности!

образ
01
02
03
04
05
06
07
08
09
10
11
.biohazard {
  width: 0;
 
  border: 60px solid;
  border-radius: 50%;
 
  border-top-color: black;
  border-bottom-color: black;
  border-left-color: yellow;
  border-right-color: yellow;
}

Несмотря на то, что простая border: 1px solid black синтаксис в border: 1px solid black имеет большое значение, если мы умны, мы можем создавать различные полезные эффекты, значки и формы. Кто бы мог подумать, что границы могут быть такими мощными? Главное — помнить, что стилизация для общих форм или речевых пузырей должна создаваться только один раз, а затем абстрагироваться от служебных классов для будущего использования.