热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:使用JavaScript解决网页图片拉伸问题

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用JavaScript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用Javascript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。



转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/53084716

http://www.llwjy.com/blogdetail/92b85d1cdb0343a7bd6d8dd0868c0f82.html

个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~

-------------------------------------------------------------------------------------------------

      在开始之前先打一个小小的广告,自己创建一个QQ群:321903218,点击链接加入群【Lucene案例开发】,主要用于交流如何使用Lucene来创建站内搜索后台,同时还会不定期的在群内开相关的公开课,感兴趣的童鞋可以加入交流。


问题描述

      这段时间在做PM的需求的时候突然发现一个问题,产品上的图片来自多个第三方,具体的尺寸无法确定,如果直接在样式中写死图片的尺寸大小就会出现图片拉伸的现象,十分影响产品的美观,因此希望可以找到一个比较好的解决方案。自己先做了一个简单的demo来展示问题。

<html>



















      上述这种情况还是挺影响美观的&#xff0c;是否可以考虑动态的设置图片的尺寸呢&#xff1f;


解决思路

      是否可以在浏览器加载图片资源后&#xff0c;获取图片的真实尺寸和图片容器的大小&#xff0c;然后动态地设置图片的width、height属性。


获取图片的真实尺寸

      html5下已经提供了相应的方法来返回图片的真实尺寸大小&#xff08;img.naturalWidth、img.naturalHeight&#xff09;&#xff0c;针对IE6/7/8也可以通过以下方法来获取真实尺寸的大小

var imgae &#61; new Image();
image.src &#61; img.src;
image.onload &#61; function() {
var w &#61; image.width;
var h &#61; image.height;
}

      下面就编写对应的JS方法获取图片的真实尺寸已经图片容器的尺寸大小

setImgSize : function(img, callback) {
if (img.naturalWidth) { //html5
callback(img, img.naturalWidth, img.naturalHeight, img.width, img.height);
} else { // IE 6 7 8
var imgae &#61; new Image();
image.src &#61; img.src;
image.onload &#61; function() {
callback(img, image.width, image.height, img.width, img.height);
}
}
}


重新设置图片尺寸

      在获取图片真实尺寸已经容器尺寸之后&#xff0c;我们需要重新设置图片的尺寸大小。这里先简单的介绍下处理目标&#xff1a;如果设置后的尺寸超过展示区域&#xff0c;则展示图片的中间部分&#xff0c;如果展示区域大于图片尺寸&#xff0c;则图片居中显示。用图简单说明下&#xff0c;黑色实线为图片的显示区域&#xff0c;绿色部分为图片的大小。


      下面我们提供三种方法来处理图片&#xff0c;分别实现上部两种&#xff08;宽度一致&#xff09;、下部两种&#xff08;高度一致&#xff09;、右侧两种&#xff08;铺满显示区域&#xff09;&#xff0c;下面就分别介绍这三种方法&#xff1a;

一、保证宽度一致

//原始宽度 原始高度 容器宽度 容器高度
//保证宽度一致
resetImgSizeW : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((h - height) / 2);
img.style.marginTop &#61; top &#43; "px";
} else if (nwh img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((height - h) / 2) * -1;
img.style.marginTop &#61; top &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
},


      在这里我们需要判断图片原始尺寸的长宽比例以及容器的长宽比例之间的关系&#xff0c;如果高度富裕&#xff0c;那就相应将图片往上移动一定的像素&#xff0c;如果高度不足&#xff0c;就将图片往下移动相应的像素&#xff0c;至于其他的两种情况也是同样的逻辑&#xff0c;先看下处理后的效果&#xff1a;



二、保证高度一致

//原始宽度 原始高度 容器宽度 容器高度
//保证高度一致
resetImgSizeH : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((width - w) / 2) * -1;
img.style.marginLeft &#61; left &#43; "px";
} else if (nwh img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((w - width) / 2);
img.style.marginLeft &#61; left &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
}





三、铺满显示区域

//原始宽度 原始高度 容器宽度 容器高度
//铺满全屏
resetImgSizeWH : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((width - w) / 2) * -1;
img.style.marginLeft &#61; left &#43; "px";
} else if (nwh img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((height - h) / 2) * -1;
img.style.marginTop &#61; top &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
},






如何使用JS

      上面对实现的逻辑以及最终的效果做了简单的介绍&#xff0c;下面就介绍下如何使用。







ImageLoad源码

$(document).ready(function() {
new ImageLoad();
});
ImageLoad &#61; function(){
this.init();
};
ImageLoad.prototype &#61; {
init : function () {
// this.initImg("w");
},
initImg : function(type) {
var _this &#61; this;
var imgs &#61; document.getElementsByTagName(&#39;img&#39;);
for (var i&#61;0; i try {
var img &#61; imgs[i];
if ("w" &#61;&#61; type) {
$(img).onload &#61; _this.setImgSize(img, _this.resetImgSizeW);
} else if ("h" &#61;&#61; type) {
$(img).onload &#61; _this.setImgSize(img, _this.resetImgSizeH);
} else if ("wh" &#61;&#61; type) {
$(img).onload &#61; _this.setImgSize(img, _this.resetImgSizeWH);
}
} catch(e) {
}
}
},
//原始宽度 原始高度 容器宽度 容器高度
//保证高度一致
resetImgSizeH : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((width - w) / 2) * -1;
img.style.marginLeft &#61; left &#43; "px";
} else if (nwh img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((w - width) / 2);
img.style.marginLeft &#61; left &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
},
//原始宽度 原始高度 容器宽度 容器高度
//保证宽度一致
resetImgSizeW : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((h - height) / 2);
img.style.marginTop &#61; top &#43; "px";
} else if (nwh img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((height - h) / 2) * -1;
img.style.marginTop &#61; top &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
},
//原始宽度 原始高度 容器宽度 容器高度
//铺满全屏
resetImgSizeWH : function(img, nw, nh, w, h) {
nwh &#61; nw / nh;
wh &#61; w / h;
if (nwh > wh) {
img.height &#61; h;
var width &#61; parseInt(nwh * h);
img.width &#61; width;
var left &#61; parseInt((width - w) / 2) * -1;
img.style.marginLeft &#61; left &#43; "px";
} else if (nwh img.width &#61; w;
var height &#61; parseInt(1 / nwh * w);
img.height &#61; height;
var top &#61; parseInt((height - h) / 2) * -1;
img.style.marginTop &#61; top &#43; "px";
} else {
img.height &#61; h;
img.width &#61; w;
}
},
//获取图片真实尺寸以及容器尺寸
setImgSize : function(img, callback) {
if (img.naturalWidth) { //html5
callback(img, img.naturalWidth, img.naturalHeight, img.width, img.height);
} else { // IE 6 7 8
var imgae &#61; new Image();
image.src &#61; img.src;
image.onload &#61; function() {
callback(img, image.width, image.height, img.width, img.height);
}
}
},
}


      上面代码还有很多可以优化的地方&#xff0c;欢迎大家在评论区留言交流


-------------------------------------------------------------------------------------------------
小福利
-------------------------------------------------------------------------------------------------
      个人在极客学院上《Lucene案例开发》课程已经上线了&#xff0c;欢迎大家吐槽~

第一课&#xff1a;Lucene概述

第二课&#xff1a;Lucene 常用功能介绍

第三课&#xff1a;网络爬虫

第四课&#xff1a;数据库连接池

第五课&#xff1a;小说网站的采集

第六课&#xff1a;小说网站数据库操作

第七课&#xff1a;小说网站分布式爬虫的实现

第八课&#xff1a;Lucene实时搜索

第九课&#xff1a;索引的基础操作





推荐阅读
  • 本文介绍如何使用Java实现AC自动机(Aho-Corasick算法),以实现高效的多模式字符串匹配。文章涵盖了Trie树和KMP算法的基础知识,并提供了一个详细的代码示例,包括构建Trie树、设置失败指针以及执行搜索的过程。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文介绍了Elasticsearch (ES),这是一个基于Java开发的开源全文搜索引擎。ES通过JSON接口提供服务,支持分布式集群管理和索引功能,特别适合大规模数据的快速搜索与分析。 ... [详细]
  • (1)XML预处理读取test.xml并修改url节点下的localhost信息,以保证预览和下载用户所需正确资源。过程如下: ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • Spring Boot与Graylog集成实现微服务日志聚合与分析
    本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ... [详细]
  • datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
    点击上方“蓝字”关注我们目录系统设计4.1搜索引擎模型模型包括爬虫、索引生成、查询以及系统配置部分。爬虫包括:网页抓取模块、网页减肥模块、爬虫维持模块。索引生成包括& ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
author-avatar
快乐的老爷们土豆_534
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有