html如何使文字左侧环绕,HTML5实现Word中文字全环绕图片效果

实现这个功能是当时看见数字报的展示出来的编排方式,就是图片+热点,而且下载打开还是PDF的,让我这个WP用户咋个看。想实现Word中的编排方式,也需要浏览器支持Word插件,火狐、谷歌、Opera这些都要另外弄插件,很麻烦的。

还好,H5出来了,用它就能办很多事情,比如说文字环绕效果。

先上图。

9d9660f8f005a42a247672421c132cd6.png

fd768ff746d0ab0576fbce75922dade2.png

上图是谷歌浏览器的实现效果,下图为WP上的实现效果。

其实实现原理是每个文字在DIV中的定位,然后判断字是否与像素点碰撞,就这么简单。

无标题文档

#paper{

position:relative;

top:30px;

left:40px;

border:1px #000 solid;

width:400px;

height:400px;

overflow:hidden;

}

.f{

font-family:Verdana, Geneva, sans-serif;

font-size:14px;

position:absolute;

overflow:hidden;

}

var cvs = document.getElementById('canva');

var ctx = cvs.getContext("2d");

var p = document.getElementById('paper');

p.style.width="350px";

p.style.height="400px";

var words = "  河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹河蟹vv。";

var words2='  带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表带三个表。';

var c_col = 0;

var c_row = 0;

var img = document.createElement('img');

img.style.width = "136px";

img.style.height = "99px";

//img.src='flag_1_b.png';

img.src='bg2.png';

img.style.top='35px';

img.style.left='150px';

img.style.position='absolute';

p.appendChild(img);

var p_w_picpath = new Image();

p_w_picpath.src = 'bg2.png';

p_w_picpath.οnlοad=function(){

ctx.fillStyle='#fff';

ctx.fillRect(0,0,getNum(p.style.width),getNum(p.style.height));

ctx.drawImage(p_w_picpath,150,35,136,99);

addWord(words,ctx);

addWord(words2,ctx);

}

function getNum(sw){

return parseInt(sw.substring(0,sw.split('').length-2));

};

function addWord(words,ctx){

var pix = 2;//像素容差3倍

var paper= document.getElementById('paper');

var wordwidth=16;

var wordheight = 16;

var sw = paper.style.width+"";

var w = getNum(sw);//宽

var sh = paper.style.height+"";

var h = getNum(sh);//高

var cols = parseInt(w/wordwidth);

var word = words.split('');

/*

*/

for(var i = 0 ; i < word.length ; i++){

if(c_col>=cols){

c_col=0;

c_row++;

}

//console.info("c_col:"+c_col+"#c_row:"+c_row);

var letter = document.createElement('div');

letter.appendChild(document.createTextNode(word[i]));

letter.setAttribute('class','f');

letter.style.width = wordwidth+"px";

letter.style.height = wordheight+"px";

var pos_c = 0;

var pos_r = 0;

var inner = false;

var canwrite = false;

while(!canwrite){

var count=0;

var imgdata = ctx.getImageData(wordwidth*(c_col+pos_c),wordheight*(c_row+pos_r),wordwidth,wordheight);

for(var ii = 0; ii < imgdata.data.length;ii++){

var r = imgdata.data[ii+0];

var g = imgdata.data[ii+1];

var b = imgdata.data[ii+2];

var a = imgdata.data[ii+3];

ii=ii+4;

/*

if(0+pix < r){

count++;

}else if(0+pix < g){

count++;

}else if(0+pix < b){

count++;

}

*/

if(255-pix > r){

count++;

}else if(255-pix > g){

count++;

}else if(255-pix > b){

count++;

}

}

var total = wordwidth*wordheight;

if(count/total<0.03){

canwrite = true;

}else{

if((getNum(img.style.width)+getNum(img.style.left)) + wordwidth < w){//如果图片离右边框还有间隙

pos_c++;

}else{//图片离有边框没有间隙

pos_c=0;

c_col=0;

c_row=c_row+1;

}

}

}

/*  只判断正规矩形图片

//判断左上角

if(getNum(img.style.left)<=(wordwidth*c_col) && (wordwidth*c_col)<=(getNum(img.style.width)+getNum(img.style.left))){

if(getNum(img.style.top)<=(wordheight*c_row) && getNum(img.style.top)+getNum(img.style.height)>=(wordheight*c_row) ){

//在图像区域内

inner = true;

if((getNum(img.style.width)+getNum(img.style.left)) + wordwidth < w){//如果图片离右边框还有间隙

pos_c = parseInt((getNum(img.style.width)+getNum(img.style.left))/wordwidth+0.5)-c_col;

}else{//图片离有边框没有间隙

pos_c=0;

pos_r = parseInt((getNum(img.style.height)+getNum(img.style.top))/wordheight+0.5)-c_row;

}

}

}

//判断右上角

if(!inner)

if(getNum(img.style.left)<=(wordwidth*c_col+wordwidth) && (wordwidth*c_col+wordwidth)<=(getNum(img.style.width)+getNum(img.style.left))){

if(getNum(img.style.top)<=(wordheight*c_row) && getNum(img.style.top)+getNum(img.style.height)>=(wordheight*c_row) ){

//在图像区域内

inner = true;

if((getNum(img.style.width)+getNum(img.style.left)) + wordwidth < w){//如果图片离右边框还有间隙

pos_c = parseInt((getNum(img.style.width)+getNum(img.style.left))/wordwidth+0.5)-c_col;

}else{//图片离有边框没有间隙

pos_c=0;

pos_r = parseInt((getNum(img.style.height)+getNum(img.style.top))/wordheight+0.5)-c_row;

}

}

}

//判断左下角

if(!inner)

if(getNum(img.style.left)<=(wordwidth*c_col) && (wordwidth*c_col)<=(getNum(img.style.width)+getNum(img.style.left))){

if(getNum(img.style.top)<=(wordheight*c_row+wordheight) && getNum(img.style.top)+getNum(img.style.height)>=(wordheight*c_row+wordheight) ){

//在图像区域内

inner = true;

if((getNum(img.style.width)+getNum(img.style.left)) + wordwidth < w){//如果图片离右边框还有间隙

pos_c = parseInt((getNum(img.style.width)+getNum(img.style.left))/wordwidth+0.5)-c_col;

}else{//图片离有边框没有间隙

pos_c=0;

pos_r = parseInt((getNum(img.style.height)+getNum(img.style.top))/wordheight+0.5)-c_row;

}

}

}

//判断右下角

if(!inner)

if(getNum(img.style.left)<=(wordwidth*c_col+wordwidth) && (wordwidth*c_col+wordwidth)<=(getNum(img.style.width)+getNum(img.style.left))){

if(getNum(img.style.top)<=(wordheight*c_row+wordheight) && getNum(img.style.top)+getNum(img.style.height)>=(wordheight*c_row+wordheight) ){

//在图像区域内

inner = true;

if((getNum(img.style.width)+getNum(img.style.left)) + wordwidth < w){//如果图片离右边框还有间隙

pos_c = parseInt((getNum(img.style.width)+getNum(img.style.left))/wordwidth+0.5)-c_col;

}else{//图片离有边框没有间隙

pos_c=0;

pos_r = parseInt((getNum(img.style.height)+getNum(img.style.top))/wordheight+0.5)-c_row;

}

}

}

*/

letter.style.top=(wordheight*c_row)+"px";

letter.style.left=(wordwidth*(c_col+pos_c))+"px";

paper.appendChild(letter);

c_col=c_col+pos_c+1;

}

c_col=0;

c_row++;

}

上面代码里面注释掉的那判断正规矩形代码可以在IE8下面运行,之前我在IE8下可以运行canvas,但现在不知道怎么就跑不了咯。。汗。。

7216095b72ea2d28fa5e74eb91fb6af2.png

c23bbf78acc8bf159593c96551eb08b0.png

永远不支持IE6!!

欢迎交流。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值