热门标签 | 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;索引的基础操作





推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
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社区 版权所有