• 【100个前端小项目-1】HTML & CSS 实现可爱卡通画


    一直以来对前端抱有莫名的兴趣,这次换工作后如愿以偿的接手了很多前端的任务。借着之前粗浅的经验上手的还算快,可是深入的方面就不太跟得上了。众所周知,前端的学习离不开实践和积累,为了快速而有效的进步,在此制定了第一阶段的学习任务 -- 收集和实现CodePen上100个前端小项目。此阶段的目的是借着一个个小项目快速熟悉HTML, CSS, JS的简单应用和套路。

    下面开始进入正题,第一个项目是我在CodePen上看到的,觉得图案可爱就把代码扒了下来实现了一遍(图案见下图)。这个项目精髓主要在于CSS,研究完这个项目,基本上可以对CSS盒模型,瀑布流模式,DOM分层有基本的掌握。

    https://codepen.io/xinxhe/pen/PooQNXJ?editors=1100

     
    image.png

    下面是HTML的实现,这里是用了pug,语法上更简洁。可以看出,HTML元素的分层是自外向内的,最外面是一个大的container,向内一层分为了三个大块:笑脸,下划线,和背景装饰物,再向内就是三大块中的各种细节。

    div.container
      div.smiley__face.smiley__face--01 // 笑脸中间
        div.face
          div.eyes
            div.eye.eye__left
            div.eye.eye__right
          div.mouth
      div.smiley__face.smiley__face--02 // 笑脸左边
        div.face
          div.eyes
            div.eye.eye__left
            div.eye.eye__right
          div.mouth
      div.smiley__face.smiley__face--03 // 笑脸右边
        div.face
          div.eyes
            div.eye.eye__left
            div.eye.eye__right
          div.mouth
      div.underground // 下划线
      div.sparkles // 星星和圈圈
        div.star.star--01
        div.star.star--02
        div.star.star--03
        div.circle.circle--01
        div.circle.circle--02
        div.circle.circle--03
        div.circle.circle--04

    CSS的实现比较长,直接上注释解释。

      1 * {
      2   margin: 0;
      3   padding: 0;
      4   box-sizing: border-box; // padding和border的宽度包含在width和height中
      5 }
      6 body {
      7   display: block;
      8   width: 100%;
      9   height: 100vh; // 1vh代表浏览器viewport高度的1%. Viewport代表浏览器窗口的大小,如果拖动浏览器边框,浏览器的viewport会根据窗口边界的拖动而改变大小。
     10   background: #ecf0f1; 
     11 }
     12 .container {
     13   position: relative; // 相对于正常位置。在这里,container的位置确定是相对于body的元件的。
     14   display: flex; // 盒模型,可以定义其子组件的排列方式
     15   width: 100%;
     16   height: 100vh;
     17   justify-content: center; // Horizontal alignment,水平居中
     18   align-items: center; // Vertical alignment,垂直居中
     19   .smiley__face {
     20     padding: 10px;
     21     position: absolute; // 元件的位置是相对于最近的positioned的父元件来确定的。Positioned的元件是指任何具有position属性但是其值不是static的父元件。在这里,smiley__face的位置是相对于container来定的。
     22     display: flex;
     23     align-items: flex-start; // 垂直靠顶端排列
     24     justify-content: center;
     25     border: 12px solid #2c3e50;
     26     width: 170px;
     27     height: 190px;
     28     background: #ffffff;
     29     border-radius: 15px;
     30     overflow: hidden;
     31     .face {
     32       background: #f1c40f;
     33       width: 100%;
     34       height: 120px;
     35       border-radius: 5px;
     36       display: flex;
     37       flex-direction: column; // 定义子元件们的排列方式为竖直的一列。
     38       justify-content: center;
     39       align-items: center;
     40       position: relative; // 位置定义相对于smiley__face,因为smiley__face有position的属性(并且值不是static),并且是最近的父元件
     41       overflow: hidden; 
     42       z-index: 1; // z-index定义了层级关系,数字越大层级越高
     43       .eyes {
     44         display: flex;
     45         justify-content: space-between; // 定义了子元件们之间间隔的平均排列方式
     46         align-items: center;
     47         height: 20px;
     48         width: 60%;
     49         .eye {
     50           display: block;
     51           width: 15px;
     52           height: 15px;
     53           background: #2c3e50;
     54           border-radius: 50px;
     55         }
     56       }
     57       .mouth {
     58         display: block;
     59         width: 32px;
     60         height: 20px;
     61         background: #2c3e50;
     62         border-top-left-radius:15px;
     63         border-top-right-radius:15px;
     64         border-bottom-left-radius:50px;
     65         border-bottom-right-radius:50px;
     66         position: relative;
     67         overflow: hidden;
     68         &::before { // 舌头
     69           content: "";
     70           display: block;
     71           width: 20px;
     72           height: 10px;
     73           background: #e74c3c;
     74           border-radius:50%;
     75           position: absolute;
     76           left: 50%;
     77           bottom: 2px;
     78           transform: translateX(-50%); // Move 50% of the width of the element
     79         }
     80       }
     81     }
     82     &.smiley__face--01 {
     83       z-index: 3;
     84     }
     85     &.smiley__face--02,
     86     &.smiley__face--03 {
     87       z-index: 2;
     88     }
     89     &.smiley__face--02 {
     90       transform: rotate(-25deg) translate(-100px, -8px) scale(.9);
     91       .face {
     92         background: #3498db;
     93         &::before { // 脸部非阴影部分
     94           content: "";
     95           position: absolute;
     96           left: 0;
     97           top: 0;
     98           display: block;
     99           width: 70%;
    100           height: 100%;
    101           background: #0abde3;
    102           z-index: -1;
    103           transform: skewX(-25deg) translateX(-30%);
    104         }
    105       }
    106     }
    107     &.smiley__face--03 {
    108       transform: rotate(25deg) translate(100px, -8px) scale(.9);
    109       .face { // 脸部非阴影部分
    110         background: #ff7f50;
    111         &::before {
    112           content: "";
    113           position: absolute;
    114           left: 0;
    115           top: 0;
    116           display: block;
    117           width: 70%;
    118           height: 100%;
    119           background:#ff6348;
    120           z-index: -1;
    121           transform: skewX(25deg) translateX(-30%);
    122         }
    123       }
    124     }
    125   }
    126   .underground {
    127     display: block;
    128     width: 200px;
    129     margin: 0 auto;
    130     border: 6px solid #2c3e50;
    131     position: relative;
    132     height: 1px;
    133     transform: translateY(180px);
    134     border-radius: 50px;
    135   }
    136   .sparkles {
    137     position: absolute;
    138     display: block;
    139     width: 500px;
    140     height: 80%;
    141     .star {
    142       display: block;
    143       width: 50px;
    144       height: 50px;
    145       margin: 20px;
    146       position: absolute;
    147       overflow: hidden;
    148       &::before { // 星星中横杠
    149         content: "";
    150         display: block;
    151         width: 80%;
    152         position: absolute;
    153         left: 0;
    154         top: 50%;
    155         transform: translate(0, -50%);
    156         border:4px solid #2c3e50;
    157         border-radius: 50px;
    158       }
    159       &::after { // 星星中竖杠
    160         content:"";
    161         display: block;
    162         height:80%;
    163         position: absolute;
    164         left:50%;
    165         top:50%;
    166         transform:translate(-50%,-50%);
    167         border:4px solid #2c3e50;
    168         border-radius:50px;
    169       }
    170       &.star--01 {
    171         top:10%;
    172         left:30%;
    173         transform:translate(-30%,-10%) scale(.4);
    174         &::before {
    175           border-color:#f1c40f;
    176         }
    177         &::after {
    178           border-color:#f1c40f;
    179         }
    180         &::before,
    181         &::after {
    182           border-width:6px;
    183         }
    184       }
    185       &.star--02 {
    186         top: 20%;
    187         left: 90%;
    188         transform: translate(-90%, -20%) scale(.3);
    189         &::before {
    190           border-color: #3498db;
    191         }
    192         &::after {
    193           border-color: #3498db;
    194         }
    195         &::before,
    196         &::after {
    197           border-width: 6px;
    198         }
    199       }
    200       &.star--03 {
    201         top: 2%;
    202         left: 60%;
    203         transform: translate(-60%, -2%) scale(.7);
    204         &::before {
    205           border-color: #ff7f50;
    206         }
    207         &::after {
    208           border-color: #ff7f50;
    209         }
    210         &::before,
    211         &::after {
    212           border-width: 5px;
    213         }
    214       }
    215     }
    216     .circle {
    217       display: block;
    218       width: 50px;
    219       height: 50px;
    220       border-radius: 50px;
    221       background: #f1c40f;
    222       position: absolute;
    223       &.circle--01 {
    224         border: 10px solid #f1c40f;
    225         background: transparent;
    226         top: 10%;
    227         left: 15%;
    228         transform: translate(-15%, -10%) scale(.5);
    229       }
    230       &.circle--02 {
    231         background: transparent;
    232         border: 15px solid #3498db;
    233         top: 40%;
    234         left: 100%;
    235         transform: translate(-100%, -40%) scale(.2);
    236       }
    237       &.circle--03 {
    238         background: #ff7f50;
    239         top: 30%;
    240         left: 8%;
    241         transform: translate(8%, -30%) scale(.3);
    242       }
    243       &.circle--04 {
    244         top: 70%;
    245         left: 0%;
    246         transform: translate(0%, -70%) scale(.2);
    247       }
    248     }
    249   }
    250 }
     
     
  • 相关阅读:
    hdu 2295 DLX
    hdu 4714 树形DP
    hdu 4711 动态规划
    hdu 3656 DLX
    hust 1017 DLX
    hdu 3938 并查集
    hdu 3652 打表
    poj 2152 树形DP
    洛谷P1266速度限制
    洛谷P1841重要的城市
  • 原文地址:https://www.cnblogs.com/xinxhe/p/11847681.html
Copyright © 2020-2023  润新知