Фон с адаптивным градиентом

У меня есть следующий код: (Fiddle)

body {
  background-color: red;
}
#grad1 {
  height: 100px;
  width: 100%;
  background: linear-gradient(521deg, rgba(138, 138, 138, 0) 50%, rgba(138, 138, 138, 0) 31.9%, #fff 0.1%, #fff 0%);
}
<div id="grad1"></div>

Я в основном хочу, чтобы ширина реагировала, а форма градиента сохранялась, даже если ширина изменяется.

Что я пробовал:

  1. Установите ширину на 100%, это не работает, потому что это пустой div

Вот насчет этого, других идей у ​​меня нет, если честно. Я был бы признателен, если бы кто-то мог помочь.


Вот для чего я его использую: (изображения просто пример, чтобы показать, что происходит/что я имею в виду)

введите здесь описание изображения

Но если у меня есть более крупное устройство, это происходит:

введите здесь описание изображения


person Kevin    schedule 12.05.2016    source источник
comment
Выглядит отзывчивым для меня.   -  person Steveo    schedule 12.05.2016
comment
@KevinAartsen: я не уверен, какой результат вы ожидаете от скрипки, поскольку код не соответствует вашему рассматриваемому коду или изображению. Вы можете уточнить?   -  person Harry    schedule 12.05.2016
comment
@harry, плохо, скрипка не соответствует коду в моем посте! И изображения - это просто пример, чтобы показать, что происходит / что я имею в виду.   -  person Kevin    schedule 12.05.2016
comment
@KevinAartsen: это то, что вам нужно?   -  person Harry    schedule 12.05.2016
comment
@Harry Да, сэр, это точно! Как ты это сделал? :п   -  person Kevin    schedule 12.05.2016
comment
Должен ли я опубликовать ответ, или вы это сделаете? Честно говоря, ты заслуживаешь похвал @Harry   -  person Kevin    schedule 12.05.2016
comment
@KevinAartsen: я опубликую ответ, но я готовлю что-то более подробное, чтобы объяснить, почему ваш исходный градиент не всегда создает треугольник. Дай мне немного времени :)   -  person Harry    schedule 12.05.2016


Ответы (3)


Решение: (TL;DR)

Если вам нужны адаптивные градиенты, всегда лучше использовать синтаксис to [side] [side] вместо углов. Ниже приведен фрагмент, который создаст отзывчивый треугольник.

body {
  background-color: red;
}
#grad1 {
  height: 100px;
  width: 100%;
  background: linear-gradient(to bottom right, rgba(255, 255, 255, 0) 49.9%, rgba(255, 255, 255, 1) 50.1%);
}
<div id="grad1"></div>


Объяснение:

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

Почему угловой линейный градиент создает разные формы при разной ширине?

Линейные градиенты всегда определяются осью (которая называется линия градиента). Это можно представить как линию, проведенную через центр блока, содержащего градиент (черная линия на снимке экрана ниже), и повернутую на угол градиента. Линия 0 градусов начинается снизу и идет вверх, тогда как линия 90 градусов идет вправо.

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

Каждая точка на этой воображаемой линии градиента будет иметь определенный цвет в зависимости от определения градиента. В приведенном ниже случае я использовал градиент, прозрачный на 50% и белый на остальных. Таким образом, все точки в верхней половине линии градиента будут прозрачными, а точки в нижней половине будут белого цвета.

Как вы можете видеть на снимке экрана ниже, расстояние между начальной и конечной точками становится все больше и больше по мере увеличения ширины поля, и это также влияет на среднюю точку (средняя зеленая линия). Таким образом, точка, из которой градиент становится белым, изменяется по мере увеличения ширины, и, следовательно, форма также меняется.

введите описание изображения здесь

Почему линейный градиент из стороны в сторону сохраняет форму при любой ширине?

Когда используется синтаксис из стороны в сторону, линия градиента наклонена таким образом, чтобы она указывала в (или к) тому же квадранту, в котором находится указанный угол (в этом случае она указывает на 2-й квадрант потому что там находится нижний правый угол коробки). Он также расположен под таким углом, что он перпендикулярен линии, соединяющей два соседних угла коробки (в данном случае это будут нижний левый угол и верхний правый угол). Поскольку угол линии градиента автоматически настраивается таким образом, чтобы он был перпендикулярен диагонали (линии, соединяющей два соседних угла), он всегда создает треугольник для градиента «половина».

введите описание изображения здесь


Нижеприведенный фрагмент не является решением (то есть сверху). Это то, что я использовал для создания скриншота выше и решил оставить его здесь для развлечения :D

Для углового градиента:

div {
  position: relative;
  display: inline-block;
  height: 100px;
  background: linear-gradient(521deg, transparent 50%, white 50%);
  margin: 200px 50px;
  border: 1px solid black;
}
#div-large {
  width: 400px;
}
#div-small {
  width: 200px;
}
div:after {
  position: absolute;
  content: '';
  width: calc(100% + 24px);
  left: -12px;
  background: linear-gradient(to right, transparent calc(50% - 1px), black calc(50% - 1px), black calc(50% + 1px), transparent calc(50% + 1px)), linear-gradient(to right, green 6px, transparent 6px);
  background-position: 0px 0px, 0px, calc(50% - 1px);
  background-repeat: no-repeat, repeat-x;
  background-size: 100% 100%, 12px 2px;
  border-top: 2px dashed green;
  border-bottom: 2px dashed green;
  transform: rotate(521deg);
}
#div-large:after{
  height: calc(100% + 125px);
  top: -64px;
}
#div-small:after{
  height: calc(100% + 60px);
  top: -32px;
}
body {
  background: sandybrown;
}
<div id='div-small'></div>
<div id='div-large'></div>

Для градиента из стороны в сторону:

div {
  position: relative;
  display: inline-block;
  height: 100px;
  margin: 200px 50px;
  border: 1px solid black;
}
#div-large {
  width: 400px;
  background: linear-gradient(526deg, transparent 50%, white 50%);
}
#div-small {
  width: 200px;
  background: linear-gradient(513.5deg, transparent 50%, white 50%);
}
div:after {
  position: absolute;
  content: '';
  width: calc(100% + 24px);
  left: -12px;
  background: linear-gradient(to right, transparent calc(50% - 1px), black calc(50% - 1px), black calc(50% + 1px), transparent calc(50% + 1px)), linear-gradient(to right, green 6px, transparent 6px);
  background-position: 0px 0px, 0px, calc(50% - 1px);
  background-repeat: no-repeat, repeat-x;
  background-size: 100% 100%, 12px 2px;
  border-top: 2px dashed green;
  border-bottom: 2px dashed green;
}
#div-large:after{
  height: calc(100% + 93px);
  top: -48px;
  transform: rotate(526deg);
}
#div-small:after{
  height: calc(100% + 78px);
  top: -41px;
  transform: rotate(513.5deg);
}
body {
  background: sandybrown;
}
<div id='div-small'></div>
<div id='div-large'></div>

Отказ от ответственности: мое объяснение сильно зависит от этого страница MDN, но я постарался изложить как можно больше своими словами :)

person Harry    schedule 12.05.2016

В качестве альтернативы вы можете использовать 2 псевдоэлемента для создания желаемого дизайна.

body {
  margin: 0;
  padding: 0;
  color: black;
  background: #eee;
}
h1 {
  padding: 0 1em;
}
p {
  padding: 1em;
}
.grad {
  background: black;
  color: white;
  position: relative;
  margin-top: 50px;
  margin-bottom: 50px;
}
.grad:before,
.grad:after {
  content: '';
  position: absolute;
  left: 0;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 0 0 50px 100vw;
  border-color: transparent transparent #000000 transparent;
}
.grad:before {
  top: -50px;
}
.grad:after {
  bottom: -50px;
  border-width: 50px 100vw 0 0;
  border-color: #000000 transparent transparent transparent;
}
<h1>Title</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis laoreet scelerisque risus, eu scelerisque libero condimentum ut. Ut ac sapien placerat, suscipit odio vitae, vestibulum neque. Donec dui tortor, consequat rhoncus malesuada pharetra, dignissim
  sit amet mauris. Curabitur finibus arcu volutpat laoreet laoreet. Pellentesque mattis quam eget elit eleifend auctor. Fusce et nunc lobortis, laoreet leo sed, lacinia lorem. Nunc gravida eu eros et consequat.</p>
<div class="grad">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis laoreet scelerisque risus, eu scelerisque libero condimentum ut. Ut ac sapien placerat, suscipit odio vitae, vestibulum neque. Donec dui tortor, consequat rhoncus malesuada pharetra, dignissim
    sit amet mauris. Curabitur finibus arcu volutpat laoreet laoreet. Pellentesque mattis quam eget elit eleifend auctor. Fusce et nunc lobortis, laoreet leo sed, lacinia lorem. Nunc gravida eu eros et consequat.
  </p>
</div>
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis laoreet scelerisque risus, eu scelerisque libero condimentum ut. Ut ac sapien placerat, suscipit odio vitae, vestibulum neque. Donec dui tortor, consequat rhoncus malesuada pharetra, dignissim
  sit amet mauris. Curabitur finibus arcu volutpat laoreet laoreet. Pellentesque mattis quam eget elit eleifend auctor. Fusce et nunc lobortis, laoreet leo sed, lacinia lorem. Nunc gravida eu eros et consequat.
</p>

person Stewartside    schedule 12.05.2016

Когда вы устанавливаете %, это действительно означает, что это процент от его контейнера. После того, как вы установите grad1 равным 100% ширины тела.

Попробуйте установить ширину тела на 100%.

person Dominic    schedule 12.05.2016
comment
одну секунду. я смотрю еще раз - person Dominic; 12.05.2016