发布于 2024 年 10 月 24 日,星期四
在iOS设备上,用户从剪贴板粘贴图片到网页时,可能会遇到图片高度异常的问题。这种异常通常表现为图片的高度与实际内容不符,导致图片显示变形或不完整。问题的本质在于iOS系统在处理剪贴板数据时,可能会错误地计算图片的高度,导致前端页面无法正确渲染图片。解决方案可能包括调整CSS样式、使用JavaScript动态计算图片高度、或者通过特定的API获取剪贴板数据并手动处理图片尺寸。此外,开发者还需要考虑不同iOS版本和设备型号的兼容性问题,以确保解决方案的广泛适用性。
在移动端开发中,当用户复制并粘贴图片时,我们期望图片能够完整显示。然而,在 iOS 设备上会出现一个特殊问题:粘贴后的图片仅显示原高度的约 1% 左右(如下图),导致图片显示不完整。这个问题在 Android 设备上并不存在。
以下 HTML 图片属性可能导致渲染异常,导致复制过去只加载了少部分内容:
常见的属性配置组合:
// 高性能配置
const highPerformanceConfig = {
decoding: 'auto',
fetchpriority: 'high',
loading: 'eager',
};
// 低性能配置
const lowPerformanceConfig = {
decoding: 'async',
fetchpriority: 'low',
loading: 'lazy',
};
// 1. 封装一个图片显示组件,在组件加载时统一处理图片高度问题
/**
* 获取获取图片高度
* @param url 图片地址
* @returns
*/
function getImgDimensions(url) {
if (!url) return;
return new Promise((resolve, reject) => {
const img = new Image();
// 注意这里的url如果带有缩略图参数的,需要去掉
// 我这里使用的 七牛云 CDN 图片参数
img.src = url.replace('?imageView2/2/w/750', '');
img.onload = () => {
const width = img.width;
const height = img.height;
// 将获取的宽高,通过 data 属性绑定到 img 元素上
this.dimension = { width, height };
resolve({ width, height });
};
img.onerror = () => {
reject(new Error('无法加载图片'));
};
});
}
// 2. 在复制方法中,针对于复制格式(html)做统一处理
/**
* 格式化HTML节点字符串
* @param htmlString HTML节点字符串
* @returns
*/
function formatHtml(htmlString) {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const imgNodes = doc.getElementsByTagName('img');
for (let img of imgNodes) {
// 通过获取 img 组件中 data-width 和 data-height 属性,设置 img 的宽高
const width = img.getAttribute('data-width');
const height = img.getAttribute('data-height');
if (img.src) {
// 只针对于 IOS 做处理
if (systemUtils.isIOS()) {
img.style.width = `${width}px`;
img.style.height = `${height}px`;
}
}
}
return doc.body.innerHTML;
}
优点:
缺点:
针对 iOS 剪贴板图片高度异常问题,可使用动态设置高度问题: