html5图片文字环绕效果,HTML5实现Word中文字全环绕图片效果

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

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

先上图。

202244176.png

202247448.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 image = new Image();

image.src = 'bg2.png';

image.οnlοad=function(){

ctx.fillStyle='#fff';

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

ctx.drawImage(image,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,但现在不知道怎么就跑不了咯。。汗。。

202324707.png

202327116.png

永远不支持IE6!!

欢迎交流。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Aspose.Words设置Word图片环绕方式为衬于文字下方,可以使用图片的`RelativeHorizontalPosition`和`RelativeVerticalPosition`属性来实现。下面是示例代码: ```csharp using Aspose.Words; using Aspose.Words.Drawing; // 加载文档 Document doc = new Document("input.docx"); // 获取第一个段落 Paragraph para = doc.FirstSection.Body.FirstParagraph; // 插入图片 Shape shape = para.AppendChild(new Shape(doc, ShapeType.Image)); shape.ImageData.SetImage("path_to_your_image.png"); // 设置图片的相对水平位置为页面 shape.RelativeHorizontalPosition = RelativeHorizontalPosition.Page; // 设置图片的相对垂直位置为段落 shape.RelativeVerticalPosition = RelativeVerticalPosition.Paragraph; // 设置图片的绕排方式为衬于文字下方 shape.WrapType = WrapType.BehindText; // 保存文档 doc.Save("output.docx"); ``` 在上述代码,我们首先加载现有的文档,并获取第一个段落。然后,使用`AppendChild`方法在段落插入一个新的图片对象,并将图片路径设置为`Image`对象的`SetImage`方法的参数。 接下来,我们通过设置图片的`RelativeHorizontalPosition`属性为`RelativeHorizontalPosition.Page`,将图片相对于页面水平居。同时,设置图片的`RelativeVerticalPosition`属性为`RelativeVerticalPosition.Paragraph`,将图片相对于段落垂直居。 最后,我们将图片的`WrapType`属性设置为`WrapType.BehindText`,表示将图片设置为衬于文字下方。 请确保将`"path_to_your_image.png"`替换为你要插入的实际图片路径。最后,通过调用`Save`方法保存文档。 这样,插入的图片将衬于文字下方,并且相对于页面水平居。希望这次能够帮助你成功实现预期的功能。如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值