自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比;

2、当元素的高度大于原有比例计算出来的高度时,背景图片的高度拉伸自适应100%,否则高度为auto,会自动被裁减

3、背景图片容器高度变化时,自动计算背景图片的高度

在这里插入图片描述

js 复制代码
const setBackgroundImageHeight = (element) => { //todo 设置背景图片的高度
  const getWidthNum = (width) => width ? width.slice(0, -2) : width; //todo 手动截掉宽度的px后缀
  const img = new Image();
  const { height, width, backgroundImage } = getComputedStyle(element); //? 获取到该元素的宽高
  img.src = backgroundImage.replace(/^url\(["']?/, '').replace(/["']?\)$/, '');
  img.onload = function() {
    var aspectRatio = img.width / img.height; //? 获取该背景图片的宽高比
    const backgroundImageHeight = getWidthNum(height) > (getWidthNum(width)/aspectRatio) ? '100%' : 'auto'; //* 当元素的高度大于原有比例计算出来的高度时,背景图片的高度拉伸自适应100%
    element.style.backgroundSize = `100% ${backgroundImageHeight}`;
    console.log('%c 🍎 张浩雨: img.onload -> element.style.backgroundSize ', 'font-size:16px;background-color:#ea00ea;color:white;', element.style.backgroundSize)
  };
}
const imageHeightOnChange = (element) => { //todo 背景图片容器高度变化时,自动计算背景图片的高度
  // 创建一个观察者对象
  const observer = new MutationObserver((mutationsList, observe) => {
      for(let mutation of mutationsList) {
        if (mutation.attributeName === 'style') {
          const style = mutation.target.getAttribute('style');
          if (style.includes('height')) {
            setBackgroundImageHeight(element)
          }
        }
      }
  });
  // 传入目标节点和观察目标节点的属性变动
  observer.observe(element, {
    attributes: true,
    attributeOldValue: true,
    attributeFilter: ['style']
  });
  return observer
}

var imgBox = document.getElementById('img_box');
imageHeightOnChange(imgBox)

案例讲解

1、初始化时的默认宽高;

2、背景图片的宽高;

3、执行上面的代码,并执行imgBox.setAttribute('style', 'height: 380px'),此时高度小于图片的宽高比计算出来的高度,图片高度被裁减;

4、执行imgBox.setAttribute('style', 'height: 580px'),此时高度大于图片的宽高比计算出来的高度,图片高度被拉伸100%;

5、当执行imgBox.setAttribute('style', 'height: 480px'),此时高度等于图片的宽高比计算出来的高度,图片高度正常展示;

相关推荐
2501_94812263几秒前
React Native for OpenHarmony 实战:Steam 资讯 App 设置页面
javascript·react native·react.js·游戏·ecmascript·harmonyos
2501_948122632 分钟前
React Native for OpenHarmony 实战:Steam 资讯 App 意见反馈实现
javascript·react native·react.js·游戏·ecmascript·harmonyos
是罐装可乐5 分钟前
前端架构知识体系:深入理解 sessionStorage、opener 与浏览器会话模型
开发语言·前端·javascript·promise·语法糖
2501_944521006 分钟前
rn_for_openharmony商城项目app实战-账号安全实现
javascript·数据库·安全·react native·react.js·ecmascript
Amumu121387 分钟前
React路由(三)
javascript·react.js·ecmascript
vx_bisheyuange8 分钟前
基于SpringBoot的旅游管理系统
前端·javascript·vue.js·spring boot·毕业设计
木易 士心14 分钟前
加密与编码算法全解:从原理到精通(Java & JS 实战版)
java·javascript·算法
AI陪跑16 分钟前
解决 React + GrapesJS iframe 中 CSS-in-JS 样式隔离问题
javascript·css·react.js
Tiam-201616 分钟前
cesium使用cesium-plot-js标绘多种图形
javascript·vue.js·arcgis·es6·gis·cesium·cesium-plot-js
前天的五花肉21 分钟前
D3.js研发交互模型指标柱形图
开发语言·javascript·交互