从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中,图像是不可或缺的一部分,而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像,为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧,并通过丰富的示例代码演示如何实现各种功能。

图片加载与展示

1 基本加载

const image = new Image();
image.src = 'path/to/image.jpg';image.onload = function() {document.getElementById('gallery').appendChild(image);
};

2 图片预加载

function preloadImages(images) {const preloaded = [];images.forEach(src => {const img = new Image();img.src = src;preloaded.push(img);});return preloaded;
}const imagePaths = ['path/to/image1.jpg', 'path/to/image2.jpg'];
const preloadedImages = preloadImages(imagePaths);

图片操作与效果

1 缩放与裁剪

function scaleImage(image, scaleFactor) {image.width *= scaleFactor;image.height *= scaleFactor;
}function cropImage(image, startX, startY, width, height) {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = width;canvas.height = height;ctx.drawImage(image, startX, startY, width, height, 0, 0, width, height);return canvas.toDataURL(); // 返回裁剪后的图片数据
}

2 滤镜效果

function applyFilter(image, filter) {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = image.width;canvas.height = image.height;ctx.drawImage(image, 0, 0);const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);const data = imageData.data;for (let i = 0; i < data.length; i += 4) {data[i] = filter(data[i]);         // Rdata[i + 1] = filter(data[i + 1]); // Gdata[i + 2] = filter(data[i + 2]); // B}ctx.putImageData(imageData, 0, 0);return canvas.toDataURL(); // 返回应用滤镜后的图片数据
}

图片库组件化

1 图片轮播组件

class ImageSlider {constructor(images) {this.images = images;this.currentIndex = 0;this.container = document.getElementById('slider-container');this.showCurrentImage();}showCurrentImage() {this.container.innerHTML = '';const image = new Image();image.src = this.images[this.currentIndex];this.container.appendChild(image);}next() {this.currentIndex = (this.currentIndex + 1) % this.images.length;this.showCurrentImage();}prev() {this.currentIndex = (this.currentIndex - 1 + this.images.length) % this.images.length;this.showCurrentImage();}
}const sliderImages = ['path/to/image1.jpg', 'path/to/image2.jpg', 'path/to/image3.jpg'];
const imageSlider = new ImageSlider(sliderImages);

图片库的动画与交互

1 图片展示动画

function fadeInImage(image) {image.style.opacity = 0;const start = performance.now();function animate(now) {const elapsed = now - start;image.style.opacity = Math.min(1, elapsed / 1000); // 在1秒内淡入if (elapsed < 1000) {requestAnimationFrame(animate);}}requestAnimationFrame(animate);
}

2 图片拖拽与放大缩小

class DraggableImage {constructor(image) {this.image = image;this.dragging = false;this.scale = 1;this.init();}init() {this.image.addEventListener('mousedown', this.startDrag.bind(this));this.image.addEventListener('mouseup', this.endDrag.bind(this));this.image.addEventListener('mousemove', this.drag.bind(this));this.image.addEventListener('wheel', this.zoom.bind(this));}startDrag(event) {this.dragging = true;this.startX = event.clientX - this.image.offsetLeft;this.startY = event.clientY - this.image.offsetTop;}endDrag() {this.dragging = false;}drag(event) {if (!this.dragging) return;this.image.style.left = event.clientX - this.startX + 'px';this.image.style.top = event.clientY - this.startY + 'px';}zoom(event) {event.preventDefault();this.scale += event.deltaY * -0.01;this.scale = Math.min(Math.max(0.1, this.scale), 3);this.image.style.transform = `scale(${this.scale})`;}
}const draggableImage = new DraggableImage(document.getElementById('draggable-image'));

图片库的性能优化

1 惰性加载

function lazyLoadImages(images) {const observer = new IntersectionObserver(entries => {entries.forEach(entry => {if (entry.isIntersecting) {const image = entry.target;image.src = image.dataset.src;observer.unobserve(image);}});});images.forEach(image => {observer.observe(image);});
}

2 WebP格式的使用

function supportsWebP() {const elem = document.createElement('canvas');if (elem.getContext && elem.getContext('2d')) {// was able or not to get WebP representationreturn elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;}// very old browser like IE 8, canvas not supportedreturn false;
}function replaceImageWithWebP(images) {if (supportsWebP()) {images.forEach(image => {const webpSrc = image.src.replace(/\.(png|jpg|jpeg)$/, '.webp');image.src = webpSrc;});}
}

图片库的跨浏览器兼容性

1 浏览器前缀处理

function setTransform(element, value) {element.style.webkitTransform = value;element.style.MozTransform = value;element.style.msTransform = value;element.style.transform = value;
}

2 兼容性检测

function isTouchDevice() {return 'ontouchstart' in window || navigator.msMaxTouchPoints;
}if (isTouchDevice()) {// 在触摸设备上执行相应操作
} else {// 在非触摸设备上执行相应操作
}

图片库的安全性考虑

1 防止图片劫持

function checkImageIntegrity(image) {const img = new Image();img.src = image.src;img.onload = function() {if (img.width === 0 || img.height === 0) {// 图片可能被劫持,采取相应措施}};
}

2 防止XSS攻击

function sanitizeImageSource(source) {const img = new Image();img.src = source;const sanitizedSource = img.src;return sanitizedSource;
}

总结

在构建JavaScript图片库的过程中,深入探讨了多个关键方面,包括图片加载与展示、操作与效果、组件化、动画与交互、性能优化、兼容性以及安全性考虑。通过丰富的示例代码,不仅学会了基础的图片加载和展示技巧,还掌握了图片的操作、效果处理,甚至构建了一个简单的图片轮播组件。在动画与交互方面,实现了淡入效果、拖拽与缩放等交互操作,提升了用户体验。

性能优化方面,介绍了惰性加载和WebP格式的使用,以提高网页加载速度。跨浏览器兼容性方面,涉及了浏览器前缀处理和兼容性检测,确保图片库在不同浏览器上正常运行。最后,关注了安全性,通过检测图片完整性和防止XSS攻击,提高了图片库的安全性。

总体而言,通过本文的学习,将掌握构建强大、灵活且安全的JavaScript图片库的核心知识。在实际应用中,可以根据项目需求选择适当的技术和方法,并结合性能优化和安全性考虑,打造出更具竞争力的图片展示解决方案。希望大家能够灵活运用这些知识,为用户提供更丰富、交互性强的视觉体验,从而在Web开发领域取得更大的成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

透过对话聊天聊网络tcp三次握手四次挥手

序 说起来网络&#xff0c;就让我想起的就是一张图。我在网上可以为所欲为&#xff0c;反正你又不能顺着网线来打我。接下来我们来详细说一下网络到底是怎么连接的。 TCP三次打招呼 首先我会用男女生之间的聊天方式&#xff0c;来举一个例子。 从tcp三次握手来说&#xff0c;…

基于Loki + Promtail + Grafana 搭建 Nginx 日志监控

文章目录 引言第一部分&#xff1a;Loki 简介与安装1.1 Loki 简介1.2 Loki 安装1.2.1 下载 Loki1.2.2 安装 Loki 1.3 启动 Loki 第二部分&#xff1a;Promtail 简介与安装2.1 Promtail 简介2.2 Promtail 安装2.2.1 下载 Promtail2.2.2 安装 Promtail 2.3 启动 Promtail 第三部分…

231126 刷题日报

1. 高楼扔鸡蛋 O(N*logN) 2. 698. 划分为k个相等的子集 没做出来&#xff0c;和划分两个子集不同 3. 300. 最长递增子序列 LIS petencie sorting 没看懂&#xff0c;明天看吧 4. 518. 零钱兑换 II 完全背包问题&#xff1a;每个物品数量是无限的 注意&#xff1a;dp的定义…

使用不平衡数据集练习机器学习

一、介绍 在当今世界&#xff0c;机器学习和人工智能几乎被广泛应用于每个领域&#xff0c;以提高绩效和结果。但如果没有数据&#xff0c;它们还有用吗&#xff1f;答案是否定的。机器学习算法严重依赖我们提供给它们的数据。我们提供给算法的数据质量在很大程度上决定了机器学…

2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项竞赛正式试题

第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题 目录 一、竞赛时间 二、竞赛阶段 三、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;200分&#xff09; &#xff08;三&#xf…

Centos 7.9 Install Docker Insecure Registry

文章目录 1. 镜像存储规划2. 安装定制 docker3. 部署 registry4. 验证镜像仓库 1. 镜像存储规划 linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】 创建两个目录 一个 docker 数据存储目录 &#xff1a;/data/docker&#xff0c;默认一般为linux为 /var/lib/d…

boomYouth

周一&#xff1a; 1. action异步写法&#xff1a; <script setup> import sonCom1 from /components/sonCom1.vue import sonCom2 from /components/sonCom2.vue import {useCountStore} from /store/counter import {useChannelStore} from /store/channel const count…

1、nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式&#xff08;1&#xff09;TCP connect 扫描&#xff08;2&#xff09;TCP SYN扫描&#xff08;3&#xff09;TCP …

PTA-7-55 判断指定字符串是否合法

题目&#xff1a; 输入一个字符串&#xff0c;判断指定字符串是否合法&#xff0c;要求字符串由7个字符组成&#xff0c;并且第一位必须是大写字母&#xff0c;2-4为必须是小写字母&#xff0c;后3为必须是数字字符&#xff0c;要求使用正则表达式来实现。 根据题目要求&#x…

防火墙命令行基础配置实验(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求3. 当前配置3.1 PC配置3.2 FW配置&#xff08;防火墙&#xff09;[^7][^8]3.2.1 FW1配置3.2.2 FW2配置 3.3 R配置3.3.1 R1配置3.3.2 R2配置 3.4 SW配置3.4.1 SW1配置3.4.2 SW2配置3.4.3 SW3配置…

1.9 字符数组

1.9 字符数组 一、字符数组概述二、练习 一、字符数组概述 所谓字符数组&#xff0c;就是char类型的数组&#xff0c;比如 char a[]&#xff0c;是C语言中最常用的数组类型&#xff0c;先看一个程序 #include <stdio.h> #define MAXLINE 1000 //最大行长度限制 int get…

gradle构建项目速度优化及排查方式

文章目录 一、前言二、Android项目优化1、相关配置2、构建速度分析 三、Gradle项目通用优化1、分析构建耗时2、使用配置进行优化3、优化依赖解析a. 避免不必要和未使用的依赖项b. 优化存储库顺序 c. 最小化动态和快照版本d. 通过构建扫描查找动态和变化的版本e. 通过构建扫描可…

⑤【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

[C/C++]数据结构 堆的详解

一:概念 堆通常是一个可以被看做一棵完全二叉树的数组对象,它是一颗完全二叉树,堆存储的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并且需要满足每个父亲结点总小于其子节点(或者每个父亲结点总大于其子节点) 堆可以分为两种: 小堆: 任意一个父亲节点都小于其子…

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

HarmonyOS应用开发者基础认证【满分答案】

系列文章 HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者基础认证【满分答案】 HarmonyOS云开发基础认证【最新题库 满分答案】 目录 系列文章一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中&#xff0c;justifyContent用于设置…

常见树种(贵州省):022绣线菊、月月青、金合欢、胡枝子、白刺花

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、绣线菊…

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

WebUI自动化学习(Selenium+Python+Pytest框架)001

开启另一篇学习之路_WebUI自动化 先来一波基础概念 1.自动化适合什么类型的项目: 重复性高,迭代频率高的回归测试。数据量大、手工难以实现的压力测试&#xff0c;手工执行效率低的兼容测试 2.自动化的优点: 高效率、可重复、减少人为错误、克服手工测试的局限性 3.自动化…

光线追踪-Peter Shirley的RayTracingInOneWeekend系列教程(book1-book3)代码分章节整理

自己码完了一遍了&#xff0c;把代码分章节整理了一下&#xff0c;可以按章节独立编译&#xff0c;运行, 也可以直接下载编译好的release版本直接运行。 项目地址&#xff1a; Github: https://github.com/disini/RayTracingInOneWeekendChaptByChapt ​ ​ ​ ​