博客统计信息

51cto推荐博客
用户名:xcf007
文章数:362
评论数:223
访问量:314315
无忧币:2434
博客积分:4316
博客等级:7
注册日期:2008-09-06

关于图片缩小比例问题探讨
2009-04-02 16:22:58
1.不指定Img尺寸,保持原始尺寸
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>避免图片缩放变形-"裁切遮罩法"</title>
</head>
<body>
  <div>
    <h3>这里我们要显示一张图片</h3>
    <p>这张图片本身大小是683*1024px大小的,如果我们不指定img的width和height就会按照原始尺寸显示。</p>
    <img src="images/pic (1).jpg" alt="" />
  </div>
</body>
</html>
 
这种办法当然是比较好的,但是需要编辑人员在上传图片之前对图片根据需要的尺寸裁切才能不会出现图片过大撑开页面的问题。
或者页面容器尺寸固定,图片裁切到指定的宽高比。
 
 
如果为img指定width和height中任意一个,另一个留空,浏览器也可以为我们等比缩放图片显示。
这种不太适合容器宽高比固定的情况
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>避免图片缩放变形-"裁切遮罩法"</title>
</head>
<body>
  <div>
    <h3>这里我们要显示一张图片</h3>
    <p>这张图片本身大小是683*1024px大小的,如果我们不指定img的width和height就会按照原始尺寸显示。</p>
    <img src="images/pic (1).jpg" alt="" height="200" />
  </div>
</body>
</html>
这里我们假如容器的高度固定为200px,每个图片高度设为容器的200px高度,会有什么问题呢,如果大图的话,问题不是很大,但是如果很小的图放大到200px;那就很模糊了。于是有人想到了max-height属性,比如max-height:200px;那么如果图片大于200px高度,那么就取到200px,如果小则保留原样(但会有填不满容器,出现白边的问题),需要提到的是ie无法识别max-height需要用到css表达式Hacks。
 
如果设置了overflow:hidden;图片超出的部分就会隐藏显示。
 
但是实际中有些图片是用户上传的,一般不能对图片实现处理。
于是有些网站提供在线的图片裁切工具。
 
要求用户多此一举的对图片进行修改是不太人性化的。
可是又要满足要求怎么办呢?
 
我们看看如何用js实现裁切图片:
看下demo程序:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>避免图片缩放变形-"裁切遮罩法"</title>
<style type="text/css">
#demo1,#demo2
{
border:2px solid #900;
}
.img_mask
{
width:200px;
height:200px;
overflow:hidden;
}
</style>
</head>
<body>
  <div>
    <h3>这里我们要显示一张图片</h3>
    <p>这张图片本身大小是683*1024px大小的,如果我们不指定img的width和height就会按照原始尺寸显示。</p>
    <div id="demo1" class="img_mask">
      <img src="images/pic (1).jpg" alt="" width="200" />
    </div>
    <div id="demo2" class="img_mask">
      <img src="images/pic (4).jpg" alt="" height="200" />
    </div>    
  </div>
</body>
</html>
 
上面是手动的,图片选了2张,一张横向比较长的,一个是高度比较高的,下面我们用js来自动截取:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>避免图片缩放变形-"裁切遮罩法"</title>
<style type="text/css">
#demo1,#demo2
{
border:2px solid #900;
}
.img_mask
{
width:200px;
height:200px;
overflow:hidden;
}
</style>
<script type="text/javascript">
//图片裁切
function imgClip(img,w,h)
{
  var ratio=img.width/img.height;//图片长宽比

  if(ratio<(w/h))
  {
    //高度方向截取
    img.width=w;
    img.height=Math.round(w/ratio);
    img.style.marginTop=(h-img.height)/2+"px";
  }else{
    //宽度方向截取
    img.height=h;
    img.width=Math.round(w*ratio);
    img.style.marginLeft=(w-img.width)/2+"px";    
  }    
}
</script>
</head>
<body>
  <div>
    <h3>这里我们要显示一张图片</h3>
    <p>这张图片本身大小是683*1024px大小的,如果我们不指定img的width和height就会按照原始尺寸显示。</p>
    <div id="demo1" class="img_mask">
      <img src="images/pic (1).jpg" alt="" />
    </div>
    <div id="demo2" class="img_mask">
      <img src="images/pic (4).jpg" alt="" />
    </div>    
    <script type="text/javascript">
    var imgs=document.getElementsByTagName('img');
    for(var i=0;i<imgs.length;i++)
    if(imgs[i].parentNode.className=='img_mask')
    {
      imgClip(imgs[i],imgs[i].parentNode.clientWidth,imgs[i].parentNode.clientHeight);
    }
    </script>
  </div>
</body>
</html>
 
分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章

附件下载:
  图片1
  图片2
类别:Web前端开发技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2009-04-11 13:18:44
不错不错。呵呵

2009-04-12 13:28:54
嗯,不错,但是有点。。。 好像,呵呵,还是不错的一片文

2009-04-14 16:41:25
截图是成功了。。
但是。。
有个问题必须解决。。。
截图后。图片显示不完整了。。
用户怎么看?
建议把截图功能改成自动缩放。。。

2009-04-18 15:19:56
裁切图片一般用在页面中容器固定情况下,保持页面布局的整齐性,但是图片会被裁掉一部分而不能显示完整,一般这种情况图片多是作为链接区域,只要我们链接的文章页面中图片保持完整性就可以了,还有人物头像,变形的图片不太好看,尤其变形厉害的。

而对于相册类的,出于图片显示为目的,不一定要裁切,

这些都不是死的,自己决定是否裁。

 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: