gulp.spritesmith的学习教训

前言:

css Sprites指的是网页图片的一种处理技巧,通常是将一些体积小的不常更换的图片进行处理,目的是为了减少HTTP请求次数,也是优化必不可少的工作。

这里是对自己在gulp中合成雪碧图的一些的经验和总结!

gulp中用于合成雪碧图的模块有许多,我只是针对gulp-css-spriter和gulp.spritesmith这两个做了尝试,在尝试过程中发现写对css文件和images文件路径是关键问题,只有把路径配对了那几乎没有啥问题了。

gulp-css-sprite

tip:这个模块很久没有更新了,下载量也很小,了解一下即可,可以有时候也是可以用到的.

首页看一下目录结构方便对照观察了解:

var gulp=require("gulp"),
spriter=require('gulp-css-spriter');
gulp.task('sprite',function(){
var timestamp= + new Date();//生成时间戳
gulp.src('src/spriteTest/css/test.css')
    .pipe(spriter({
        // 生成的spriter的位置
            'spriteSheet':'src/spriteTest/dist/images/sprite_'+timestamp+'.png',
        // 生成样式文件图片引用地址的路径
            'pathToSpriteSheetFromCSS':'../images/sprite_'+timestamp+'.png'
    }))
        //图片合并后css文件中图片名也响应替换掉输出的css文件的目的地址    
    .pipe(gulp.dest('src/spriteTest/dist/css/'));
    /*.pipe(autoprefixer({
        browsers:['last 2 Chrome versions', 'Safari >0', 'Explorer >0', 'Edge >0', 'Opera >0', 'Firefox >=20'],
        cascade:false,
        remove:false
    }))*/
});

说明在编译css的时候背景图都加了一个参数用了说明是要css sprite的;

例如test.css文件中添加了"?__spriter"用来标识是要替换的

.icon1:after {
    background: url("../images/icon1.png?__spriter") no-repeat center center;
}
.icon2:after {
    background: url("../images/icon2.png?__spriter") no-repeat center center;
}
.icon3:after {
    background: url("../images/icon3.png?__spriter") no-repeat center center;
}
.icon4:after {
    background: url("../images/icon4.png?__spriter") no-repeat center center;
}

当你在npm install gulp-css-sprite --save-dev下该模块时是默认不加标识的,从网上了解到修改该模块可以加上标识,这里就不具体说明了,可以参考如下博文自行修改:

博客园:

gulp.spritesmith

spritesmith的作用就是拼接图片并生成样式表,并且还能输出SASS,Stylus,LESS甚至是JSON。

这个模块不需要事先写一个css文件然后根据css去寻找图片进行合并,这个模块是将希望合并的小图先进行合并然后根据cssTemplate去生成css文件

先看文件目录:

//雪碧图gulp.spritesmith
gulp.task('spritesmith',['clean'],function(){
    return gulp.src('src/spriteTest/images/*.png')
            .pipe(spritesmith({
                imgName:'images/sprite20161010.png',  //保存合并后图片的地址
                cssName:'css/sprite.css',   //保存合并后对于css样式的地址
                padding:20,
                algorithm:'binary-tree',
                cssTemplate:"src/spriteTest/handlebarsStr.css"
            }))
            .pipe(gulp.dest('//雪碧图gulp.spritesmith

gulp.task('spritesmith',['clean'],function(){

return gulp.src('src/spriteTest/images/*.png')
            .pipe(spritesmith({
                imgName:'images/sprite20161010.png',  //保存合并后图片的地址
                cssName:'css/sprite.css',   //保存合并后对于css样式的地址
                padding:20,
                algorithm:'binary-tree',
                cssTemplate:"src/spriteTest/handlebarsStr.css"
            }))
            .pipe(gulp.dest('src/spriteTest/dist'));

})'));

})

说明一下路径问题:

1.imgName上写的路径是相对于输出路径(gulp.dest),上述代码输出的路径实际是:

"src/spriteTest/dist/images/sprite20161010.png"

2.同理cssName的输出路径也是一样的:

"src/spriteTest/dist/css/sprite.css"

-~v~- 如果不注意这些路径会不容易找见生成的文件滴!

spritesmith的参数说明:

Template String:

   {{#sprites}}
    .icon-{{name}}:before {
          display: block;
          background-image: url({{{escaped_image}}});
          background-position: {{px.offset_x}} {{px.offset_y}};
          width: {{px.width}};
          height: {{px.height}};
        }
    {{/sprites}} 

输出的为:

.icon-fork:before {
  display: block;
  background-image: url(sprite.png);
  background-position: 0px 0px;
  width: 32px;
  height: 32px;
}
.icon-github:before {
/* ... */

Template function的demo:

   // var yaml = require('js-yaml'); 
    {
      imgName: 'sprite.png',
      cssName: 'sprite.yml',
      cssTemplate: function (data) {
        // Convert sprites from an array into an object 
        var spriteObj = {};
        data.sprites.forEach(function (sprite) {
          // Grab the name and store the sprite under it 
          var name = sprite.name;
          spriteObj[name] = sprite;
     
          // Delete the name from the sprite 
          delete sprite.name;
        });
     
        // Return stringified spriteObj 
        return yaml.safeDump(spriteObj);
      }
    }

输出为:

fork:
  x: 0
  "y": 0
  width: 32
  height: 32
  source_image: /home/todd/github/gulp.spritesmith/docs/images/fork.png
  image: sprite.png
  total_width: 64
  total_height: 64
  escaped_image: sprite.png
  offset_x: -0.0
  offset_y: -0.0
  px:
    x: 0px
    "y": 0px
    offset_x: 0px
    offset_y: 0px
    height: 32px
    width: 32px
    total_height: 64px
    total_width: 64px
github:
# ... 

前端制作动画的几种方式(css3,js,jquery)

前端制作动画的几种方式(css3,js,jquery)

制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式。

1.css的transition。

语法:

#mydiv2
{
    width:100px;
    transition: width 2s;
    /*transition-property  规定设置过渡效果的 CSS 属性的名称
    transition-duration  规定完成过渡效果需要多少秒或毫秒
    transition-timing-function  规定速度效果的速度曲线。 1、ease:(逐渐变慢)默认值,ease函数等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0).
                                                         2、linear:(匀速),linear 函数等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0).
                                                        3、ease-in:(加速),ease-in 函数等同于贝塞尔曲线(0.42, 0, 1.0, 1.0).
                                                        4、ease-out:(减速),ease-out 函数等同于贝塞尔曲线(0, 0, 0.58, 1.0).
                                                        5、ease-in-out:(加速然后减速),ease-in-out 函数等同于贝塞尔曲线(0.42, 0, 0.58, 1.0)
                                                        6、cubic-bezier:(该值允许你去自定义一个时间曲线), 特定的cubic-bezier曲线。 (x1, y1, x2, y2)四个值特定于曲线上点P1和点P2。所有值需在[0, 1]区域内,否则无效。
    */
    -moz-transition: width 2s; /* Firefox 4 */
    -webkit-transition: width 2s; /* Safari 和 Chrome */
    -o-transition: width 2s; /* Opera */
}

transition-property是用来指定当元素其中一个属性改变时执行transition效果,其主要有以下几个值:none(没有属性改变);all(所有属性改变)这个也是其默认值;indent(元素属性名)。当其值为none时,transition马上停止执行,当指定为all时,则元素产生任何属性值变化时都将执行transition效果。

indent是可以指定元素的某一个属性值。其对应的类型如下:

1、color: 通过红、绿、蓝和透明度组件变换(每个数值处理)如:background-color,border-color,color,outline-color等css属性;

2、length: 真实的数字 如:word-spacing,width,vertical-align,top,right,bottom,left,padding,outline-width,margin,min-width,min-height,max-width,max-height,line-height,height,border-width,border-spacing,background-position等属性;

3、percentage:真实的数字 如:word-spacing,width,vertical-align,top,right,bottom,left,min-width,min-height,max-width,max-height,line-height,height,background-position等属性;

4、integer离散步骤(整个数字),在真实的数字空间,以及使用floor()转换为整数时发生 如:outline-offset,z-index等属性;

5、number真实的(浮点型)数值,如:zoom,opacity,font-weight,等属性;

6、transform list:详情请参阅:《CSS3 Transform》

7、rectangle:通过x, y, width 和 height(转为数值)变换,如:crop

8、visibility: 离散步骤,在0到1数字范围之内,0表示“隐藏”,1表示完全“显示”,如:visibility

9、shadow: 作用于color, x, y 和 blur(模糊)属性,如:text-shadow

10、gradient: 通过每次停止时的位置和颜色进行变化。它们必须有相同的类型(放射状的或是线性的)和相同的停止数值以便执行动画,如:background-image

11、paint server (SVG): 只支持下面的情况:从gradient到gradient以及color到color,然后工作与上面类似

12、space-separated list of above:如果列表有相同的项目数值,则列表每一项按照上面的规则进行变化,否则无变化

13、a shorthand property: 如果缩写的所有部分都可以实现动画,则会像所有单个属性变化一样变化

具体什么css属性可以实现transition效果,在W3C官网中列出了所有可以实现transition效果的CSS属性值以及值的类型,大家可以点这里了解详情。这里需要提醒一点是,并不是什么属性改变都会触发transition动作效果,比如页面的自适应宽度,当浏览器改变宽度时,并不会触发transition的效果。但上述表格所示的属性类型改变都会触发一个transition动作效果。

2.css3的animation属性

@keyframes定义动画

@keyframes myfirst1
{
    from {background: red;}
    to {background: yellow;}
}
@-moz-keyframes myfirst2 /* Firefox */
{
    from {background: red;}
    to {background: yellow;}
}
@-webkit-keyframes myfirst3 /* Safari 和 Chrome */
{
    from {background: red;}
    to {background: yellow;}
}
@-o-keyframes myfirst4 /* Opera */
{
    from {background: red;}
    to {background: yellow;}
}
/* 动画过程可以更加细腻,变量可更加丰富 */
@keyframes myfirst5
{
    0%   {background: red; left:0px; top:0px;}  /*改变位置要求position不能为static*/
    25%  {background: yellow; left:200px; top:0px;}
    50%  {background: blue; left:200px; top:200px;}
    75%  {background: green; left:0px; top:200px;}
    100% {background: red; left:0px; top:0px;}
}

将动画绑定到元素上

#mydiv2
{
    animation-name: myfirst5;  /*规定 @keyframes 动画的名称。*/
    animation-duration: 5s;  /*规定动画完成一个周期所花费的秒或毫秒。默认是 0。*/
    animation-timing-function: linear;  /*	规定动画的速度曲线。默认是 "ease"。*/
    animation-delay: 2s;   /*规定动画何时开始。默认是 0。*/
    animation-iteration-count: infinite;   /*规定动画被      的次数。默认是 1。*/
    animation-direction: alternate;  /*规定动画是否在下一周期逆向地      。默认是 "normal"。*/
    animation-play-state: running;  /*规定动画是否正在运行或暂停。默认是 "running"。*/
    /* Firefox:
    -moz-animation-name: myfirst;
    -moz-animation-duration: 5s;
    -moz-animation-timing-function: linear;
    -moz-animation-delay: 2s;
    -moz-animation-iteration-count: infinite;
    -moz-animation-direction: alternate;
    -moz-animation-play-state: running;
    */
    /* Safari 和 Chrome:
    -webkit-animation-name: myfirst;
    -webkit-animation-duration: 5s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-delay: 2s;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-direction: alternate;
    -webkit-animation-play-state: running;
    */
    /* Opera:
    -o-animation-name: myfirst;
    -o-animation-duration: 5s;
    -o-animation-timing-function: linear;
    -o-animation-delay: 2s;
    -o-animation-iteration-count: infinite;
    -o-animation-direction: alternate;
    -o-animation-play-state: running;
    */
}

动画属性简写

#div5
{
    animation: myfirst 5s linear 2s infinite alternate;
    /* Firefox: */
    -moz-animation: myfirst 5s linear 2s infinite alternate;
    /* Safari 和 Chrome: */
    -webkit-animation: myfirst 5s linear 2s infinite alternate;
    /* Opera: */
    -o-animation: myfirst 5s linear 2s infinite alternate;
}

3.Jquery的animate函数

隐藏显示 hide/show(speed,callback),


 $cr.hide();                                 //元素隐藏,会记住diaplay原始属性
 $cr.css("display","none");                  //元素隐藏,忘记diaplay原始属性
 $cr.show();                                  //元素显示,回复diaplay原始属性
 $cr.hide('slow');                           //缩小到左上角,传递字符串型参数  'slow'600ms,'fast'200ms,'normal'400ms。没有参数表示立即实现
 $cr.show(1000,function(){                   //从左上角开始放大,传递整型参数,和回调函数
 alert("显示结束");
 });
 $cr.toggle();                               //改变元素可见性动画

淡入淡出 fadeIn/fadeOut(speed,easing,callback),

 $cr.fadeOut('slow',"swing");              //元素淡出    "swing" - 在开头/结尾移动慢,在中间移动快,"linear" - 匀速移动
 $cr.fadeIn();                               //元素淡入,在元素消失下情况下有效
 $cr.fadeTo(600,0.2);                         //改变元素不透明度动画,参数为时间和透蜜蒙都
 $cr.fadeToggle();                           //改变元素不透明度,实现元素可见性动画

滑动 slideUp/slideDown(speed,callback)会改变元素的display属性

 $cr.slideUp();                              //缩小到所上角
 $cr.slideDown();                            //由左上角扩大
 $cr.slideToggle();                          //改变元素消失或出现

自定义动画 animate({params},speed,callback);

if(!$cr.is(":animated")){                   //判断元素是否处于动画状态
    $cr.animate({                             //一个animate内的动画为并行
            left:'250px',                    //position属性必须设置成relative或absolute
            height:'+=150px',               //可以使用相对值+=或-=
            width:'toggle'                  //可以把属性的动画值设置为 "show"、"hide" 或 "toggle"。opacity:'show'表示fadeIn,  height:'show'表示slideDown,在属性上设置show表示出现
        },'slow',function(){
            alert("动画执行完成");
        })
        .delay(1000)                          //延迟时间,使用链式写法
        .animate({fontSize:'3em'},"slow");  //多个animate之间是顺序执行的
}else{
    //停止动画  stop(stopAll,goToEnd);  stopAll表示是否清除后续所有动画,默认false,goToEnd表示当前动画是否立即执行完成,默认为false。
    $cr.stop();                               // 不带参数,会清除在被选元素上指定的当前动画
}

但是,animate函数只能够实现一些数值属性,能够实现的变化非常有限制,而且使用这个函数时还要配合stop来使用,在达到某条件时终止动画,设置比较复杂。

4.原生js动画

原生js动画利用js代码,将动画一步以函数的方式写出来,可以实现多种动画样式,而且可以自己做兼容性处理,自己设立每一步的动画效果,并且能够完成比较复杂的效果,但是代码量很大。如下面的例子:需要自己定义所有的动态函数,并进行计算、判断和处理

 var startingTop=0;
 var dom = document.getElementById("mydiv");
 var animation = setInterval(function() {      //设置周期实现元素样式变化,进而实现动画
	 startingTop += 20;
	 dom.style.top = startingTop+"px";        //要求position不能为static,可以在style中设置position:absolute; //dom.style.opacity
 }, 100);
 
 clearInterval(animation);                    //清除周期事件
//js设置显示属性的几种方法
 //dom.style.cssText = "margin-top:50px"
 //dom.className = "class2";
 //dom.setAttribute("class", "class2");
 //dom.setAttribute("title","mytitle");

5.插件

网上可以搜到很多封装好的动画插件,这些插件可以直接引入到页面中,通过初试话和配置的方式进行设定,直接在页面中展示动画。

如:waves,textillate.js等等。

6.使用canvas制作动画

我们还可以使用canvas在浏览器上画图,并且利用其api,制作动画。canvas使用的地方非常多,尤其是在制作h5小游戏上。

同样都是使用编码的方式由前端开发工程师完成动画效果,canvas要比原生js效率高的多,流畅的多。通过画笔的方式,能够轻松的实现更多的动画效果。

7.引用gif图片

如果在需求特别紧急,而且动画又特别复杂的情况下,自己没有把握按时实现效果,或者代价太大,真的,别犹豫,上gif图片吧,不要在技术上纠结了,虽然在工程师的角度上这样做很low,但是,用户的体验是没有影响的~所以,别纠结,就是要快!完成最重要了!

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/633.html

发表评论

评论列表

还没有评论,快来说点什么吧~

友情链接: