zoukankan      html  css  js  c++  java
  • CSS变量,实现条形加载

    CSS终于也有变量了,原生 CSS 从此变得异常强大。

    CSS变量又名CSS自定义属性,指可在整个文档中重复使用的值。它由自定义属性--var和函数var()组成,var()用于引用自定义属性。

    谈到为何会在CSS中使用变量。示例:

     1 /* 不使用变量 */
     2 .title {
     3     background-color: red;
     4 }
     5 .desc {
     6     background-color: red;
     7 }
     8 
     9 /* 使用变量 */
    10 :root {
    11     --bg-color: red;
    12 }
    13 .title {
    14     background-color: var(--bg-color);
    15 }
    16 .desc {
    17     background-color: var(--bg-color);
    18 }

    CSS使用变量有如下好处。

    • 减少样式代码的重复性
    • 增加样式代码的扩展性
    • 提高样式代码的灵活性
    • 增多一种CSS与JS的通讯方式
    • 不用深层遍历DOM改变某个样式

    可能有些同学会问,sassless早就实现了变量该特性,何必再多此一举呢?可是细想一下,变量对比Sass变量Less变量又有它的过人之处。

    • 浏览器原生特性,无需经过任何转译可直接运行
    • DOM对象一员,极大便利了CSS与JS间的联系

    如何使用变量

    • 声明:--变量名
    • 读取:var(--变量名, 默认值)
    • 类型
      • 普通:只能用作属性值不能用作属性名
      • 字符:与字符串拼接 "Hello, "var(--name)
      • 数值:使用calc()与数值单位连用 var(--width) * 10px
    • 作用域
      • 范围:当前节点块作用域及其子节点块作用域下有效
      • 优先级别:内联样式 = 外联样式 > ID选择器 > 类选择器 = 伪类选择器 = 属性选择器 > 标签选择器 = 伪元素选择器 > 通配选择器 = 后代选择器 = 兄弟选择器

    场景

    其实变量有一个特别好用的场景,那就是结合List集合使用。

    实例

    条形加载条

    一个条形加载条通常由几条线条组成,每条线条对应一个存在不同时延的相同动画,通过时间差运行相同动画,从而产生加载效果。

    1 <ul class="strip-loading">
    2     <li v-for="v in 6" :key="v" :style="`--line-index: ${v}`"></li>
    3 </ul>
     1 .strip-loading {
     2     display: flex;
     3     justify-content: center;
     4     align-items: center;
     5     width: 200px;
     6     height: 200px;
     7     li {
     8         --time: calc((var(--line-index) - 1) * 200ms);
     9         border-radius: 3px;
    10         width: 6px;
    11         height: 30px;
    12         background-color: #f66;
    13         animation: beat 1.5s ease-in-out var(--time) infinite;
    14         & + li {
    15             margin-left: 5px;
    16         }
    17     }
    18 }
    19 @keyframes beat {
    20     0%,
    21     100% {
    22         transform: scaleY(1);
    23     }
    24     50% {
    25         transform: scaleY(.5);
    26     }
    27 }

    这就是变量的作用范围所致(在当前节点块作用域及其子节点块作用域下有效),因此在.strip-loading的块作用域下调用--line-index是无效的。

    示例二:改编心型加载条

    1 <div class="heart-loading">
    2     <ul style="--line-count: 9">
    3         <li v-for="v in 9" :key="v" :class="`line-${v}`" :style="`--line-index: ${v}`"></li>
    4     </ul>
    5 </div>
      1 .heart-loading {
      2     display: flex;
      3     justify-content: center;
      4     align-items: center;
      5     width: 200px;
      6     height: 200px;
      7     ul {
      8         display: flex;
      9         justify-content: space-between;
     10         width: 150px;
     11         height: 10px;
     12     }
     13     li {
     14         --Θ: calc(var(--line-index) / var(--line-count) * .5turn);
     15         --time: calc((var(--line-index) - 1) * 40ms);
     16         border-radius: 5px;
     17         width: 10px;
     18         height: 10px;
     19         background-color: #3c9;
     20         filter: hue-rotate(var(--Θ));
     21         animation-duration: 1s;
     22         animation-delay: var(--time);
     23         animation-iteration-count: infinite;
     24         &.line-1,
     25         &.line-9 {
     26             animation-name: beat-1;
     27         }
     28         &.line-2,
     29         &.line-8 {
     30             animation-name: beat-2;
     31         }
     32         &.line-3,
     33         &.line-7 {
     34             animation-name: beat-3;
     35         }
     36         &.line-4,
     37         &.line-6 {
     38             animation-name: beat-4;
     39         }
     40         &.line-5 {
     41             animation-name: beat-5;
     42         }
     43     }
     44 }
     45 @keyframes beat-1 {
     46     0%,
     47     10%,
     48     90%,
     49     100% {
     50         height: 10px;
     51     }
     52     45%,
     53     55% {
     54         height: 30px;
     55         transform: translate3d(0, -15px, 0);
     56     }
     57 }
     58 @keyframes beat-2 {
     59     0%,
     60     10%,
     61     90%,
     62     100% {
     63         height: 10px;
     64     }
     65     45%,
     66     55% {
     67         height: 60px;
     68         transform: translate3d(0, -30px, 0);
     69     }
     70 }
     71 @keyframes beat-3 {
     72     0%,
     73     10%,
     74     90%,
     75     100% {
     76         height: 10px;
     77     }
     78     45%,
     79     55% {
     80         height: 80px;
     81         transform: translate3d(0, -40px, 0);
     82     }
     83 }
     84 @keyframes beat-4 {
     85     0%,
     86     10%,
     87     90%,
     88     100% {
     89         height: 10px;
     90     }
     91     45%,
     92     55% {
     93         height: 90px;
     94         transform: translate3d(0, -30px, 0);
     95     }
     96 }
     97 @keyframes beat-5 {
     98     0%,
     99     10%,
    100     90%,
    101     100% {
    102         height: 10px;
    103     }
    104     45%,
    105     55% {
    106         height: 90px;
    107         transform: translate3d(0, -20px, 0);
    108     }
    109 }

    哈哈,原来不用一句JS也能做出好看好玩的特效效果,加油吧,骚年!

    佳物不独来,万物同相携。
  • 相关阅读:
    【读书笔记】《暗时间》刘未鹏
    HDU4389:X mod f(x)(数位DP)
    尴尬的三个星期
    解决一般图匹配的带花树算法
    【Linux常用工具】03. Linux性能测试工具ab
    hdu 1176 免费馅饼(nyist 613)
    删除系统更新后留下的文件夹
    zoj 1109 : Language of FatMouse
    设计模式之Inheritance versus Parameterized Types 继承和参数化类型
    hibernate的查询缓存和二级缓存的配合使用
  • 原文地址:https://www.cnblogs.com/rongrongtu/p/14557338.html
Copyright © 2011-2022 走看看