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

图片加载失败替换图片解决方案图片加载失败在不同浏览器表现有差异,比如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'">

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • VS2015无法解析外部符号

    VS2015无法解析外部符号在使用VS编辑C++时,遇到了无法解析外部符号的错误严重性代码说明项目文件行错误LNK2019无法解析的外部符号"public:__thiscallEmployee::Employee(void)"(??0Employee@@QAE@XZ),该符号在函数"public:__thiscallmanager::manager(int,classstd::bas…

  • IO接口编程[通俗易懂]

    IO接口编程[通俗易懂]IO接口编程作者:毛茏玮/Saint掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a微博:https://weibo.com/5458277467/profile?topnav=1&amp;wvr=6&amp;is_all=1GitHub:github.com/saint-000CSDN:https://me.csdn.net/…

  • Windows系统查看CUDA版本号

    Windows系统查看CUDA版本号问题:之前安装了CUDA,但不知道是哪个版本了?也不知道安装到哪了?解决方法:1.打开控制面板在按住Win键的情况下,按R键,呼唤运行栏。在运行框中输入control,如下图所示:2.进入NVIDIA控制面板3.查看系统信息验证:找到之前的安装目录确定了确实是10.1版本…

  • 查看本机上的端口使用情况netstat -an「建议收藏」

    查看本机上的端口使用情况netstat -an「建议收藏」1.查找本机上的端口使用情况netstat-an2.查找指定端口的使用情况C:\Windows\System32>netstat-ano|find"8002"

  • JS查找数组中是否包含某个元素或对象「建议收藏」

    JS查找数组中是否包含某个元素或对象「建议收藏」做业务需求时遇到一个功能模块需要动态增删数组对象,需求本身完成不难,但是写出来的代码我总感觉很冗余,于是我在网上找了很久,看有没有现成的轮子可以使用,最终找到了es6中的一个方法将其记录在此,方便以后自己翻阅查找对数组元素进行增删//e是你要判断是否在这个数组里的元素letarr=[‘1′,’2′,’3′,’4’]letarrIndex=arr.indexOf(e)i…

    2022年10月18日
  • 时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」

    时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」实现ARMA和ARIMA时间序列模型的预测。

发表回复

您的电子邮箱地址不会被公开。

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