1. Идеи
Как нарисовать затененный треугольник с помощью CSS? Какая-то детская обувь сказала, разве это не просто? В интернете много решений, но на самом деле большинство из них не идеальны, и есть некоторые проблемы
Предположим, мы делаем направленную вниз треугольную стрелку Существует примерно два распространенных метода
- С помощью управления границами граница слева и граница справа могут быть установлены прозрачными, а граница сверху может быть задана заранее заданным цветом.
- Поверните поле путем преобразования
2. Дизайн
Сначала нарисуйте треугольник
HTML-структура<body>
<div class="box"></div>
</body>
css-стиль
.box {
position: relative;
width: 200px;
height: 100px;
background: #ff8605;
box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);
}
.box::after {
content: '';
position: absolute;
bottom: -9px;
left: 45px;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #ff8605;
}
Недостаток очевиден, мы не можем задать тень по box-shadow, тень будет коробом
2.1 Пограничный метод
Если требования к тени не так высоки, мы можем определить еще один треугольник элемента псевдокласса, простоего цвет похож на цвет тени, возьми это影子三角形
Покройте нижнюю часть нашего исходного треугольника.
.box::before {
position: absolute;
bottom: -10px;
left: 45px;
content: '';
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid rgba(0, 0, 0, .1);
}
как показано на рисунке
Преимущество в том, что совместимость лучше, и кажется, что требования недостаточно строгие.
Но как строгий фронтенд-инженер!Такого подхода мы все равно терпеть не можем
2.2 Метод фильтрации
Правильная поза заключается в использованииdrop-shadow() в фильтре
в фильтреdrop-shadow
Атрибут является реальной проекцией, он проецирует только тень реального изображения.
box-shadow
Будет проецироваться только тень блочной модели
.box::after {
position: absolute;
bottom: -9px;
left: 45px;
content: '';
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #ff8605;
filter: drop-shadow(2px 2px 2px rgba(0, 0, 0, .2));
}
Он отлично достигает эффекта, но недостатком является то, что совместимость может быть плохой.
совместимость свойства фильтра
(Метод фильтрации предложен детской обувью в области комментариев, спасибо~~)
2.3 метод преобразования
Идея этого метода, тень треугольника использует тень моделей коробки Мы не рисуем треугольник, просто нарисуйте квадратный ящик, а затем поверните его на 45 градусов через атрибут трансформации.
.box::before {
position: absolute;
bottom: -5px;
left: 45px;
content: '';
width: 10px;
height: 10px;
background: #ff8605;
transform: rotate(135deg);
box-shadow: 1px -2px 2px rgba(0, 0, 0, .2);
}
Кажется, мы достигли результатов, которые мы хотим, но на самом деле есть проблема, но потому что наша тень недостаточно велика, она выглядит не очевидно на картинке.
когда мы ставимbox-shadow
Когда область тени увеличивается, мы находим проблему
Коробка торчит, как исправить?
Давайте определим еще одну коробку того же цвета, что и контейнер, и закроем верхнюю часть.
/* transform方法 */
.box::before {
position: absolute;
bottom: -5px;
left: 45px;
content: '';
width: 10px;
height: 10px;
background: #ff8605;
transform: rotate(135deg);
box-shadow: 1px -2px 5px rgba(0, 0, 0, .2);
}
.box::after {
position: absolute;
bottom: 0px;
left: 40px;
content: '';
width: 20px;
height: 20px;
background: #ff8605;
}
Обратите внимание, что треугольник должен использоватьсяbefore
По определению переопределенное поле должно использоваться сafter
определить так, чтобы поле могло покрыть треугольник
Осознайте эффект:
Конечно, этот метод может повлиять на содержимое коробки.
3. Окончательный код решения
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>CSS实现带阴影效果的三角形</title>
<style>
.box {
position: relative;
width: 200px;
height: 100px;
background: #ff8605;
box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);
}
/* border法 */
.box::before {
position: absolute;
bottom: -10px;
left: 45px;
content: '';
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid rgba(0, 0, 0, .1);
}
/* drop-shadow */
.box::after {
position: absolute;
bottom: -9px;
left: 45px;
content: '';
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #ff8605;
filter: drop-shadow(1px 3px 1px rgba(0, 0, 0, .2));
}
/* tranform */
.box::before {
position: absolute;
bottom: -5px;
left: 45px;
content: '';
width: 10px;
height: 10px;
background: #ff8605;
transform: rotate(135deg);
box-shadow: 1px -2px 5px rgba(0, 0, 0, .2);
}
.box::after {
position: absolute;
bottom: 0px;
left: 40px;
content: '';
width: 20px;
height: 20px;
background: #ff8605;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
Если у вас есть лучший способ добиться этого, пожалуйста, оставьте мне сообщение