Статьи

Как создать диагональные линии с помощью CSS

Несколько дней назад я получил приглашение в Google Music. Просматривая приложение, я заметил крошечный, но изящный трюк, который они используют для создания вкладок и диагональных границ с помощью старого CSS. Я покажу вам, как сделать то же самое в ваших проектах сегодня!



Начнем с простой разметки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<!DOCTYPE html>
  
<html lang=»en»>
<head>
   <meta charset=»utf-8″>
   <title>Demo</title>
</head>
<body>
    <a href=»#»>New Music</a>
    <div>
        <h3> Hello, Everyone!
        <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </p>
    </div>
</body>
</html>

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

голая разметка

Далее, только для макета, давайте применим цвет фона и небольшой интервал к элементу body .

1
2
3
4
5
6
body {
    background: #e3e3e3;
    font-family: sans-serif;
    width: 400px;
    margin: 100px auto;
}
Разнос

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

01
02
03
04
05
06
07
08
09
10
a {
    padding: 10px;
    text-decoration: none;
    color: white;
    font-weight: bold;
    display: block;
     
    border-right: 30px solid red;
    border-bottom: 30px solid #4c4c4c;
}
Стиль тега привязки

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

01
02
03
04
05
06
07
08
09
10
11
12
a {
    padding: 10px;
    text-decoration: none;
    color: white;
    font-weight: bold;
    display: block;
     
    border-right: 30px solid red;
    border-bottom: 30px solid #4c4c4c;
 
   height: 0;
}
Нулевая высота

Все ближе! Возможно, если мы теперь отрегулируем высоту строки тега привязки, мы сможем поместить текст в это поле!

01
02
03
04
05
06
07
08
09
10
11
12
13
a {
    padding: 10px;
    text-decoration: none;
    color: white;
    font-weight: bold;
    display: block;
     
    border-right: 30px solid red;
    border-bottom: 30px solid #4c4c4c;
     
    height: 0;
    line-height: 50px;
}
Регулировка высоты линии

Мы добираемся туда! Но, конечно, нам не нужна эта уродливая красная граница справа. Есть ли способ указать, что он должен получать цвет фона body без повторения шестнадцатеричного значения? Ага! Мы используем transparent ключевое слово для этой цели.

01
02
03
04
05
06
07
08
09
10
11
12
13
a {
    padding: 10px;
    text-decoration: none;
    color: white;
    font-weight: bold;
    display: block;
     
    border-right: 30px solid transparent;
    border-bottom: 30px solid #4c4c4c;
     
    height: 0;
    line-height: 50px;
}
Прозрачные границы

Очевидная проблема, на данный момент, заключается в том, что это выглядит немного странно, когда фон растягивается на всю ширину контейнера. Естественный инстинкт может заключаться в обновлении display чтобы inline . Однако, как показано на рисунке ниже, это не сработает.

встроенный дисплей

Нам нужно, чтобы элемент сохранил свою block подобную природу, чтобы он соблюдал высоту 0 . Ответом на эту дилемму является использование display: inline-block; или float тег привязки, а затем clear элементы, следующие за ним. Мы будем использовать первое.

01
02
03
04
05
06
07
08
09
10
11
12
13
a {
    padding: 10px;
    text-decoration: none;
    color: white;
    font-weight: bold;
    display: inline-block;
     
    border-right: 30px solid transparent;
    border-bottom: 30px solid #4c4c4c;
     
    height: 0;
    line-height: 50px;
}

Намного лучше!


И наконец, давайте немного div элемент div под ним, и мы почти закончили!

1
2
3
4
5
div {
     border: 1px solid #4c4c4c;
     border-top: 3px solid #4c4c4c;
     padding: 20px;
}
Ой ой

В сафари

В Firefox

Ооо У нас есть проблемы. Похоже, что Firefox и Webkit не совсем согласны с тем, как визуализировать элементы с нулевой высотой и отображением inline-block .

На случайную ноту, это меня немного озадачило. Не прибегая к хаки, я не мог заставить Firefox и Chrome точно отобразить макет. Если вы найдете способ, дайте мне знать в комментариях! Обновление — обратитесь к комментариям для обхода.


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

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

1
2
3
4
5
@media screen and (-webkit-animation) {
    a {
        margin-bottom: -4px;
    }
}

Та да! Оно работает. Помните, однако, — достигните этого трюка, если у вас нет другого выбора!


Конечный продукт

Это достаточно простая техника, но, тем не менее, мы все должны иметь в наших инструментальных поясах. Вы использовали какие-нибудь изящные приемы, подобные этому, в своих проектах? Дай мне знать в комментариях!