热门标签 | 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编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • JavaScript中属性节点的类型及应用
    本文深入探讨了JavaScript中属性节点的不同类型及其在实际开发中的应用,帮助开发者更好地理解和处理HTML元素的属性。通过具体的案例和代码示例,我们将详细解析如何操作这些属性节点。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
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社区 版权所有