CSS Waves with Ignition

I have been learning CSS to add some creative control over various components in my projects. I'm very much a novice and was wanting to implement something like this in a project:

Simple CSS Waves | CodePen

But I'm having an issue with understanding how to implement the HTML side of things.

<!--Hey! This is the original version
of Simple CSS Waves-->

<div class="header">

<!--Content before waves-->
<div class="inner-header flex">
<!--Just the logo.. Don't mind this-->
<svg version="1.1" class="logo" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 500 500" xml:space="preserve">
<path fill="#FFFFFF" stroke="#000000" stroke-width="10" stroke-miterlimit="10" d="M57,283" />
<g><path fill="#fff"
d="M250.4,0.8C112.7,0.8,1,112.4,1,250.2c0,137.7,111.7,249.4,249.4,249.4c137.7,0,249.4-111.7,249.4-249.4
C499.8,112.4,388.1,0.8,250.4,0.8z M383.8,326.3c-62,0-101.4-14.1-117.6-46.3c-17.1-34.1-2.3-75.4,13.2-104.1
c-22.4,3-38.4,9.2-47.8,18.3c-11.2,10.9-13.6,26.7-16.3,45c-3.1,20.8-6.6,44.4-25.3,62.4c-19.8,19.1-51.6,26.9-100.2,24.6l1.8-39.7		c35.9,1.6,59.7-2.9,70.8-13.6c8.9-8.6,11.1-22.9,13.5-39.6c6.3-42,14.8-99.4,141.4-99.4h41L333,166c-12.6,16-45.4,68.2-31.2,96.2	c9.2,18.3,41.5,25.6,91.2,24.2l1.1,39.8C390.5,326.2,387.1,326.3,383.8,326.3z" />
</g>
</svg>
<h1>Simple CSS Waves</h1>
</div>

<!--Waves Container-->
<div>
<svg class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto">
<defs>
<path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z" />
</defs>
<g class="parallax">
<use xlink:href="#gentle-wave" x="48" y="0" fill="rgba(255,255,255,0.7" />
<use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(255,255,255,0.5)" />
<use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(255,255,255,0.3)" />
<use xlink:href="#gentle-wave" x="48" y="7" fill="#fff" />
</g>
</svg>
</div>
<!--Waves end-->

</div>
<!--Header ends-->

<!--Content starts-->
<div class="content flex">
  <p>By.Goodkatz | Free to use </p>
</div>
<!--Content ends-->

I'm not sure exactly how to go about linking this to the CSS code in the stylesheet.css for my project. Has anyone done anything like this or have any pointers so I can find the right reading material? Thanks!

1 Like

The first thing that people would tell you in this forum is to look at ISA95 standards for high-performance HMIs (something I don't necessarily always agree with as a blanket answer).

Assuming you've done that already, I think how I would approach this problem is to embed an SVG into your view, preferably a Flex Container Column view (so you can push the SVG down to the bottom of the view).

If you look at the markup, you'll see that the wave they use is an svg file:

Create a text file, give it an .svg extension, paste the svg code from the CodePen you linked, save that file, then drag it into the designer and choose the Embed option.

If you embed an svg, you get quite a lot of control over the individual paths and elements. Play around with those.

Chances are, you'll probably need to nest the svg you embed into a "div", which would just be a Flex Container with a props.meta.domId defined on it so that you can target it by ID for animations and styling.

3 Likes

You're venturing into territory beyond the scope of this forum / not officially supported by IA. Take a look at this thread -- you can use an inline frame to link to a Web Dev-mounted HTML resource. It gets pretty complex and your results may vary.

Exchange Resource to use Javascript with Perspective

I misunderstood what you are doing!

I disagree. This does not require any JS. It is 100% supported as it is pure CSS and SVG. In fact the whole thing can be done without any third party software at all, with just a little know how.

@NP209

I have done many things like this with SVG's and animations, though this "waves" animation was one that I hadn't seen before.

I will say, the "secret" that you were probably missing was that any class which is created in the designer, will automatically be given the psc- prefix when it is compiled. Therefore to target those classes in the stylesheet you must include that prefix on all classes. For instance, instead of the logo class you would instead use psc-logo.

The first thing that I always do with something like this is import a blank SVG into ignition, from there it's simply a matter of knowing how to build the SVG's in a way that Ignition will render what you expect (Ignition actually does a pretty good job of supporting the most common SVG element types).

For this, I built two separate SVG's, one for the logo, and one for the waves.

The logo is very simple, as it is just a path. The html you posted include another path, but as far as I can tell it is not needed for anything and only adds confusion.

Then it was just a matter of applying the classes at the correct levels and typing in the CSS.

End-Result (Note much smother in person the GIF wreaks havoc on the animation):
waves

I used Coordinate Containers, and a Flex Container, but you could probably accomplish this with just flex containers too.

View JSON

{
"custom": {},
"params": {},
"props": {
"defaultSize": {
"height": 221,
"width": 1000
}
},
"root": {
"children": [
{
"children": [
{
"meta": {
"name": "waves"
},
"position": {
"height": "50px",
"width": "100%",
"y": 120.63
},
"props": {
"elements": [
{
"elements": [
{
"elements": [
{
"d": "M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z",
"id": "gentle-wave",
"type": "path"
}
],
"type": "defs"
},
{
"elements": [
{
"fill": "rgba(255,255,255,0.7)",
"href": "#gentle-wave",
"type": "use",
"x": 48,
"y": 7
},
{
"fill": "rgba(255,255,255,0.5)",
"href": "#gentle-wave",
"type": "use",
"x": 48,
"y": 3
},
{
"fill": "rgba(255,255,255,0.3)",
"href": "#gentle-wave",
"type": "use",
"x": 48,
"y": 5
},
{
"fill": "#fff",
"href": "#gentle-wave",
"type": "use",
"x": 48,
"y": 0
}
],
"style": {
"classes": "parallax"
},
"type": "group"
}
],
"type": "group"
}
],
"preserveAspectRatio": "none",
"style": {
"classes": "waves"
},
"viewBox": "0 24 150 28"
},
"type": "ia.shapes.svg"
},
{
"children": [
{
"meta": {
"name": "logo"
},
"props": {
"elements": [
{
"d": "M250.4,0.8C112.7,0.8,1,112.4,1,250.2c0,137.7,111.7,249.4,249.4,249.4c137.7,0,249.4-111.7,249.4-249.4 C499.8,112.4,388.1,0.8,250.4,0.8z M383.8,326.3c-62,0-101.4-14.1-117.6-46.3c-17.1-34.1-2.3-75.4,13.2-104.1 c-22.4,3-38.4,9.2-47.8,18.3c-11.2,10.9-13.6,26.7-16.3,45c-3.1,20.8-6.6,44.4-25.3,62.4c-19.8,19.1-51.6,26.9-100.2,24.6l1.8-39.7\t\tc35.9,1.6,59.7-2.9,70.8-13.6c8.9-8.6,11.1-22.9,13.5-39.6c6.3-42,14.8-99.4,141.4-99.4h41L333,166c-12.6,16-45.4,68.2-31.2,96.2\tc9.2,18.3,41.5,25.6,91.2,24.2l1.1,39.8C390.5,326.2,387.1,326.3,383.8,326.3z.",
"fill": {
"paint": "#fff"
},
"type": "path"
}
],
"preserveAspectRatio": "xMinYMin",
"style": {
"classes": "logo"
},
"viewBox": "0 0 500 500"
},
"type": "ia.shapes.svg"
},
{
"meta": {
"name": "Label"
},
"props": {
"text": "Simple CSS Waves",
"textStyle": {
"classes": "h1"
}
},
"type": "ia.display.label"
}
],
"meta": {
"name": "FlexContainer"
},
"position": {
"height": "150px",
"width": "100%"
},
"props": {
"alignContent": "center",
"alignItems": "center",
"justify": "center",
"style": {
"classes": "inner-header flex"
}
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "CoordinateContainer"
},
"position": {
"height": 221,
"width": "100%"
},
"props": {
"style": {
"classes": "header"
}
},
"type": "ia.container.coord"
}
],
"meta": {
"name": "root"
},
"position": {
"x": -231,
"y": -250
},
"type": "ia.container.coord"
}
}

stylesheet.css

.psc-header {
position:relative;
text-align:center;
background: linear-gradient(60deg, rgba(84,58,183,1) 0%, rgba(0,172,193,1) 100%);
color:white;
}
.psc-h1 {
font-family: 'Lato', sans-serif;
font-weight: 300;
letter-spacing: 2px;
font-size:48px;
}

.psc-logo {
width:50px;
fill:white;
padding-right:15px;
display:inline-block;
vertical-align:middle;
}
.psc-inner-header {
height:65vh;
width:100%;
margin: 0;
padding: 0;
}

.psc-flex {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}

.psc-waves {
position:relavtive;
width: 100%
height:15vh;
margin-bottom:-7px;
min-height:100px;
max-height:150px;
}

.psc-parallax > use {
animation: move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite;
}

.psc-parallax > use:nth-child(1) {
animation-delay: -2s;
animation-duration: 7s;
}

.psc-parallax > use:nth-child(2) {
animation-delay: -3s;
animation-duration: 10s;
}

.psc-parallax > use:nth-child(3) {
animation-delay:-4s;
animation-duration: 13s
}

.psc-parallax > use:nth-child(4) {
animation-delay: -5s;
animation-duration: 20s;
}

@keyframes move-forever {
0% {
transform: translate3d(-90px,0,0);
}
100% {
transform: translate3d(85px,0,0);
}
}

If you would like to better understand what's going on with the SVG paths, I can expand on that, as such you can copy and paste the above JSON and CSS into your project and explore how I set it up.

6 Likes

Actually this worked out great for what I was wanting. I didn't realize you could embed the SVG like this. This was a big help!