CSS魔法 | 椰树,大海,沙滩让人眼前一亮

1,180 阅读11分钟

我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛

嗨!大家好!我是手可摘棉花,一名前端开发,很开心在这里分享文章,期待着大家的点赞👍与关注➕。

简介

今天又是美好的一天,想到夏天,很多人都想到了美丽的沙滩,躺在沙滩上听听海的声音,跟一群朋友在沙滩玩沙子,游泳,捡贝壳之类的吧。本文给大家用css简单的画一幅沙滩景色,大海,椰树,沙滩,贝壳,让大家就算没空去海边看看也可以瞧一下美好的景色,没想到css的魔法这么大吧,下面给大家慢慢讲述。

代码块

代码介绍

本文的制作比较繁琐,因为涉及的元素很多,制作起来比较花费时间,整个画面制作有大海、沙滩、椰子树、贝壳、海星、石子等,制作完成这些之后再给大海加上了波浪的效果,椰子树风吹摇摆的效果。

1. 椰树,大海,沙滩制作

先画大海波浪效果,再实现椰子树,最后来画沙滩,还有沙滩上面的贝壳。

1.1 大海制作

大海的制作是填充一个蓝色大海的颜色,再加上一些浪花,波浪是由很多个不同的椭圆叠加在一起,定位拼合起来,因为后期做波浪效果动画的时候,需要很长的波浪,这样一起滚动,所以需要复制很多圆拼接。

html:

<!-- 波浪 -->
    <div class="wave">
      <div class="wave-cell01">
        <div class="wave-01"></div>
        <div class="wave-02"></div>
        <div class="wave-03"></div>
        <div class="wave-04"></div>
        <div class="wave-05"></div>
        <div class="wave-06"></div>
        <div class="wave-07"></div>
        <div class="wave-08"></div>
        <div class="wave-09"></div>
        <div class="wave-10"></div>
        <div class="wave-11"></div>
        <div class="wave-12"></div>
        <div class="wave-13"></div>
        <div class="wave-14"></div>
        <div class="wave-15"></div>
      </div>
      <div class="wave-cell02">
        <div class="wave-01"></div>
        <div class="wave-02"></div>
        <div class="wave-03"></div>
        <div class="wave-04"></div>
        <div class="wave-05"></div>
        <div class="wave-06"></div>
        <div class="wave-07"></div>
        <div class="wave-08"></div>
        <div class="wave-09"></div>
        <div class="wave-10"></div>
        <div class="wave-11"></div>
        <div class="wave-12"></div>
        <div class="wave-13"></div>
        <div class="wave-14"></div>
        <div class="wave-15"></div>
      </div>
    </div>

样式:

/* 波浪 */
.wave{
  display: flex;
  width: 100%;
  height: 160px;
  background: #6ED3E8;
  position: relative;
}
.wave-cell01{
  position: absolute;
  bottom: 0;
  z-index: 2;
}
.wave-01{
  width: 500px;
  height: 300px;
  background: #6ED3E8;
  border-radius: 60%;
  position: absolute;
  bottom: -46px;
  left: -140px;
}
.wave-02{
  width: 537px;
  height: 300px;
  background: #6ED3E8;
  border-radius: 60%;
  position: absolute;
  bottom: -72px;
  left: 254px;
}
.wave-03{
  width: 507px;
  height: 300px;
  background: #6ED3E8;
  border-radius: 60%;
  position: absolute;
  bottom: -51px;
  left: 714px;
}
.wave-04{
  width: 462px;
  height: 300px;
  background: #6ED3E8;
  border-radius: 60%;
  position: absolute;
  bottom: -25px;
  left: 1114px;
}
.wave-05,.wave-06,
.wave-07,.wave-08,
.wave-09,.wave-10,
.wave-11,.wave-12,
.wave-13,.wave-14,
.wave-15{
  width: 862px;
  height: 300px;
  background: #6ED3E8;
  border-radius: 60%;
  position: absolute;
  bottom: -25px;
  left: 1514px;
}
.wave-06{
  left: 2314px;
}
.wave-07{
  left: 3114px;
}
.wave-08{
  left: 3914px;
}
.wave-09{
  left: 4714px;
}
.wave-10{
  left: 5514px;
}
.wave-11{
  left: 6314px;
}
.wave-12{
  left: 7114px;
}
.wave-13{
  left: 7914px;
}
.wave-14{
  left: 8714px;
}
.wave-15{
  left: 9514px;
}

.wave-cell02{
  position: absolute;
  bottom: -17px;
  left: 56px;
}
.wave-cell02 > div{
  background: #82DCEF;
  height: 145px;
}

1.2 椰子树

椰子树制作先画了枝干,再画椰子,最后画椰子。枝干是画了长矩形,现实中椰子树本来枝干可能是一边小一边大,哈,这个不知道怎么写,所以讲究画了矩形一样大小了;椰子是用椭圆画的;椰子叶子用圆角样式调节了半圆,然后再用伪类画另外的半圆,叠加过去,就会看到弯曲圆弧行政的椰子叶,需要旋转角度,画完一片叶子再复制4片叶子,有些可能会没连接闭合好的叶子需要另外重新慢慢调节好。

html:

<!-- 椰子树 -->
<div class="tree">
  <div class="trunk-box">
    <div class="trunk">
      <div class="line1"></div>
      <div class="line1 line2"></div>
      <div class="line1 line3"></div>
      <div class="line1 line4"></div>
      <div class="line1 line5"></div>
    </div>
  </div>
  <div class="coconut">
    <div class="coconut1"></div>
    <div class="coconut1 coconut2"></div>
    <div class="coconut1 coconut3"></div>
  </div>
  <div class="leaf">
    <div class="leaf1 leafO"></div>
    <div class="leaf1 leaf2"></div>
    <div class="leaf1 leaf3"></div>
    <div class="leaf1 leaf4"></div>
    <div class="leaf1 leaf5"></div>
  </div>
</div>

样式:

/* 椰子树 */
.tree{
  position: absolute;
  top: 130px;
  left: 100px;
  z-index: 4;
}
.trunk{
  width: 26px;
  height: 200px;
  background: #A98761;
  border: 3px solid #6A5253;
  transform: rotate(-5deg);
}
.trunk .line1{
  width: 24px;
  height: 3px;
  background: #6A5253;
  position: absolute;
  top: 30px;
  right: 0;
  transform: rotate(-10deg);
}
.trunk .line2{
  top: 70px;
}
.trunk .line3{
  top: 100px;
}
.trunk .line4{
  top: 130px;
}
.trunk .line5{
  top: 160px;
}
.coconut{
  position: absolute;
  top: -16px;
  left: -15px;
}
.coconut1{
  width: 25px;
  height: 22px;
  background: #7C8767;
  border: 2px solid #6A5253;
  border-radius: 60%;
  position: absolute;
  z-index: 3;
}
.coconut2{
  width: 28px;
  height: 24px;
  top: -20px;
  left: 7px;
  z-index: 2;
}
.coconut3{
  width: 20px;
  height: 24px;
  top: -4px;
  left: 20px;
  z-index: 1;
}
.leaf{
  position: absolute;
  top: -77px;
  left: -12px;
  z-index: 0;
  z-index: -1;
}
.leaf1{
  width: 124px;
  height: 40px;
  background: #94B65F;
  border-radius: 193% 200% 0 0/372% 328% 0 0;
  border: 2px solid #585854;
  transform: rotate(-45deg);
  position: absolute;
  top: 23px;
  left: 27px;
}
.leaf1::after{
  content: "";
  position: absolute;
  top: 21px;
  left: 1px;
  width: 97%;
  height: 20px;
  background: #6ED3E8;
  border: 2px solid #585854;
  border-bottom: 0;
  border-radius: 256% 188% 0 0/372% 328% 0 0;
}
.leaf2{
  width: 82px;
  height: 26px;
  transform: rotate(22deg);
  position: absolute;
  top: 23px;
  left: -72px;
}
.leaf2::after,.leaf3::after{
  top: 15px;
  left: 1px;
  transform: rotate(8deg);
}
.leaf3{
  width: 90px;
  height: 26px;
  transform: rotate(-38deg);
  position: absolute;
  top: 40px;
  left: -84px;
}
.leaf4{
  width: 90px;
  height: 26px;
  transform: rotate(10deg);
  position: absolute;
  top: 33px;
  left: 34px;
}
.leaf4::after,.leaf5::after{
  top: 15px;
  left: -2px;
  transform: rotate(-9deg);
}
.leaf5{
  width: 90px;
  height: 26px;
  transform: rotate(47deg);
  position: absolute;
  top: 51px;
  left: 41px;
}

1.3 泥土

椰子树的泥土制作,画了两个半圆重叠一起,再在上面画一些沙子,看起来像一点。

html:

 <!-- 泥土 -->
<div class="earth">
  <div class="earth1 earth1-left">
    <div class="sand1"></div>
    <div class="sand1 sand2"></div>
    <div class="sand1 sand3"></div>
    <div class="sand1 sand4"></div>
    <div class="sand1 sand5"></div>
    <div class="sand1 sand6"></div>
    <div class="sand1 sand7"></div>
    <div class="sand1 sand8"></div>
  </div>
  <div class="earth1 earth2">
    <div class="sand1"></div>
    <div class="sand1 sand2"></div>
    <div class="sand1 sand3"></div>
    <div class="sand1 sand4"></div>
    <div class="sand1 sand5"></div>
    <div class="sand1 sand6"></div>
    <div class="sand1 sand7"></div>
    <div class="sand1 sand8"></div>
  </div>
</div>

样式:

/* 泥土 */
.earth{
  position: absolute;
  top: 300px;
  left: 0;
  z-index: 5;
  display: flex;
}
.earth1{
  width: 160px;
  height:80px;
  background: #E9B855;
  border: 2px solid #3F443E;
  border-bottom: none;
  border-radius: 142% 160% 0 0/ 200% 300% 0 0;
  position: relative;
  z-index: 5;
}
.earth1-left{
  border-right: 0;
}
.earth2{
  margin-left: -70px;
  border-left: 0;
  z-index: 4;
}
.earth .sand1{
  width: 5px;
  height: 7px;
  border-radius: 80%;
  background: #B8882D;
  position: absolute;
  left: 40px;
  top: 20px;
}
.earth .sand2{
  left: 80px;
  top: 30px;
}
.earth .sand3{
  left: 70px;
  top: 30px;
}
.earth .sand4{
  left: 60px;
  top: 50px;
}
.earth .sand5{
  left: 10px;
  top: 50px;
}
.earth .sand6{
  left: 20px;
  top: 70px;
}
.earth .sand7{
  left: 120px;
  top: 50px;
}
.earth .sand8{
  left: 120px;
  top: 20px;
}

1.4 石头

石头画比较简单,椭圆边框绘画;贝壳也是椭圆矩形拼接叠加起来,只不过需要旋转角度。复制多几份出来看起来多一点。

html:

<!-- 石头+贝壳 -->
<div class="stone">
  <div class="stone1"></div>
  <div class="stone1 stone2"></div>
  <div class="stone1 stone3"></div>
  <div class="stone1 stone4"></div>
  <div class="stone1 stone5"></div>
  <div class="stone1 stone6"></div>
  <div class="stone1 stone7"></div>
  <div class="stone1 stone8"></div>
  <div class="stone1 stone9"></div>
  <div class="stone1 stone10"></div>
</div>
<div class="stone-big">
  <div class="stone-big-1">
    <div class="spot1"></div>
    <div class="spot1 spot2"></div>
    <div class="spot1 spot3"></div>
  </div>
  <div class="stone-big-2">
    <div class="spot1"></div>
    <div class="spot1 spot2"></div>
    <div class="spot1 spot3"></div>
  </div>
  <div class="stone-big-3">
    <div class="spot1"></div>
    <div class="spot1 spot2"></div>
    <div class="spot1 spot3"></div>
  </div>
</div>

样式:

/* 石头+贝壳 */
.stone{
  position: absolute;
  left: 300px;
  top: 160px;
}
.stone1{
  width: 15px;
  height: 12px;
  border-radius: 60%;
  background: #B3A479;
  border: 2px solid #57504D;
  transform: rotate(-43deg);
  position: absolute;
  left: 100px;
  top: 163px;
}
.stone2{
  width: 10px;
  height: 8px;
  left: 200px;
  top: 163px;
  transform: rotate(43deg);
}
.stone3{
  width: 20px;
  height: 18px;
  left: 374px;
  top: 123px;
  transform: rotate(43deg);
}
.stone4{
  width: 2px;
  height: 3px;
  left: 245px;
  top: 123px;
  background: #765F47;
}
.stone5{
  width: 1px;
  height: 1px;
  left: 145px;
  top: 123px;
  background: #765F47;
}
.stone6{
  width: 3px;
  height: 4px;
  left: 80px;
  top: 153px;
  border: 0;
  background: #765F47;
}
.stone7{
  width: 3px;
  height: 4px;
  left: 6px;
  top: 180px;
  border: 0;
  background: #765F47;
}
.stone8{
  width: 3px;
  height: 4px;
  left: 700px;
  top: 180px;
  background: #765F47;
}
.stone9{
  width: 8px;
  height: 12px;
  left: 760px;
  top: 150px;
  background: #765F47;
}
.stone10{
  width: 12px;
  height: 14px;
  left: 890px;
  top: 190px;
  background: #765F47;
}

.stone-big{
  position: absolute;
  left: 780px;
  top: 300px;
  display: flex;
}
.stone-big-1{
  position: absolute;
  width: 10px;
  height: 10px;
  border: 2px solid #7C6150;
  border-bottom: 0;
  border-radius: 123px 113px 0 0/181px 184px 0 0;
}
.stone-big-2{
  position: absolute;
  left: 14px;
  width: 10px;
  height: 20px;
  border: 2px solid;
  border-bottom: 0;
  border-radius: 123px 113px 0 0/181px 184px 0 0;
  margin-top: -10px;
}
.stone-big-3{
  position: absolute;
  left: 28px;
  width: 10px;
  height: 10px;
  border: 2px solid;
  border-bottom: 0;
  border-radius: 123px 113px 0 0/181px 184px 0 0;
}
.spot1{
  width: 2px;
  height: 3px;
  background: #7C6150;
  border-radius: 50%;
  position: absolute;
  top: 5px;
  left: 5px;
}
.spot2{
  left: 8px;
  top: 6px;
}
.spot3{
  left: 5px;
  top: 11px;
}

1.5 海星

海星一开始画的是五角星,看起来比较不像海星,所以就有了海星2号,海星2号是由几个椭圆形状的拼接旋转叠加在一起,然后在上面画几个圆点,这样看起来就比较像了。

html:

<!-- 海星 -->
<div class="starfish">
  <div class="star">
  </div>
  <div class="star-b"></div>
</div>
<div class="starfish starfish-pos2">
  <div class="star"></div>
  <div class="star-b"></div>
</div>
<div class="starfish starfish-pos3">
  <div class="star"></div>
  <div class="star-b"></div>
</div>
<!-- 海星2--start -->
<div class="h-star">
  <div class="h-star0 h-star1"></div>
  <div class="h-star0 h-star2"></div>
  <div class="h-star0 h-star3"></div>
  <div class="h-star0 h-star4"></div>
  <div class="h-star0 h-star5"></div>
</div>
<!-- end -->

样式:

/* 海星 */
.starfish{
  position: absolute;
  left: 302px;
  top: 199px;
  z-index: 5;
  transform: skew(3deg) scale(0.8) rotate(22deg);
}
.starfish-pos2{
  left: 584px;
  top: 272px;
  transform: skew(3deg) scale(0.5) rotate(22deg);
}
.starfish-pos3{
  left: 1200px;
  top: 272px;
  transform: skew(3deg) scale(0.5) rotate(72deg);
}
.star{
  position: absolute;
  top: 10px;
  left: 0;
  z-index: 2;
  width: 0;
  height: 0;
  border-style: solid;
  border-color: transparent transparent #E6A93C transparent;
  border-width: 70px 100px;
  transform: rotate(35deg) scale(0.2);
}
.star::before{
  position: absolute;
  content: '';
  width: 0;
  height: 0;
  top: -128px;
  left: -95px;
  border-style: solid;
  border-color: transparent transparent #E6A93C transparent;
  border-width: 80px 30px;
  transform: rotate(-35deg);
}
.star::after{
  position: absolute;
  content: '';
  width: 0;
  height: 0;
  top: -45px;
  left: -140px;
  border-style: solid;
  border-color: transparent transparent #E6A93C transparent;
  border-width: 70px 100px;
  transform: rotate(-70deg);
}
/* 五角星底层 */
.star-b{
  position: absolute;
  top: 9px;
  left: 1px;
  z-index: 1;
  width: 0;
  height: 0;
  border-style: solid;
  border-color: transparent transparent #524C48 transparent;
  border-width: 70px 100px;
  transform: rotate(35deg) scale(0.25);
}
.star-b::before{
  position: absolute;
  content: '';
  width: 0;
  height: 0;
  top: -128px;
  left: -95px;
  border-style: solid;
  border-color: transparent transparent #524C48 transparent;
  border-width: 80px 30px;
  transform: rotate(-35deg);
}
.star-b::after{
  position: absolute;
  content: '';
  width: 0;
  height: 0;
  top: -45px;
  left: -140px;
  border-style: solid;
  border-color: transparent transparent #524C48 transparent;
  border-width: 70px 100px;
  transform: rotate(-70deg);
}

/* 海星2-start */
.h-star{
  position: absolute;
  left: 900px;
  top: 300px;
}
.h-star::before{
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 80%;
  background: #B8882D;
  position: absolute;
  left: 27px;
  top: -11px;
  z-index: 2;
}
.h-star1,.h-star0{
  position: absolute;
  left: 14px;
  width: 11px;
  height: 18px;
  border-bottom: 0;
  margin-top: -10px;
  border: 2px solid #E6A93C;
  border-radius: 0 0 50% 50%/0 0 100% 100%;
  transform: rotate(40deg);
  background-color: #E6A93C;
  z-index: 1;
}
.h-star0::after{
  content: "";
  width: 4px;
  height: 4px;
  border-radius: 80%;
  background: #B8882D;
  position: absolute;
  left: 2px;
  top: 11px;
}
.h-star0::before{
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 80%;
  background: #B8882D;
  position: absolute;
  left: 2px;
  top: 3px;
}
.h-star2{
  left: 30px;
  transform: rotate(320deg);
}
.h-star3{
  left: 36px;
  top: -13px;
  transform: rotate(260deg);
  z-index: 0;
}
.h-star4{
  left: 8px;
  top: -11px;
  transform: rotate(100deg);
  z-index: 0;
}
.h-star5{
  left: 21px;
  top: -19px;
  transform: rotate(542deg);
}
/* end */

1.6 贝壳

贝壳实在是太多形状了又不规则,画起来比较难,我最后画出来的这个贝壳感觉比较像羽毛球(哭笑不得),哈哈,知道是贝壳就好。

<!-- 贝壳 -->
<div class="shell">
  <div class="shell-b"></div>
  <div class="shell-p-b">
    <div class="shell-p1"></div>
    <div class="shell-p1 shell-p2"></div>
    <div class="shell-p1 shell-p3"></div>
    <div class="shell-p1 shell-p4"></div>
  </div>
</div>
<div class="shell shell-pos2">
  <div class="shell-b"></div>
  <div class="shell-p-b">
    <div class="shell-p1"></div>
    <div class="shell-p1 shell-p2"></div>
    <div class="shell-p1 shell-p3"></div>
    <div class="shell-p1 shell-p4"></div>
  </div>
</div>

样式:

/* 贝壳 */
.shell{
  position: absolute;
  top: 290px;
  left: 477px;
  z-index: 6;
  transform: scale(0.6);
}
.shell-b{
  width: 20px;
  height: 20px;
  background: #AC9162;
  border: 2px solid #806A65;
  border-radius: 10px;
}
.shell-p-b{
  position: absolute;
  top: -21px;
  left: -12px;
  display: flex;
}
.shell-p1{
  width: 12px;
  height: 30px;
  background: #AC9162;
  border-radius: 46%;
  border: 2px solid #806A65;
  transform: rotate(-29deg);
}
.shell-p2{
  transform: rotate(-19deg);
  margin-left: -6px;
}
.shell-p3{
  transform: rotate(-5deg);
  margin-left: -6px;
}
.shell-p4{
  transform: rotate(19deg);
  margin-left: -6px;
}

.shell-pos2{
  top: 320px;
  left: 877px;
  transform: rotate(60deg) scale(0.6);
}

2. 海浪和椰子树摇摆的动画

2.1 海浪动画

海浪动画是用css3的位移transform: translate(-9514px);设置一段距离移动,设置了两层,希望看起来能更像一点。

样式:

/* 波浪动画 */
.wave-cell01{
  transition: all 0.5s;
  animation: shake 300s linear infinite alternate;
}
@keyframes shake{
  0%{
    transform: translate(0);
    bottom: 0;
  }
  100%{
    transform: translate(-9514px);
    bottom: -30px;
  }
}
.wave-cell02{
  transition: all 2s;
  animation: shake2 400s linear infinite alternate;
}
@keyframes shake2{
  0%{
    transform: translate(0);
    bottom: -20px;
  }
  100%{
    transform: translate(-9514px);
    bottom: -10px;
  }
}

2.2 椰子树动画

椰子树动画是给椰子叶加了旋转动画效果,幅度设置小一点点,不需要那么大,设置的时候重要的地方在于设置基点transform-origin: left bottom; 控制叶子的一头摆动,枝干也是同样的道理。

样式:

/* 椰子树动画 */
.leafO{
  transform-origin: left bottom;
  animation: blow1 2s linear infinite alternate;
}
@keyframes blow1{
  0%{
    transform: rotate(-45deg);
  }
  100%{
    transform: rotate(-40deg);
  }
}
.leaf2{
  transform-origin: right bottom;
  animation: blow2 2s linear infinite alternate;
}
@keyframes blow2{
  0%{
    transform: rotate(22deg);
  }
  100%{
    transform: rotate(28deg);
  }
}
.leaf3{
  transform-origin: right top;
  animation: blow3 2s linear infinite alternate;
}
@keyframes blow3{
  0%{
    transform: rotate(-38deg);
  }
  100%{
    transform: rotate(-32deg);
  }
}
.leaf4{
  transform-origin: left top;
  animation: blow4 2s linear infinite alternate;
}
@keyframes blow4{
  0%{
    transform: rotate(10deg);
  }
  100%{
    transform: rotate(16deg);
  }
}
.leaf5{
  transform-origin: left top;
  animation: blow5 2s linear infinite alternate;
}
@keyframes blow5{
  0%{
    transform: rotate(47deg);
  }
  100%{
    transform: rotate(42deg);
  }
}
/* 枝干摆动 */
.trunk{
  transform-origin: center bottom;
  animation: swing 2s linear infinite alternate;
}
@keyframes swing{
  0%{
    transform: rotate(-2deg);
  }
  100%{
    transform: rotate(-3deg);
  }
}

总结

本文主要介绍了海浪,沙滩,沙滩上面的贝壳,海星之类的,还有椰子树制作,主要是画了几个比较重要代表的东西,希望这个夏天带给大家不一样的感受,想象一下自己在海边的感觉,感受着大海,仿佛微风吹在脸上。以上内容就这些,感谢观看,觉得还不错给个赞支持一下,谢谢~ ღ( ´・ᴗ・` )比心