Создание градиентной сетки в CSS/Jquery
Я не уверен, возможно ли это или нет, но могу ли я использовать методы CSS/Jquery для создания градиентной сетки? Что-то похожее на это
Я хотел бы случайным образом генерировать эту сетку, а затем, возможно, анимировать ее, поэтому я пытаюсь избежать использования изображений. Не уверен, что такое вообще возможно.
Я думал, может быть, создать несколько слоев отдельных градиентов, а затем сложить их все вместе в фиксированное положение и изменить их настройки непрозрачности?
3 ответов
В настоящее время
несколько лет назад я экспериментировал с чем-то подобным, используя SVG, тег холста HTML5 и совсем недавно градиенты CSS3. Я не верю, что в настоящее время существует естественный способ выйти за пределы простых линейных или радиальных градиентов.
вопрос в том, можно ли моделировать градиент сетки, используя только простые линейные и радиальные градиенты (которые являются единственными доступными инструментами).
к сожалению, при объединении нескольких градиенты используя непрозрачность или rgba, цвета разных градиентов, как правило, объединяются таким образом, что это не полезно, что приводит к размытым цветам. Чтобы избежать этого, потребуется возможность отображать его в браузере как один сложный градиент.
существуют также значительные ограничения на формы, которые могут иметь градиенты-линейные градиенты под произвольным углом и эллиптические градиенты с радиальной симметрией. Не допускает свободной формы, неправильной формы. В 2D преобразований то, что можно применить к полученному изображению, также довольно регулярно (масштабирование, перекос и т. д.).
в будущем
наиболее перспективным вариантом, о котором я знаю в ближайшем будущем, является возможная поддержка градиентов сетки в SVG 2.0 (и, возможно, диффузионных кривых). Если это произойдет, и это в конечном итоге поддерживается браузерами, это должно начать значительно расширять параметры. И тег HTML5 canvas и CSS3 могут последовать в ближайшее время впоследствии.
и, как указал @vals в комментарии ниже, WebGL должен предложить некоторые очень перспективные варианты (для тегов HTML5 canvas с использованием 3D-контекста).
ссылки по теме
Я сделал простой макет, чтобы применить это.
во-первых, я поставлю 4 divs, первый, чтобы показать частичные результаты, и последний, чтобы увидеть конечный результат. Разметка просто:
<div class="box mesh1"></div>
<div class="box mesh2"></div>
<div class="box mesh3"></div>
<div class="box mesh"></div>
здесь коробка как раз для размеров, меш1 до 3 держит частично результаты, в сетке мы кладем ее все совместно.
CSS:
.box {
width: 400px;
height: 150px;
position: relative;
display: inline-block;
}
.mesh1, .mesh {
background:
-webkit-linear-gradient(5deg, rgba(0, 250, 0, 0.5), rgba(0, 100, 0, 0.5))
}
.mesh:after, .mesh:before {
content: "";
position: absolute;
left: 0px;
bottom: 0px;
top: 0px;
right: 0px;
}
.mesh2, .mesh:after {
background: -webkit-radial-gradient(center center, circle cover, rgba(250, 0, 0, 0.6) 0%, rgba(120, 0, 10, 0.5) 100%);}
.mesh3, .mesh:before {
background: -webkit-radial-gradient(10% 10%, ellipse cover, rgba(0, 0, 250, 0.6) 0%, white 100%);}
Я даю классу mesh1 фон линейный, наклоненный на 5 градусов, и указываю цвета в формате rgba на обеспечить прозрачность.
затем, чтобы иметь возможность накладывать больше градиентов, я указываю на псевдо-элементы, как до и после, разделяя те же свойства макета.
последнему элементу я даю круговой градиент, общий с mesh2 Перед элементом я даю эллиптический градиент, вне центра. Все они могут быть rgba.
в конце вы видите в сетке div результат перекрытия всего
(я использовал везде webkit обозначение, чтобы сделать его коротким)
Я бы не сказал, что это много художественного, но я оставляю эту часть вам: -)
в моем первом ответе я интерпретировал это больше "художественно", чем "математически". Ответ Мэтта Кофлина заставляет меня задуматься о более математическом ответе, в котором мы бы сделали "сетчатую" часть требования более строгой.
то есть у нас есть матрица цветов, и мы хотим показать это в сетке. Если сетка имеет интервал, скажем, 100px, то цвет [x][y] матрицы будет дан пикселю в 100x и 100y. Пиксели между ними будет aproximated в билинейная пути.
для такого подхода css будет:
.mesh { overflow: hidden; position: absolute; width: 300px; height: 300px; }
.tile { width: 200px; height: 200px; position: absolute; display: block; }
.tile11, .tile21, .tile31 {
left: -50px;
}
.tile12, .tile22, .tile32 {
left: 50px;
}
.tile13, .tile23, .tile33 {
left: 150px;
}
.tile11, .tile12, .tile13 {
top: -50px;
}
.tile21, .tile22, .tile23 {
top: 50px;
}
.tile31, .tile32, .tile33 {
top: 150px;
}
.tile11 {
background: -webkit-radial-gradient(center center, 100px 100px,
rgba(255, 0, 0, 1) 0%,
rgba(255, 0, 0, 0.5) 50%,
rgba(255, 0, 0, 0) 100%);}
.tile12 {
background: -webkit-radial-gradient(center center, 100px 100px,
rgba(255, 0, 0, 1) 0%,
rgba(255, 0, 0, 0.5) 50%,
rgba(255, 0, 0, 0) 100%);}
Я использую каждый div в качестве локального участника сетки, получая только "касание" промежуточного соседа и переходя к полной прозрачности за пределами этой точки.
результат такой :
2 первой цвета как красный, как тест. В идеальной системе линия, соединяющая 2 точки, должна быть идеально Красной все время.
Это правда, что это не идеальный результат, но "мутность" или "размытость" результата более или менее избегается