整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端技巧:使用Promise精确获取网络图片尺寸

现代前端开发中,动态加载图片尺寸及其宽高比是一项基本而重要的技能。它不仅有助于提升页面的响应速度和用户体验,还能在进行布局设计时提供更大的灵活性。本文将介绍如何使用JavaScript实现一个高效的方法loadImageSize,以异步方式准确获取网络图片的宽度、高度和宽高比。

基本概念

Promise是JavaScript中用于处理异步操作的重要概念。它代表一个尚未完成但预期将会完成的操作。通过Promise,我们可以组织代码以更直观地处理异步事件,如图片加载。图片的宽度、高度和纵横比(宽度除以高度的比值)是基本的图形属性,对于许多应用场景如布局和响应式设计至关重要。

实现loadImageSize方法

我们提供的loadImageSize方法使用Promise来加载图片并获取其尺寸和纵横比。该方法接收一个图片URL作为参数,并返回一个对象,其中包含图片的宽度、高度和纵横比。

const loadImageSize = (url: string) => {
  return new Promise<{ width: number, height: number, aspectRatio: number }>((resolve, reject) => {
    const img = new Image();
    img.onload = () => {
      const aspectRatio = img.width / img.height;
      resolve({ width: img.width, height: img.height, aspectRatio });
    };
    img.onerror = reject;
    img.src = url;
  });
}

步骤分解

  1. 创建Image对象:这是Web API的一部分,允许我们创建一个图片实例。
  2. 使用onload事件监听器:当图片加载完成时,触发onload事件,并执行回调函数。在回调中,我们可以安全地访问图片的宽度和高度属性。
  3. 计算纵横比:通过宽度除以高度得到。
  4. 使用onerror处理加载错误:如果图片无法加载,onerror事件被触发,Promise被拒绝。
  5. 设置图片的src属性:这一步开始图片的加载过程。

使用示例

下面是如何使用loadImageSize方法的示例:

loadImageSize('https://example.com/image.jpg')
  .then(({ width, height, aspectRatio }) => {
    console.log(`Width: ${width}, Height: ${height}, Aspect Ratio: ${aspectRatio}`);
  })
  .catch(error => {
    console.error('Failed to load image:', error);
  });

这段代码展示了如何处理异步返回的图片尺寸信息及错误处理。

性能优化建议

虽然异步加载图片提供了许多优势,但我们仍然需要考虑如何优化性能。预加载关键图片或使用图片懒加载技术可以进一步提升页面的加载速度和用户体验。

常见问题及解决方案

在使用loadImageSize方法时,可能会遇到跨域图片的问题。为了解决这个问题,我们可以设置Image对象的crossOrigin属性。此外,要避免内存泄露,确保不再需要的Image对象能够被垃圾回收。

总结

通过本文的介绍,我们学会了如何使用JavaScript以及Promise异步处理机制,有效地加载并获取网络图片的尺寸和宽高比。这不仅能优化页面加载性能,还能提升用户体验。希望读者能够通过实践掌握这一技能,并在日常开发中加以应用。

如果喜欢,可以点赞收藏,关注哟~

用方案

1、设置根 font-size:625%(或其它自定的值,但换算规则 1rem 不能小于 12px)

2、通过媒体查询分别设置每个屏幕的根 font-size

3、CSS 直接除以 2 再除以 100 即可换算为 rem

优:有一定适用性,换算也较为简单。

劣:有兼容性的坑,对不同手机适配不是非常精准;需要设置多个媒体查询来适应不同手机,单某款手机尺寸不在设置范围之内,会导致无法适配。

网易方案

1、拿到设计稿除以 100,得到宽度 rem 值

2、通过给 html 的 style 设置 font-size,把 1 里面得到的宽度 rem 值代入x document.documentElement.style.fontSize =document.documentElement.clientWidth / x + ‘px‘;

3、设计稿 px/100 即可换算为 rem

优:通过动态根 font-size 来做适配,基本无兼容性问题,适配较为精准,换算简便。

劣:无 viewport 缩放,且针对 iPhone 的 Retina 屏没有做适配,导致对一些手机的适配不是很到位。

手淘方案

1、拿到设计稿除以 10,得到 font-size 基准值

2、引入 flexible

3、不要设置 meta 的 viewport 缩放值

4、设计稿 px/ font-size 基准值,即可换算为 rem

优:通过动态根 font-size、viewpor、dpr 来做适配,无兼容性问题,适配精准。

劣:需要根据设计稿进行基准值换算,在不使用 sublime text 编辑器插件开发时,单位计算复杂。

、PX\EM\PT单位介绍

px单位名称为像素,相对长度单位,像素(px)是相对于显示器屏幕分辨率而言的国内推荐;

em单位名称为相对长度单位。相对于当前对象内文本的字体尺寸,国外使用较多;


pt单位名称为点(Point),绝对长度单位一般老版本的table使用长度大小单位但是现在基本上没有使用。

html单位简短介绍:

Px 像素Pixel;相对长度单位。

Pt 点(Point);绝对长度单位

Em 相对长度单位,这里emhtml标签"EM"拼写完全相同,而这里em作为单独文本单位。

1. 以前IE无法调整那些使用px作为单位的字体大小,但现在几乎IE都支持 在这里也推荐使用PX作为单位;

2. 国外的大部分网站能够调整的原因在于其使用了em作为字体单位;

3. Firefox能够调整px和em,但是96%以上的中国网民使用IE浏览器(或内核)。

px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的,QQ截图也是使用PX作为长度宽度单位。

em是相对长度单位。相对于当前对象内文本字体寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

二、html单位对比案例

1、简单小例:

Width:300px 宽度为300像素

Width:300pt 宽度为300点

Width:300em 宽度为300相对长度

以上我们设置相同数值的不同单位实例

2、对文字设置不同长度em px pt单位看看效果:

CSS代码:

  1. .divcss5-px{ font-size:12px}
  2. .divcss5-pt{ font-size:12pt}
  3. .divcss5-em{ font-size:2em}

HTML代码:

  1. < span>divclass="divcss5-px"<我是divcss5</>div<
  2. < span>divclass="divcss5-pt"<我是divcss5</>div<
  3. < span>divclass="divcss5-em"<我是divcss5</>div<

3、单位长度对比说明图


html px pt em单位案例对比图

三、em与px换算

任意浏览器的默认字体高度16px(16像素)。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。

12px相当于9pt长度;

12px相当于0.75em长度;

9pt相当于0.75em长度;

一般我们使用em换算px较多

高级em与px换算:

任意浏览器的默认字体高度16px(16像素)。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。

具体使用时候:

我们在对全体html标签声明初始一次font-size=62.5%

如:

*{font-size=62.5%}

即可此后面布局可依据以下技巧进行设置em单位

font-size:1.2em等于font-size:12px

font-size:1.4em等于font-size:14px

以此类推相当于初始font-size=62.5%后,em与px单位就只有10倍差距,以便方便计算与设置em长度数值使用。

四、em单位有如下特点:

  1. em的值并不是固定的;

  2. em会继承父级元素的字体大小。

我们在写CSS的时候如果要用em为单位,需要注意两点:

  1. body选择器中声明Font-size=62.5%;

  2. 将你的原来的px数值除以10,然后换上em作为单位;

  3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。

  也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em,那么在声明的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继承#content的字体高而变为了1em=12px。

  但是12px汉字例外,就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点。这个问题 Jorux已经解决,只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时,对于浮点的取值精确度有限。不知道有没有其他的解释。

五、推荐网页单位

所以为了单位换算错误推荐使用PX(像素)作为网页制作单位

以上为大家介绍了px em pt单位,及换算方式,一般现在我们使用长度单位都以px为长度单位。这里我们也推荐使用以px(像素)为网页的尺寸长度单位,符合浏览器的像素单位,同时也为了方便计算长度尺寸。

关于px pt em单位总结

1)、推荐px像素为单位:通常我们使用px(像素为单位)较多,其次是em单位,平时推荐大家以px为单位;

2)、我们的显示屏分辨率以px像素为单位;

3)、我们QQ截图时候也是以px像素单位。