标签 前端 下的文章

Image()函数将会创建一个新的HTMLImageElement实例。它的功能等价于 document.createElement('img')

正常情况下,我们使用下面方法加载图片,是能能够获取到onload事件的:

const img = new Image();
img.src = 'picture.jpg';
img.onload = () => {
  console.log('success');
}

但是如果你需要加载的图片是base64图片时,可能是因为没有请求发出,onload事件是无法执行的。

几经尝试,最终考虑将base64图片转位ObjectUrl再加载,好处是无需后端,纯前端即可兼容。移动端兼容性也非常不错。

具体实现如下:

// base64转Blob
const base64ToBlob = (base64Data) => {
  const arr = base64Data.split(','),
    type = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    len = bstr.length,
    u8Arr = new Uint8Array(l);

  while (len--) u8Arr[l] = bstr.charCodeAt(len);

  return new Blob([u8Arr], { type });
}

const base64 = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
const imgBlob = base64ToBlob(base64)

const img = new Image();
img.src = window.URL.createObjectURL(imgBlob); // blob:http://xxx
img.onload = function () {
  console.log('success')
}

URL.createObjectURL 可能有一些兼容性问题,如果你在使用过程遇到,可以hack兼容一下

function getObjectURL(blob) {
  var url = null;
  if (window.createObjectURL != undefined) {
    url = window.createObjectURL(blob);
  } else if (window.URL != undefined) {
    url = window.URL.createObjectURL(blob);
  } else if (window.webkitURL != undefined) {
    url = window.webkitURL.createObjectURL(blob);
  }
  return url;
}

本文参考资料:

Image() - Web API 接口参考 | MDN (mozilla.org)
使用img.onload事件加载base64图片的兼容问题 - 简书 (jianshu.com)
vue 上传图片,转base64取不到.onload的值 - 小蘑菇123 - 博客园 (cnblogs.com)

不晓得哪个版本开始,WordPress在添加媒体入口里加入了“创建相册”功能,就是可以把你已上传的图片选择N个创建成相册,并且可以把相册插入到文章当中,对于某些多图的文章,使用这个功能让文章显得漂亮工整。

但是某些自己制作的主题并无法愉快的使用它,首先,插入的使用缩略图基本上要正方形的,如果之前上传的图片没有裁剪成正方形,那就有点难办了;其次,大大小小的图片有正方形有长方形的,另文章显得极其不规整,怎样让图片简单轻松无痛又漂亮的显示在文章页呢?

先看最终效果

每行2个:

[gallery columns="2" link="file" size="large" ids="3867,3540"]

每行3个:

[gallery link="file" size="large" ids="3882,3880,4079"]

每行4个:

[gallery columns="4" link="file" size="large" ids="3864,3863,3869,3859"]

每行5个:

[gallery columns="5" size="medium" link="file" ids="3884,3881,3878,3870,3874"]

还有更多就不演示了,回头自己试一下即可。

原理解释:

基本原理图如上,红色为图片原始比例,黄色为图片显示区域,超出部分隐藏,看似很简单,是实际上会稍微繁琐一些,因为图片始终无法合理的居中显示在黄色区域,好在CSS3给力

利用CSS3的translate(),WP的插入相册的DOM结构刚好够用,直接贴CSS吧

.gallery{
 margin:-1%!important;
}
.gallery .gallery-item {
 padding:1%;
 /* width:14.66666%!important; */
 margin: 0 !important;
 overflow:hidden;
 position:relative;
}
.gallery-columns-3 .gallery-item{
 width:33.3333333%!important;
}
.gallery .gallery-item dt:before {
 content: "";
 display: block;
 padding-top: 100%;
}
.gallery .gallery-item dt {
 position: relative;
 box-shadow:0 0 0 1px rgba(0,0,0,.1) inset;
 background: #eee;
 cursor: pointer;
 overflow: hidden;
}
.gallery .gallery-item a {
 position: absolute;
 top: 0;
 right: 0;
 bottom: 0;
 left: 0;
 opacity: 1;
 -webkit-transition: opacity .1s;
 transition: opacity .1s;
 transform: translate(50%,50%);
}
.gallery .gallery-item img{
 position:absolute;
 top: 0;
 left: 0;
 max-height:100%;
 max-width:none!important;
 width:auto!important;
 border:0!important;
 transform: translate(-50%,-50%);
}

核心CSS如上,根据主题不同请自行调整。

兼容性

此方法兼容IE8及以上,IE8不支持居中单不会拉伸图片(效果依然不错)

PS: 2016年12月16日 补充

感谢 秋空 提供的CSS3新属性:object-fit

新属性更加简单粗暴,仅居中代码从12行左右缩短到了3行(完美)

新属性代码如下:

.gallery{
 margin:-1%!important;
}
.gallery .gallery-item {
 padding:1%;
 /* width:14.66666%!important; */
 margin: 0 !important;
 overflow:hidden;
 position:relative;
}
.gallery-columns-3 .gallery-item{
 width:33.3333333%!important;
}
.gallery .gallery-item dt:before {
 content: "";
 display: block;
 padding-top: 100%;
}
.gallery .gallery-item dt {
 position: relative;
 box-shadow:0 0 0 1px rgba(0,0,0,.1) inset;
 background: #eee;
 cursor: pointer;
 overflow: hidden;
}
.gallery .gallery-item img{
 position:absolute;
 top: 0;
 left: 0;
 height:100%;
 width:100%;
 object-fit:cover;
 border:0!important;
}

新属性兼容性

PC:兼容绝大部分现代主流浏览器(webkit内核、firefox),不支持IE

Mobile:Safari、Android4.4.4+(国内ROM上Android5.x兼容不同)

什么是Zepto

Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jQuery有着类似的Api。

如果你会用jQuery,那么你一定也会用Zepto。

为什么要用Zepto

使用jQuery最简单的原因大概就是它拥有强大的选择器、出色的DOM操作封装、兼容性,或许你还有其它的原因,但是使用原因最多的无非就上面三种吧,可是jQuery封装的功能实在太多了,导致即使min也拥有不可忽视的体积,而平时最常用到反反复复就那几个,确实可以考虑换一个迁移成本低(最好是不用改货尽可能少改现有代码那就再好不过了)的库了。

Zepto恰好满足这一点,默认支持绝大部分jQuery的Api,含Ajax,也就是说,如果你从jQuery迁移到Zepto,你的代码依然可用,而Zepto的大小也足够令人心动,min版25k,如果gzip压缩后后仅不到10k。

Zepto有哪些拓展

Zepto默认集成了zepto、event、ajax、form、ie五个模块,几乎可以满足常见的应用场景,同时还提供了其它的拓展以满足不同的需求,比如touch对触摸事件的支持,比如tap事件、data提供对.data()方法的完整支持,像jQuery一样用内存对象存储等等,更多的拓展可以去官网或者GitHub上翻阅。

使用中可能会遇到哪些问题

1、兼容性,谈到这,很严肃的告诉你,Zepto仅支持现代浏览器,向下支持IE10,如果想要兼容低版本IE,可以考虑下面为低版本IE引用jQuery,代码如下:

<!--[if lt IE 10]>
    <script src="//cdn.bootcss.com/html5shiv/r29/html5.min.js"></script>
    <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <script src="//cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script>
<![endif]-->

2、没有像jQuery那样丰富的动画效果,fade类函数替换成简单的show()基本可以解决,或者去官网添加fx_methods拓展,怎么用请自行研究吧。

3、CSS选择器的支持没有jQuery多,:text :checkbox :first类似的选择器基本可以说拜拜了,不过也有限的支持几个,用到的时候自行搜索。

4、除了体积小,并没有比jQuery好哪里去,如果用了一段时间觉得不好,随时退回jQuery吧

可供参考的链接

http://www.css88.com/doc/zeptojs_api/

http://chaoskeh.com/blog/some-experience-of-using-zepto.html

http://www.imooc.com/note/229?sort=last

Retina屏缘起

自2010年Apple发布iPhone4以后,Retina屏逐渐流行起来,其惊艳的显示效果和其细节的全面展示带给了人们全新的视觉体验,而越来越多的终端开始支持响应式,那么作为响应式中的重要一环「响应式图片」又该如何解决?

Retina屏俗称「视网膜屏」,其的设备像素比是x2,而普通屏幕像素比为x1,对于图片这种位图像素已定的资源,如果不加以处理的话,要么全都用x1倍图,那么在视网膜屏上观看就会模糊;要么都是用x2倍图,那么在普通屏幕上浏览的时候就会白白浪费流量消耗下载速度。

在开发iDevise主题的时候,我就是使用x2倍图来完成图片响应,因为图片裁剪后占用硬盘并不大,所以流量消耗几乎可以忽略,且代码量也少一些,但是在新主题iDevs中,图片开始变大,继续采用全x2倍图显然不是最佳方案了,那么该如何完成图片响应呢?

srcset属性

相对简单的解决方案就是srcset属性了,使用简单,可以非常方便的完成图片响应效果。

代码实例:

<img src="images-x1.png" 
     srcset="images-x2.png 2x"
     alt="iDevs" />

浏览器会默认访问src里面的图片路径,如果视网膜屏幕的话,浏览器会解析srcset里面的图片路径。

srcset配合sizes属性

sizes属性产生的初衷就是可以在html中实现简单的媒体查询功能,来适应越来越大规模的响应式网站开发。

那么w是个啥? w是一个衡量宽度的标识符,一定要对应图片的真实宽度,这会使得浏览器正确的选择图片,如果w值和图片宽度不对应时,实际渲染是会有问题的。

示例代码:

<img src="images-x1.jpg"   
     srcset="images-x1.jpg 500w, images-x2.jpg 1000w, images-x3.jpg 1500w" 
     sizes="500px">

sizes=500px,也就是图片宽度设置为了500px,那么:

x1倍屏幕访问时就会选用images-x1.jpg;

x2倍屏幕可渲染的位图像素宽度就变为了1000px,也就选用了images-x2.jpg;

类推一下,x3倍屏幕当然就会访问images-x3.jpg了。

现代浏览器对该属性的支持是越来越多了,这个方案应该会是个潮流。

那么兼容性如何呢?

电脑设备

enter image description here

手持设备

enter image description here

在移动端Andriod浏览器的支持实在是太差劲了,PC端对于一些现代的浏览器支持性就非常好。

当然,还有其他的一些解决方案,后期有时间再与大家探讨与分享。

本文参考: https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img http://www.zhangxinxu.com/wordpress/2014/10/responsive-images-srcset-size-w-descriptor/ http://www.jianshu.com/p/235ef450f5e9 http://liyaodong.com/2015/10/18/responsive-image-workflow/