前端技术,一个超炫酷带阴影的CSS/Sass 3D进度条




今天我们想向大家展示如何创建一些具有特殊3D外观的纯CSS进度条。不妨将本教程当作是一个高级的CSS练习,以更深入地了解更多有趣的3D属性和着色技术。仅使用CSS创建UI组件将训练你的创造性思维,并且在本教程中,我们将通过制作进度条并动画化来向大家展示一些如何创建更复杂形状的技巧。


注意:某些CSS属性仅在现代浏览器中受支持。IE仍然不支持transform-style:preserve-3d,这是一个用于创建嵌套3D结构的关键属性;所以进度条在IE浏览器中将是扁平/无效的。


浏览器支持:Chrome Firefox Internet Explorer Safari Opera



源码下载(http://www.html5tricks.com/jquery-css3-3d-progress-bar.html)


我们将在本教程中使用Sass(与Compass一起使用),因此请确保设置并了解其基础知识:


  • 安装Sass和Sass Basics

  • 安装Compass Stylesheet Authoring Framework和Compass CSS3


  • 如果你想对动画进度条使用完整的解决方案,那么你应该查看Kimmo Brunfeldt的ProgressBar.js或HubSpot的PACE,以获得出色的页面加载进度条。


    为了生成所有必要的前缀,你可以使用像Autoprefixer或用于Sublime Text的插件。


    我们将使用许多有趣的CSS属性,如transform,perspective和box-shadow。我们还将大量使用SASS,以节省生成进度条的位置和外观所需的很多时间。通过使用相对大小(em,百分比),我们可以确保进度条的大小易于调整。


    构建面


    我们先从构建一个包含所有六个面的框开始。这个框将作为我们的主要容器,用来设置进度条的尺寸及其视点。我们还将使用一个包装器用于透视图,并且这个包装器的font-size属性将允许使用某些em单位魔法的帮助来扩展进度条。


    为了确保所有的面都是我们3D空间的一部分,我们需要将transform-style: preserve-3d应用于框。


    所以让我们从初始化一些颜色变量开始来编写样式吧:


    $light-gray: #e0e0e0;

    $magenta: #ec0071;

    $white: #f5f5f5;


    .perspective {

      font-size: 5em; // sets the main scale size

      perspective: 12em; // sets the perspective

      perspective-origin: 50% 50%;

      text-align: center;

    }


    .bar {

      display: inline-block;

      width: 1em;

      height: 1em;

      margin-top: 1em;

      position: relative;

      transform: rotateX(60deg); // sets the view point

      transform-style: preserve-3d; // perspective for the children

    }


    现在,我们来看看这些面。如果我们想要能够毫无困难地重新调整我们的主框,里面包含的面必须得像液体一样具有流动行为以及具备绝对位置。


    .bar {

      // -> The SCSS written before

      .bar-face {

        display: inline-block;

        width: 100%;

        height: 100%;

        position: absolute;

        bottom: 0;

        left: 0;

        background-color: rgba($light-gray, .6); // just to see what is happening

      }

    }


    写标记并且确保它是可以访问的:


    <div class="perspective">

      <div class="bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">

        <div class="bar-face"/>

        <div class="bar-face"/>

        <div class="bar-face"/>

        <div class="bar-face"/>

        <div class="bar-face"/>

        <div class="bar-face"/>

      </div>

    </div>


    如果你有兴趣了解更多有关可访问性的信息,这篇文章(由Gez Lemon撰写)帮助我了很多:‘Introduction to WAI ARIA’


    设置面


    这是非常重要的一部分。进度条的面必须准确定向,这样当我们开始添加百分比填充时,就不会陷入困境。


    .bar {

    // -> The SCSS from before

    .bar-face {

    // -> The SCSS from before

    transform-origin: 50% 100%;

    &.roof {

    transform: translateZ(1em);

    }

    &.front {

    transform: rotateX(-90deg);

    }

    &.right {

    left: auto;

    right: -.5em;

    width: 1em;

    transform: rotateX(-90deg) rotateY(90deg) translateX(.5em);

    }

    &.back {

    transform: rotateX(-90deg) rotateY(0deg) translateZ(-1em);

    }

    &.left {

    width: 1em;

    transform: rotateX(-90deg)rotateY(-90deg) translateX(-.5em) translateZ(.5em);

    }

    }

    }


    <div class="perspective">

      <div class="bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">

        <div class="bar-face roof"/>

        <div class="bar-face front"/>

        <div class="bar-face left"/>

        <div class="bar-face right"/>

        <div class="bar-face back"/>

        <div class="bar-face floor"/>

      </div>

    </div>



    好的,这是一个很棒的立方体,但是我们要为进度条创建一个矩形。如果你还记得的话,我们已经用一种液体化的方法构建了面,所以如果我们只是增加.bar类的width,那么这样就可以。在这个例子中,我们使用了4em的宽度。



    构建百分比填充


    百分比填充将包含在面内,并且,为了保持HTML代码的最小化,我们将使用伪类:before。这样生成的:before元素将显示相对于面宽度的百分比。


    .bar {

    // -> The SCSS from before

    .bar-face {

    // -> The SCSS from before

    &.percentage:before {

    content: '';

    display: block;

    position: absolute;

    bottom: 0;

    width: 0;

    height: 100%;

    margin: 0;

    background-color: rgba($magenta, .8);

    transition: width .6s ease-in-out;

    }

    }

    }


    <div class="perspective">

    <div class="bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">

    <div class="bar-face roof percentage"/>

    <div class="bar-face front percentage"/>

    <div class="bar-face left"/>

    <div class="bar-face right"/>

    <div class="bar-face back percentage"/>

    <div class="bar-face floor percentage"/>

    </div>

    </div>



    现在我们需要编写百分比填充样式。手动编写一百个类将会非常繁琐,所以让我们写一些可靠的循环来从HTML中获取aria-valuenow属性的所有值。


    .bar {

    // -> The SCSS from before

    .bar-face {

    // -> The SCSS from before

    }


    @for $i from 0 to 101 {

    &[aria-valuenow='#{$i}'] {

    .percentage:before {

                    width: $i * 1%;

    }

    }

    }

    }


    如果你想立竿见影地看到成果,那么只需将HTML中的aria-valuenow属性从0更改至100。


    构建皮肤


    为了构建皮肤,我们将使用Sass mixins。为了得到一个现实化的外观,我们将使用box-shadow属性。这个属性支持一个数组的值,并且这个数组将允许我们模拟照明。我们将在这个属性中包含地面阴影和面的采光。


    @mixin build-skin($color, $name) {

    &.#{$name} {

    .floor {

    box-shadow:

    0 -0.2em 1em rgba(0,0,0,.15),

    0 0.2em 0.1em -5px rgba(0,0,0,.3),

    0 -0.75em 1.75em rgba($white,.6);

    }

    .left {

    background-color: rgba($color, .5);

    }

    .percentage:before {

    background-color: rgba($color, .5);

    box-shadow: 0 1.6em 3em rgba($color,.25);

    }


    }

    }

    .bar {

    // -> The SCSS from before

    @include build-skin(#57caf4, 'cyan');

    }


    <div class="perspective">

    <div class="bar cyan" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">

    <div class="bar-face roof percentage"/>

    <div class="bar-face front percentage"/>

    <div class="bar-face left"/>

    <div class="bar-face right"/>

    <div class="bar-face back percentage"/>

    <div class="bar-face floor percentage"/>

    </div>

    </div>



    此外,我们需要一个照亮面的技巧。如果我们以正确的顺序输入面的DOM节点,我们将看到奇迹:


    <div class="perspective">

    <div class="bar cyan" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">

    <div class="bar-face roof percentage"/>

    <div class="bar-face back percentage"/>

    <div class="bar-face floor percentage"/>

    <div class="bar-face left"/>

    <div class="bar-face right"/>

    <div class="bar-face front percentage"/>

    </div>

    </div>



    这里发生了什么?很简单:当浏览器渲染一个绝对元素时,默认情况下它会添加一个自动递增的z-index(如果我们不编辑此属性的话)。所以,如果我们通过先放置底部的面来改变渲染顺序,那么它的阴影就会覆盖在背面的所有面上。这就是我们实现现实化阴影的原理。


    关于如何实现进度条就都在这里了!现在,请查看所有DEMO演示和源代码文件,然后开始构建皮肤来训练自己此技能吧。


    感谢各位的阅读,希望本教程能对你有所帮助!


    源自:www.codeceo.com/article/css3-sass-3d-progress-bar.html

    声明:文章著作权归作者所有,如有侵权,请联系小编删除。




    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 203,456评论 5 477
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 85,370评论 2 381
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 150,337评论 0 337
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 54,583评论 1 273
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 63,596评论 5 365
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 48,572评论 1 281
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 37,936评论 3 395
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 36,595评论 0 258
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 40,850评论 1 297
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 35,601评论 2 321
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 37,685评论 1 329
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,371评论 4 318
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 38,951评论 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 29,934评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,167评论 1 259
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 43,636评论 2 349
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 42,411评论 2 342