图片加载失败替换图片解决方案

图片加载失败替换图片解决方案图片加载失败在不同浏览器表现有差异,比如google可能会一片空白、img的宽高是0*0,ie会在图片位置会出现一个碎片图标,火狐会显示一个边框像这样:一个页面如果很多这种好难看,一般会用默认图片替换显示,解决方法:1、css方案:不好使。在img的伪类加替换图片,但火狐的img没有伪类,google有,有时候就算给img标签加了width、height也没有,图片加载失败img的宽高…

大家好,又见面了,我是你们的朋友全栈君。

图片加载失败在不同浏览器表现有差异,比如google可能会一片空白、img的宽高是0*0,ie会在图片位置会出现一个碎片图标,火狐会显示一个边框像这样:

图片加载失败替换图片解决方案图片加载失败替换图片解决方案

一个页面如果很多这种好难看,一般会用默认图片替换显示,解决方法:

1、css方案:不好使。在img的伪类加替换图片,但火狐的img没有伪类,google有,有时候就算给img标签加了width、height也没有,图片加载失败img的宽高依然是0,详情见这篇文章:

https://www.cnblogs.com/fangsmile/p/7290945.html

这样使用是应为img标签的一些特性:

1,img是个比较特殊的标签,和video一样具有被替代性,所有当图片加载成功时,原先定义的伪类会失去作用不提示。

2,alt属性会在图片加载失败是出现(替代文字),这样伪类就会起作用了。

img {
  position: relative;
}
 
img:after { 
  content: ' ';
  display: block;
  position: absolute;
  z-index: 0;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: url('替代图片');
  background-size: 100% 100%;
}

css方案由于兼容问题,不能完美解决,所以推荐js方案:

通过img的onerror事件处理

<img src="http://www.baidu.com/jfdsklf.img"  onerror="this.src= '/assets/img/head.png'; this.onerror = null;">

// this.onerror = null; 是为了防止替换图片还是丢失,img一直闪烁不停

另外,vue可以这样写:

<img :src="imgUrl" alt="" width="100" height="70" @error="imgOnerror($event)">

...
data() {
    return {
      defaultImg: require('./../../../assets/img/default-course.jpg')
    }
},
methods: {
    imgOnerror(event) {
      let img = event.srcElement
      img.src = this.defaultImg
      img.onerror = null // 防止闪图
    },
    ...
}

本人目前主要开发vue的项目,其实可以更高级的写法:封装成指令很方便:

directive.js

import Vue from 'vue'

/**
 *
 * 注册一个全局自定义指令 `v-errorAlt`
 * 加载错误图片替换默认图
 * */
const courseImg = require('./../assets/img/default-course.png')
const certificateImg = require('./../assets/img/default-certificate.png')
const photoImg = require('./../assets/img/photo.png')
Vue.directive('errorAlt', {
  bind: function (el, binding) {
    el.onerror = () => {
      switch (binding.value) {
        case 'course':
          el.src = courseImg
          break
        case 'cert':
          el.src = certificateImg
          break
        case 'photo':
          el.src = photoImg
          break
        default:
          el.src = certificateImg
      }
      el.onerror = null // 防止闪图
    }
  },
  update: function (el, binding) {
    el.onerror = () => {
      switch (binding.value) {
        case 'course':
          el.src = courseImg
          break
        case 'cert':
          el.src = certificateImg
          break
        case 'photo':
          el.src = photoImg
          break
        default:
          el.src = certificateImg
      }
      el.onerror = null // 防止闪图
    }
  }
})

html使用:


<img :src="imgUIrl" alt="" v-errorAlt="'cert'">

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137273.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IntelliJ IDEA创建maven web项目(IDEA新手适用)

    IntelliJ IDEA创建maven web项目(IDEA新手适用)PS:从eclipse刚转到IDEA,对于这个陌生的工具我表示无言,但听说很好用,也就试试,结果我几乎花了一晚上的时间才搭起来mavenweb项目,觉得在此给各位一个搭建mavenweb项目的教程,指出我踩过的各种坑!步骤一:首先先创建一个project,在这里就是创建一个maven的工作空间步骤二:按照下面的步骤操作就可以了,最后next首先,选择左边的maven然后在右…

    2022年6月26日
    55
  • A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    2022年2月24日
    51
  • cacls批量权限控制

    cacls批量权限控制

    2021年7月29日
    50
  • VMware虚拟机安装详细教程

    VMware虚拟机安装详细教程VMware安装好之后,下载好我们要安装的操作系统的镜像文件后此处安装的为centos7版本需要下载镜像的小伙伴可去我的资源处下载,就可以开始安装了。进入主页选择创建新的虚拟机这里选择自定义安装,下一步即可。可以根据需要选择版本选择完成后,下一步选择安装程序映像文件,浏览到自己下载的镜像文件,下一步即可自定义虚拟机名称,以及虚拟机存储在主机的路径,下一步即可根据需要配置处…

    2022年5月18日
    50
  • 基于epoll的TP传输层实现

    1.抽象TP传输层设计在使用epoll实现实际的传输层之前,先设计一个抽象的传输层,这个抽象的传输层是传输层实现的接口层。接口层中一共有以下几个通用的类或者接口:(1)Socket:通用的套接

    2021年12月28日
    50
  • 移动端touchmove卡顿

    网上提到的优化技术:1.window.requestAnimationFrame()  a.不用定义时间间隔,避免间隔长:卡顿,间隔短:浏览器漏帧的情况。由浏览器在绘制完一帧后自动再次调用绘制下一帧。2.transform3D代替transform3.增添惯性滑动效果,(不要小看惯性效果,效果会提升一个档次)。转载于:https://www.cnblogs.com/…

    2022年4月9日
    169

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号