>

它不仅将图像变成灰色也可以变成褐色和模糊效

- 编辑:澳门博发娱乐官网 -

它不仅将图像变成灰色也可以变成褐色和模糊效

CSS或JS实现gif动态图片的停止与播放

2015/12/06 · CSS, JavaScript · gif

原文出处: 张鑫旭   

一、屋外:寒风吹,雪花飘;屋内:空调吹,代码飘

上午出去买菜,正好下雨了,还夹杂着冰珠子。鄙人大意,穿的是一件帅气但单薄的黄色大衣,立马冻成了中华田园犬。原本计划去钓鱼的,科科,作罢,上午在家看CCTV5 骑士队vs鹈鹕队,下午补动漫码代码做文章,好生惬意。

澳门博发娱乐官网 1

对于习惯性刷微博的我,总时不时会看到类似下面的游戏:

测测你和小白(白百何)有哪些共同点,戳开动图,最先看清的词是什么?ie浏览器的同学可以按esc键(或截屏),据说在哪个词暂停,哪个词就是你哦!澳门博发娱乐官网 2

澳门博发娱乐官网 3

OK, 这里出现一个浏览器特性,就是通过ESC快捷键,暂停gif的播放。据说FireFox浏览器以前也有,后来被干掉了,根据@紫云妃的说法是:

是这样的,Firefox原来的表现是:在页面load事件完成,同时x按钮变成刷新按钮之后,esc仍然有几个作用,中断当前正在发送的ajax,websocket,停止gif,apng动画的播放.但这些功能太小众了,影响了普通用户的使用,可能不小心按了esc,结果ajax断了,网页出错了.所以Firefox20修改成:网页加载完成后,esc键完全失效.

然而,这种隐晦的但似乎会影响正常功能的小技巧显然是无法实现真正意义上的gif动态图片的停止与播放的。一是兼容性,二是功能性,三是移动端没有ESC键。

所以,如果我们遇到需要可以随时随地停止gif动态图片播放的需求的时候,就需要寻找其他的出路。好,寒冬里的暖身结束,开始进入正题~~

  一、Canvas图片水平镜像翻转效果预览

 曾几何时,网站上显示的灰度图像必须手动进行转换。现在使用HTML5画布,图像可以被巧妙的转换为灰色,而不必使用图像编辑软件。我下面有一个示例,展示如何使用HTML5和jQuery动态的将彩色图像转换为灰色。贡献者:感谢达西·克拉克(我在Themify的合伙人)贡献jQuery和Javascript代码。

让网页图片变灰色的三种方法,

我一直喜欢灰度图像因为我认为他们看起来更有艺术感。很多图片编辑如Photoshop很容易把你的彩色图像变成灰度。甚至有选择调整颜色深度和色调。不幸的是,这样的效果想做在网络上并不容易,因为浏览器有差异。

澳门博发娱乐官网 4

 

1、CSS Filter

  使用CSS过滤器属性可能是最简单的方法把图像变成灰度。以往,IE浏览器有一个专有的CSS属性称为过滤应用自定义效果包括灰度。

  现在,过滤器属性是CSS3规范的一部分,并支持在一些浏览器,Firefox、Chrome和Safari。以前,我们也提到Webkit过滤器,它不仅将图像变成灰色也可以变成褐色和模糊效果。

  添加如下CSS样式可以将图像变成灰色

img { 
-webkit-filter: grayscale(1);/* Webkit */ 
filter:gray;/* IE6-9 */ 
filter: grayscale(1);/* W3C */ 
}
  支持IE6-9和Webkit浏览器(Chrome 18+, Safari 6.0+, and Opera 15+)

  (注意:这段代码在Firefox上无效果。)

  2、Javascript

  第二种方法是通过使用JavaScript技术上应该支持所有JavaScript的浏览器,包括IE6以下

  代码来自Ajax Blender.

varimgObj = document.getElementById('js-image'); 
functiongray(imgObj) { 
varcanvas = document.createElement('canvas'); 
varcanvasContext = canvas.getContext('2d'); 

varimgW = imgObj.width; 
varimgH = imgObj.height; 
canvas.width = imgW; 
canvas.height = imgH; 

canvasContext.drawImage(imgObj, 0, 0); 
varimgPixels = canvasContext.getImageData(0, 0, imgW, imgH); 

for(vary = 0; y < imgPixels.height; y++){ 
for(varx = 0; x < imgPixels.width; x++){ 
vari = (y * 4) * imgPixels.width + x * 4; 
varavg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3; 
imgPixels.data[i] = avg; 
imgPixels.data[i + 1] = avg; 
imgPixels.data[i + 2] = avg; 


canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height); 
returncanvas.toDataURL(); 

imgObj.src = gray(imgObj);
  3、SVG

  第三种方法来自SVG Filter.,你需要创建一个SVG文件,并将以下代码写在里面,保存命名为***.svg

<svgxmlns=" ; 
<filterid="grayscale"> 
<feColorMatrixtype="matrix"values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"/> 
</filter> 
</svg>
  然后利用过滤器的属性,我们可以通过SVG文件中的元素的ID连接SVG文件

img { 
filter:url('img/gray.svg#grayscale'); 
}
  你也可以把它放到CSS文件中,例如:

img { 
filter:url('url("data:image/svg+xml;utf8,<svg%20xmlns=' ");') 
}
  总结

  为了能过跨浏览器支持灰度的效果,我们可以把上述方法和一起使用下面的代码片段去实现。这段代码将支持Firefox 3.5+, Opera 15+, Safari, Chrome, and IE

img { 
-webkit-filter: grayscale(100%); 
-webkit-filter: grayscale(1); 
filter: grayscale(100%); 

filter:url('../img/gray.svg#grayscale'); 
filter:gray; 
}
  我们可以利用上面的代码和JavaScript方法和只提供CSS滤波器作为后备以防JavaScript被禁用。这个想法可以很容易地Modernizr的帮助下实现的。

.no-js img { 
-webkit-filter: grayscale(100%); 
-webkit-filter: grayscale(1); 
filter: grayscale(100%); 

filter:url('../img/gray.svg#grayscale'); 
filter:gray; 
}
  OK了,你的浏览器上可以看到很炫的效果了!!

我一直喜欢灰度图像因为我认为他们看起来更有艺术感。很多图片编辑如Photoshop很容易把你的彩色图像变成...

二、gif图片自己可控前提下的方法一:多img资源控制处理

假如说,我们希望暂停的gif是自己(开发人员)传上去的,不是用户可以随机上传不可控的gif. 我们可以这么处理,就是准备2套图片,一个是gif动态图片,还有一个是只有一帧的静止的图片。然后使用JS来回切换`的src`值为这两张图片地址就好了。

此方法甚简单,我就不放实例了。

img.src="animate.gif"; // 或者呈现的是 img.src="static.png";

1
2
3
img.src="animate.gif";
// 或者呈现的是
img.src="static.png";

这个方法最大的优点就是兼容性强,所有浏览器都可以实现停止效果。然而,这种方法有个局限,就是,暂停时候呈现的图片永远是同一张。基本上可以说是停止,而不是暂停。

那有没有什么方法可以真正意义上的暂停呢?还真有!

  您可以狠狠的点击这里:canvas图片水平镜像翻转动画demo

法一:
img 标签是没有 onload 事件的.所以 UBB 代码中的img用到的onload来处理大的图片进行自适应,这样的办法就不能采取了.
但是经过测试,body还是可以带onload事件的, 所以我解决的办法就是在页面全部加载完后再处理太大的图片.
于是用JS写了一段简单的代码

 

三、gif图片自己可控前提下的方法二:CSS3 animation控制

也就是我们看到的gif效果并不是一个真正的gif图片,而是使用CSS3的animation属性控制形成的逐帧动态图片效果。我搜了下,@DO1路人乙有篇文章“css3-animation制作逐帧动画”专门介绍了这种技术。说穿了就是animation控制Sprites图片的background-position值模拟gif效果。

例如,新版twitter的Like的效果,貌似就有使用该技术:
澳门博发娱乐官网 5

使用CSS3 animation实现类gif效果的好处在于,图片可以无损,且我们可以很轻松地控制图片动画的暂停和播放,使用的是:animation-play-state: paused;这个声明。

您可以狠狠地点击这里:使用CSS3 animation实现gif动图的暂停和播放demo

点击demo页面的暂停按钮,您会发现,直接就停住了,如下截图示意,截自IE10浏览器:
澳门博发娱乐官网 6

再次点击,就会在暂停画面之后继续播放了。从而实现了我们对动画图片的精确控制效果。

此方法看上去完美,但是,1. IE10+等支持CSS3 animation的浏览器才行;2. 最大的问题是图片需要是自己控制,如果想控制用户上传的真正意义的gif图片,只能……望洋兴叹……………………吗?

  demo页面中点击图片动画效果可见。

相关代码
function ReImgSize(){
for (j=0;j<document.images.length;j++)
{
document.images[j].width=(document.images[j].width>420)?"420":document.images[j].width;
}
}

示例:HTML5灰度渐变 

四、自己无法控制的gif图片的停止与播放

比方说,页面上用户上传了些gif图片,哎呀,闪瞎了我的中华田园眼,我要全部暂停,肿么办?如果后台同学没有对gif进行静态处理,此时,只能靠前端小伙伴,有什么办法吗?

有一个。HTML5 canvas可以读取图片信息,绘制当前图片。于是可以实现图片马赛克,模糊,色值过滤等很多图片特效。我们这里不用那么复杂,只要读取我们的图片,重绘下就可以。

您可以狠狠地点击这里:使用JS和canvas实现gif动图的停止和播放demo

点击按钮,然后:
澳门博发娱乐官网 7

澳门博发娱乐官网 8

如何使用?
我对HTMLImageElement原型进行了扩展,增加了stop()play()两个方法,如下:

if ('getContext' in document.createElement('canvas')) { HTMLImageElement.prototype.play = function() { if (this.storeCanvas) { // 移除存储的canvas this.storeCanvas.parentElement.removeChild(this.storeCanvas); this.storeCanvas = null; // 透明度还原 image.style.opacity = ''; } if (this.storeUrl) { this.src = this.storeUrl; } }; HTMLImageElement.prototype.stop = function() { var canvas = document.createElement('canvas'); // 尺寸 var width = this.width, height = this.height; if (width & height) { // 存储之前的地址 if (!this.storeUrl) { this.storeUrl = this.src; } // canvas大小 canvas.width = width; canvas.height = height; // 绘制图片帧(第一帧) canvas.getContext('2d').drawImage(this, 0, 0, width, height); // 重置当前图片 try { this.src = canvas.toDataURL("image/gif"); } catch(e) { // 跨域 this.removeAttribute('src'); // 载入canvas元素 canvas.style.position = 'absolute'; // 前面插入图片 this.parentElement.insertBefore(canvas, this); // 隐藏原图 this.style.opacity = '0'; // 存储canvas this.storeCanvas = canvas; } } }; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
if ('getContext' in document.createElement('canvas')) {
    HTMLImageElement.prototype.play = function() {
        if (this.storeCanvas) {
            // 移除存储的canvas
            this.storeCanvas.parentElement.removeChild(this.storeCanvas);
            this.storeCanvas = null;
            // 透明度还原
            image.style.opacity = '';
        }
        if (this.storeUrl) {
            this.src = this.storeUrl;    
        }
    };
    HTMLImageElement.prototype.stop = function() {
        var canvas = document.createElement('canvas');
        // 尺寸
        var width = this.width, height = this.height;
        if (width & height) {
            // 存储之前的地址
            if (!this.storeUrl) {
                this.storeUrl = this.src;
            }
            // canvas大小
            canvas.width = width;
            canvas.height = height;
            // 绘制图片帧(第一帧)
            canvas.getContext('2d').drawImage(this, 0, 0, width, height);
            // 重置当前图片
            try {
                this.src = canvas.toDataURL("image/gif");
            } catch(e) {
                // 跨域
                this.removeAttribute('src');
                // 载入canvas元素
                canvas.style.position = 'absolute';
                // 前面插入图片
                this.parentElement.insertBefore(canvas, this);
                // 隐藏原图
                this.style.opacity = '0';
                // 存储canvas
                this.storeCanvas = canvas;
            }
        }
    };
}

大家只要在页面中自己的JS文件中复制上面的代码,然后就可以直接:

var image = document.getElementsByTagName("img")[0]; // 停止gif图片 image.stop(); // 播放gif图片 image.play();

1
2
3
4
5
var image = document.getElementsByTagName("img")[0];
// 停止gif图片
image.stop();
// 播放gif图片
image.play();

//zxx: 上面代码并未详尽测试,以及可能的体验问题(IE闪动)没有具体处理(影响原理示意),若要实际使用,需要自己再微调完美下。

不足

  1. IE9+支持。IE7/IE8不支持canvas没搞头。
    2. 只能停止gif,不能真正意义的暂停。因为canvas获得的gif图片信息为第一帧的信息,后面的貌似获取不到。要想实现暂停,而不是停止,还需要进一步研究,如果你有方法,非常欢迎分享。

  二、Canvas上实现图片镜像翻转的实现

然后 在 body 上加上 onload="ReImgSize()" 就可以了.
经过测试,在Mozilla和IE上通过.
在这里补充一下关于 图片的自适应,这点Mozilla做的比IE好,因为可以用CSS来控制图片的自适应.
我们都知道 Mozilla 支持一个 max-width 的CSS语法.于是,我们这样这样定义图片的全局样式

 

五、结束语

是胡不是霍,是霍躲不过!哈哈!
澳门博发娱乐官网 9
上面这个gif也是demo示意gif强力候选。后来一琢磨,看我文章的还是宅男多,腐女少,所以,你懂的……
澳门博发娱乐官网 10

——我是多年不见的低调的分隔线—–

本文gif比较多,如果您是移动设备查看本文,会发现,怎么我的电池怎么越来越瘦了!不是因为天冷冻小了,而是gif比较耗电。所以,从这个角度讲,我们其实有必要在移动端默认停止这些gif的播放,用户点击再播放。一来省流量,二来省电。

如果没有静态图片资源支持,那不妨试试文章出现的一些方法,有心得记得来这里反馈哈! 澳门博发娱乐官网 11

最后,本文的方法都是有瑕疵的,自己也尚未在实际项目中使用过。因此,假如阅读本文的您:

  1. 有更完美的gif暂停与播放方法;
  2. 发现文中方法有不足和遗漏;

都非常希望可以不吝赐教!

感谢阅读!周末温暖!

 

1 赞 6 收藏 评论

澳门博发娱乐官网 12

  CSS中要想实现元素的翻转效果,比较简单,例如我们希望某一张图片水平镜像翻转,只需要一行CSS就可以了:

相关代码 
img{
max-width:100%;height:auto;
}

目的

  img{

这样图片就回在div或table内自动适应其大小了.

    这个示例的目的是向你展示如何使用HTML5和jQuery创建一个灰度/彩色图像的鼠标悬浮效果。在HTML5出现前,实现这个效果需要两幅图像,彩色的和灰度的版本。现在HTML5让创建这个效果更加容易和高效,因为灰色图像将会直接从原始文件生成。我希望你会发现这个脚本在例如陈列橱或者相片册的设计里相当有用。

  transform:scaleX(-1);

这也是一种很简单有效的方法:利用CSS+JS让图片自动缩放-图片不变形

  澳门博发娱乐官网 13

  }

.thumbImage {max-width: 100px;max-height: 100px;} /* for Firefox & IE7 */

 
澳门博发娱乐官网 14 澳门博发娱乐官网 15   

  或者:

* html .thumbImage { /* for IE6 */
width: expression(this.width > 100 && this.width > this.height ? 100 : auto);
height: expression(this.height > 100 ? 100 : auto);

 

  img{

法二:

jQuery代码

  transform:scale(-1,1);

以前是判断heigth和width,然后再决定谁除谁再乘谁。怎么没有想到可以这样:?heigth和width只保留一个属性即可。

    下面的jQuery代码会找寻目标图像并生成一个灰度的版本。当鼠标悬浮在图像上,代码将会把灰度图像渐变为彩色的。

本文由胜博发-前端发布,转载请注明来源:它不仅将图像变成灰色也可以变成褐色和模糊效