当前位置: 首页 > news >正文

从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开发领域取得更大的成功。

相关文章:

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

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

linux复习笔记05(小滴课堂)

hell脚本与crontab定时器的运用 查看状态&#xff1a; 关闭服务&#xff1a; 开启服务&#xff1a; 重启服务&#xff1a; crontab定时器的使用&#xff1a; 我们可以看到没有任何任务。 编辑&#xff1a; 我们可以看到这个任务了。 删除所有任务&#xff1a; 这代表着每分钟…...

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web&#xff1a;路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离...

常见的1/2/3位数码管接线详解

今天玩数码管的时候接触到了数码管的接线&#xff0c;分享一下供刚开始接触的童鞋参考 首先了解什么是数码管 数码管是一种可以显示数字和其他信息的电子设备&#xff0c;是显示屏其中一类&#xff0c; 通过对其不同的管脚输入相对的电流&#xff0c;会使其发亮&#xff0c;从而…...

C++模板介绍

定义 C模板是一种编程技术&#xff0c;它允许程序员在编译时生成具有特定类型的函数或类&#xff0c;而无需在运行时进行类型检查。模板是一种泛型编程的方式&#xff0c;它使得程序员可以编写可适用于多种数据类型的代码&#xff0c;提高了代码的重用性和灵活性。 C模板可以…...

kafka kraft 集群搭建保姆级教学 包含几个踩坑点

一.为啥弃用zookeeper kafka 弃用 ZooKeeper 而采用 KRaft 的主要原因是为了改进 Kafka 集群的可靠性和可管理性。 在传统的 Kafka 架构中&#xff0c;ZooKeeper 用于存储和管理集群的元数据、配置信息和状态。然而&#xff0c;使用 ZooKeeper 作为协调服务存在一些限制和挑战…...

html实现360度产品预览(附源码)

文章目录 1.设计来源1.1 拖动汽车产品旋转1.2 汽车产品自动控制 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134613931 html实现360度产品预览&#xff08;附源码&…...

11-23 SSM4

Ajax 同步请求 &#xff1a;全局刷新的方式 -> synchronous请求 客户端发一个请求&#xff0c;服务器响应之后你客户端才能继续后续操作&#xff0c;请求二响应完之后才能发送后续的请求&#xff0c;依次类推 有点&#xff1a;服务器负载较小&#xff0c;但是由于服务器相应…...

CPU、GPU、TPU内存子系统架构

文章目录 CPU、GPU、TPU内存子系统架构概要CPUGPUTPU共同点和差异&#xff1a; CPU、GPU、TPU内存子系统架构 概要 Memory Subsystem Architecture&#xff0c;图源自TVM CPU CPU&#xff08;中央处理器&#xff09;的内存子系统&#xff1a;隐式管理 主内存&#xff08;…...

R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

很久很久以前给大家写过决策树&#xff0c;非常简单明了的算法。今天给大家写随机&#xff08;生存&#xff09;森林&#xff0c;随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。…...

transformers pipeline出现ConnectionResetError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

代码随想录-刷题第九天

28. 找出字符串中第一个匹配项的下标 题目链接&#xff1a;28. 找出字符串中第一个匹配项的下标 思路1&#xff1a;先来写一下暴力解法。 时间复杂度O(n*m) class Solution {public int strStr(String haystack, String needle) {// 暴力解法先来一遍for (int i 0; i <…...

MySQL基本SQL语句(下)

MySQL基本SQL语句&#xff08;下&#xff09; 一、扩展常见的数据类型 1、回顾数据表的创建语法 基本语法&#xff1a; mysql> create table 数据表名称(字段名称1 字段类型 字段约束,字段名称2 字段类型 字段约束,...primary key(主键字段 > 不能为空、必须唯一) ) …...

【洛谷算法题】P5715-三位数排序【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5715-三位数排序【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式…...

上海亚商投顾:北证50指数大涨 逾百只北交所个股涨超10%

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指11月24日震荡调整&#xff0c;深成指、创业板指盘中跌超1%。北证50指数大涨超6%&#xff0c;北交所个股持…...

设计模式—依赖倒置原则(DIP)

1.概念 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff09;是程序要依赖于抽象接口&#xff0c;不要依赖于具体实现。简单的说就是要求对抽象进行编程&#xff0c;不要对实现进行编程&#xff0c;这样就降低了客户与实现模块间的耦合。 通俗的讲&#xff1…...

windows下docker环境搭建与运行实战

背景 学习docker使用&#xff0c;需要环境&#xff0c;今天主要的目标是在windows环境下安装docker环境。 为什么要这么搞&#xff0c;主要是企业内部服务器&#xff0c;都是跟公网隔离的&#xff0c;没有访问公网权限&#xff0c;所以镜像什么的&#xff0c;从公网拉取完全没…...

c# EF框架的增删改查操作

查询 /// <summary>/// 查询/// </summary>private void SQLLoad(){//linq查询&#xff0c;方法一//var UserInfoList from u in db.UserInfo//给个变量u&#xff0c;用来接收查询结果对象//select u;//查询结果对象 //db.UserInfo.Find(1);//依据主键查询,方法二…...

Element-UI Upload 手动上传文件的实现与优化

文章目录 引言第一部分&#xff1a;Element-UI Upload 基本用法1.1 安装 Element-UI1.2 使用 <el-upload> 组件 第二部分&#xff1a;手动上传文件2.1 手动触发上传2.2 手动上传时的文件处理 第三部分&#xff1a;性能优化3.1 并发上传3.2 文件上传限制 结语 &#x1f38…...

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …...

万象视界灵坛入门必看:CLIP多模态原理通俗解读+像素界面操作逻辑映射

万象视界灵坛入门必看&#xff1a;CLIP多模态原理通俗解读像素界面操作逻辑映射 1. 什么是万象视界灵坛 万象视界灵坛是一款基于OpenAI CLIP技术的高级多模态智能感知平台。它将复杂的视觉识别技术转化为直观有趣的像素风格界面&#xff0c;让用户能够轻松探索图像与文本之间…...

Loom响应式不是银弹:当Reactor延迟突增300ms,我们用Arthas+VirtualThread Dump定位到第7层CallStack的栈帧膨胀漏洞

第一章&#xff1a;Loom响应式不是银弹&#xff1a;当Reactor延迟突增300ms&#xff0c;我们用ArthasVirtualThread Dump定位到第7层CallStack的栈帧膨胀漏洞在一次灰度发布后&#xff0c;订单履约服务的P99延迟从85ms骤升至382ms&#xff0c;而CPU使用率仅维持在42%左右——典…...

【Day 10 Java转Python】@property——把方法当属性用,Python的封装艺术

Java老兵写Python时最常问的问题&#xff1a;“私有字段呢&#xff1f;getter和setter呢&#xff1f;没有这些&#xff0c;封装还叫封装吗&#xff1f;” 别急&#xff0c;Python告诉你&#xff1a;封装不是为了写一堆getXxx()/setXxx()&#xff0c;而是为了在需要时优雅地插入…...

Kandinsky-5.0-I2V-Lite-5s环境部署详解:JDK与依赖库的完整安装配置

Kandinsky-5.0-I2V-Lite-5s环境部署详解&#xff1a;JDK与依赖库的完整安装配置 1. 准备工作 在开始部署Kandinsky-5.0-I2V-Lite-5s之前&#xff0c;我们需要确保服务器具备运行该模型所需的基础环境。这个由文本生成视频的AI模型需要特定的Java运行环境和视频处理工具才能正…...

植物大战僵尸修改器:3分钟解锁无限游戏乐趣的终极指南

植物大战僵尸修改器&#xff1a;3分钟解锁无限游戏乐趣的终极指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为阳光不够用而烦恼&#xff1f;无尽模式卡在第10波就过不去&#xff1f;想保…...

互联网大厂为啥不把研发迁到二三线城市?

&#x1f449; 这是一个或许对你有用的社群&#x1f431; 一对一交流/面试小册/简历优化/求职解惑&#xff0c;欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料&#xff1a; 《项目实战&#xff08;视频&#xff09;》&#xff1a;从书中学&#xff0c;往事上…...

【AI大模型】RKNN神经网络计算框架从入门到部署

目录 一、RKNN核心基础认知&#xff08;必学&#xff09; 1.1 什么是RKNN 1.2 RKNN核心工具链组成 1.3 学习前提&#xff08;必备基础&#xff09; 二、环境搭建&#xff08;分步实操&#xff0c;零踩坑&#xff09; 2.1 PC端环境搭建&#xff08;Ubuntu 20.04&#xff09…...

通义千问3-4B模型语义搜索优化:ES插件集成部署实战

通义千问3-4B模型语义搜索优化&#xff1a;ES插件集成部署实战 1. 引言&#xff1a;为什么需要语义搜索优化 传统的搜索引擎主要依赖关键词匹配&#xff0c;当你搜索"苹果"时&#xff0c;它可能返回水果苹果、苹果公司、甚至人名苹果的各种结果。而语义搜索能理解你…...

4款产品小心侵权!美国外观专利维权频发,亚马逊卖家侵权预警!

近期&#xff0c;赛贝了解到亚马逊平台上鞋跟保护套、防滑冰爪、广告展示牌、汽车排气变径组件等四类产品的美国外观专利维权行动频繁&#xff0c;已有不少卖家因被控侵权导致热销链接下架&#xff0c;损失惨重。赛贝整理相关专利信息&#xff0c;帮助亚马逊卖家更好地预防侵权…...

Spring Boot 4.0正式版GA后72小时内,头部云厂商紧急下架3款旧Agent插件——你的生产集群是否仍在使用已被标记为EOL的Instrumentation库?

第一章&#xff1a;Spring Boot 4.0 Agent-Ready 架构演进与EOL危机全景Spring Boot 4.0 并非官方已发布版本&#xff0c;而是社区与企业级监控、可观测性厂商围绕 Java Agent 深度集成所推动的架构预演范式。其核心驱动力源于 Spring Boot 3.x 的 Jakarta EE 9 迁移完成、Graa…...