js 在指定宽高元素中插入自适应图片

在一个指定宽高的div中根据图片尺寸做相应展示。首先,需要获取图片的真实宽高,其次比较图片宽高和容器宽高,根据不同情形设置图片元素的展示样式。这里分三类:1、如果图片的width和height均小于容器的width和height,那么直接让图片上下左右居中;2、 如果图片的width大于容器的width或height大于容器的height,图片的宽高比大于容器比例,让图片按照宽度等比例缩放,然后垂直居中(容器需line-height);3、 如果图片的width大于容器的width或height大于容器的height,图片的宽高比小于容器比例,让图片按照高度等比例缩放,然后左右居中(容器需text-align:center;vertical-align:middle);

css:

.outer{
    margin: auto;
    margin-top: 20px;
    width: 400px;
    height: 300px;
    text-align: center;
    line-height: 300px;
    border: 2px solid bisque;
   }
.img{
    vertical-align: middle;
}

html:

<div style="" class="outer"id="picdiv"></div>
<button id='addImg'>ok</button>

js:IE中如果图片已经缓存过onload可能不触发,因为IE加载缓存快,未运行到onload图片就已经加载好了,所以还需要用complete判断图片是否加载完毕,IE根据这个属性判断图片是否已加载完并显示,值为true表示已显示,此时可以直接获取宽高。注complete和缓存没有关系,即和以前是否加载过该张图片没有关系。

可参考:http://blog.sina.com.cn/s/blog_73c8ed1901013k70.html

var imgLoad = function (url,callback) {
    var img = new Image();
    img.src = url;
    if (img.complete) {
        callback(img.width, img.height);
    } else {
        img.onload = function () {
            callback(img.width, img.height);
            img.onload = null;
        };
    };
};
document.getElementById('addImg').οnclick=function(){
	var url="xxx/xxx.jpg";	
	imgLoad(url,function(width,height){
		var h= height; 
		var w= width;
		var outerw=document.getElementById('picdiv').clientWidth;//scrollWidth
		var outerh=document.getElementById('picdiv').clientHeight;
		var imgNode=document.createElement('img');
		//.appendChild(div);
		var html="";
		if( (w>outerw||h>outerh)&&w/h>=outerw/outerh){
			//920*554 宽高
			//宽比较大 width 100%
			html='<img style="width:100%;" class="img" src="'+url+'">';
		}else if((w>outerw||h>outerh)&&w/h<outerw/outerh){			
			html='<img style="height:100%;" class="img" src="'+url+'">';
		}else {
			html='<img style="" class="img" src="'+url+'">';
		}
		document.getElementById("picdiv").innerHTML = html;
	})	
}

或jquery:

 $("#addImg").on('click',function(){
	var url="xxx/xxx.jpg";
	$("<img/>").attr("src",url).load(function() {
		var h= this.height; 
		var w=  this.width;
		var outerw=$(".outer").width();
		var outerh=$(".outer").height();
		var html="";
		if( (w>outerw||h>outerh)&&w/h>=outerw/outerh){
			//920*554 宽高
			//宽比较大 width 100%
			html='<img style="width:100%;" class="img" src="'+url+'">';
		}else if((w>outerw||h>outerh)&&w/h<outerw/outerh){
			html='<img style="height:100%;" class="img" src="'+url+'">';
		}else {
			html='<img style="" class="img" src="'+url+'">';
		}
		$("#picdiv").html(html);
	});	
})


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 canvas 绘制自适应宽高的文本,可以使用 `measureText()` 方法来计算文本的宽度,然后根据计算出的宽度和高度来绘制文本。 下面是一个示例代码,演示如何在指定宽高内绘制自适应的文本: ```javascript // 选择 canvas 元素 var canvas = document.getElementById('myCanvas'); // 获取 2D 上下文 var ctx = canvas.getContext('2d'); // 设置最大宽度和高度 var maxWidth = 200; var maxHeight = 100; // 设置字体样式 var fontSize = 30; ctx.font = fontSize + 'px Arial'; // 定义文本内容 var text = 'Hello World! This is some long text that will wrap.'; // 计算文本的宽度 var textWidth = ctx.measureText(text).width; // 如果文本的宽度超过了最大宽度,就进行自动换行 if (textWidth > maxWidth) { var words = text.split(' '); var line = ''; var lines = []; for (var i = 0; i < words.length; i++) { var testLine = line + words[i] + ' '; var testWidth = ctx.measureText(testLine).width; if (testWidth > maxWidth) { lines.push(line); line = words[i] + ' '; } else { line = testLine; } } lines.push(line); text = lines.join('\n'); } // 计算文本的高度 var textHeight = fontSize * (text.split('\n').length); // 如果文本的高度超过了最大高度,就缩小字体大小 if (textHeight > maxHeight) { fontSize = fontSize * (maxHeight / textHeight); ctx.font = fontSize + 'px Arial'; textHeight = fontSize * (text.split('\n').length); } // 计算文本左上角的坐标 var x = (canvas.width - textWidth) / 2; var y = (canvas.height - textHeight) / 2; // 绘制文本 ctx.fillText(text, x, y); ``` 这个示例代码,我们首先定义了最大宽度和高度,然后设置了字体样式和文本内容。接着,我们使用 `measureText()` 方法计算了文本的宽度,如果文本宽度超过了最大宽度,就进行自动换行,计算出每一行的文本内容。然后,我们根据每行文本的长度计算出文本的高度,如果文本高度超过了最大高度,就缩小字体大小,重新计算文本高度。 最后,我们计算出文本左上角的坐标,使用 `fillText()` 方法在 canvas 绘制文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值