Flash对象插入到网页中的3px问题
我记得我已经遇到过,不过今天又遇到了,而且浪费了大量的时候在上面,甚至怀疑自己写的脚本有问题,花了几乎一个下午来调试这个问题。最后发现是样式导致的…
公司里有很多网页游戏,之前是项目多,抄来抄去,JS代码有的是我写的,有的是其它同事直接从网上下载下来copy进去的,到处都是JQuery的$,我不太愿意看到一个页面为了获取DOM对象(getElementById)以及绑定事件来引用额外的脚本,同时也为了统一。网页游戏大多数都是全屏显示,浏览器可视区域有多大,它就全屏显示在里面,为了避免混乱,写了一个通用的脚本支持用户在缩放浏览器时,当可视区域小于指定的宽、高时出现滚动条(Chrome与IE表现一致)。
但当我拿到浏览器可视的宽、高时,对swf对象设定width、height时,神奇的滚动条就出现了,这不符合预期,抓狂…
然后排查问题,对界面所有的元素、样式都删除掉,然后再进行测试,还是有问题。而当我把获得到的可视区域的宽高均减去4px时就不会有滚动条了!!!但界面明显感觉就不对称了,后来找到问题了。
在网上找到二种解决方法:
1、设置swf对象的display属性,将其设置为block;
2、设置body的字体、行高为0,font-size:0;line-height:0;
第二种方法如果页面有文本节点就需要额外再设定字体及行高了,有点麻烦(不过页游界面一般比较简单,一般不太会有什么文字)
默认swf对象返回的display属性为空
最后附上相关的脚本代码,供有需要的同学参考:
/**
* Author zhangyi@bojoy.net
* Version V1.0
*/ var BOJOY_Resize = function() {
var inner;
var _eventList = []; function bindReady(handler) {
var isReady = false; function ready() {
if (isReady) return;
isReady = true;
handler();
} if (document.addEventListener) {//native event
document.addEventListener("DOMContentLoaded", function() {
document.removeEventListener("DOMContentLoaded", arguments.callee, false);
ready();
}, false);
} else if (document.attachEvent) {//IE
//iframe
document.attachEvent("onreadystatechange", function () {
if (document.readyState === "complete") {
document.detachEvent("onreadystatechange", arguments.callee);
ready();
}
}); if (document.documentElement.doScroll && typeof window.frameElement === "undefined") {
(function () {
if (isReady) return;
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch (error) {
setTimeout(arguments.callee, 0);
return;
}
// and execute any waiting functions
ready();
})();
}
} // Old browsers
if (window.addEventListener) {
window.addEventListener('load', ready, false);
} else if (window.attachEvent) {
window.attachEvent('onload', ready);
} else {
var fn = window.onload // very old browser, copy old onload
window.onload = function() { // replace by new onload and call the old one
fn && fn()
ready()
}
}
} bindReady(function() {
while (_eventList.length) {
var fn = _eventList.shift();
fn && fn();
}
}); function bindEvent(elem, type, fn) {
type = type.replace(/^on/, ''); if (elem.addEventListener) {
elem.addEventListener(type, fn, false);
} else if (elem.attachEvent) {
elem.attachEvent('on' + type, fn);
}
} function unBindEvent(elem, type, fn) {
type = type.replace(/^on/, ''); if (elem.removeEventListener) {
elem.removeEventListener(type, fn, false);
} else if (elem.detachEvent) {
elem.detachEvent('on' + type, fn);
}
} function getElem(id) {
return typeof id === 'string' ? document.getElementById(id) : id;
} return inner = {
domReady : function(fn) {
_eventList.push(fn);
},
getEl : getElem,
bind : function(id, type, fn) {
var elem = getElem(id); bindEvent(elem, type, fn);
},
unBind : function(id, type, fn) {
var elem = getElem(id); unBindEvent(elem, type, fn);
},
init : function(id, minWidth, minHeight, extraWidth, extraHeight, autoScroll) {
if (!inner.getEl(id)) {
return ;
} minWidth = minWidth || 1000;
minHeight = minHeight || 600;
extraWidth = extraWidth || 0;
extraHeight = extraHeight || 0; if (typeof(autoScroll) != 'boolean') {
autoScroll = true;
} var delayTimer = null; function adjustSize() {
var elem = inner.getEl(id);
elem.style.display = 'block'; var ua = navigator.userAgent.toLowerCase();
var isStrict = document.compatMode == "CSS1Compat";
var isOpera = /opera/.test(ua);
var isIE = !isOpera && /msie/.test(ua); var winWidth = 0, winHeight = 0; if (!isStrict && !isOpera) {
winWidth = document.body.clientWidth;
} else if (isIE) {
winWidth = document.documentElement.clientWidth;
} else {
winWidth = window.innerWidth;
} if (isIE) {
winHeight = isStrict ? document.documentElement.clientHeight : document.body.clientHeight;
} else {
winHeight = window.innerHeight;
} window.console && window.console.log('isStrict:', isStrict);
window.console && window.console.log('winWidth:', winWidth);
window.console && window.console.log('winHeight:', winHeight); var w = winWidth - extraWidth;
var h = winHeight - extraHeight; if (autoScroll) {
w = Math.max(minWidth, w);
h = Math.max(minHeight, h);
} elem.style.height = h + 'px';
elem.style.width = w + 'px'; window.console && window.console.log('width:', w);
window.console && window.console.log('height:', h);
} function delayResize() {
if (delayTimer != null) {
clearTimeout(delayTimer);
delayTimer = null;
} delayTimer = setTimeout(function() {
adjustSize();
}, 0);
} inner.domReady(adjustSize);
inner.bind(window, 'load', delayResize);
inner.bind(window, 'resize', delayResize);
}
} }();
使用方法:
BOJOY_Resize.init(swfId, minWidth, minHeight, 固定预留的宽度, 固定预留的高度, 是否需要显示滚动条-Boolean);
*固定预留的宽、高指的页面需要固定显示的内容,它们的宽、高,例如页面左侧有一个游戏攻略,顶部有一个全局提示消息等。上面的脚本支持iframe嵌套
参考链接:
2-3px space below Flash object in Firefox...
Font-size adds extra space when positioning text elements in Opera
Extra 2-3px below Flash object on Firefox
Flash对象插入到网页中的3px问题的更多相关文章
- 前端页面js与flash交互——js获取flash对象,并传递参数
背景介绍: 最近在搞一个项目,涉及到图片选取,裁剪,上传等,由于浏览器安全性问题,js无法获取到<input type="file">中选取的文件路径,而且对照片的裁剪 ...
- 网页中插入FLASH(swf文件),并且让Flash不遮挡HTML元素
一:网页中插入flash代码如下: 当然里面的很多属性可以去掉,根据具体的需求而定. 我们在网页中经常遇到播放flash,要正常播放flash就要用到OBJECT和EMBED这两个标签.鉴于火狐及 ...
- 网页中插入Flash动画(.swf)代码和常用参数设置
我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...
- 网页中插入swf动画(embed)
网页中插入swf动画(embed:[ɪm'bed]) 例题: <embed src="swf.sef" width="200" height=" ...
- 在网页中插入背景音乐代码(html)
有两种 分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器. 二者的参数如 ...
- 网页中插入外部视频的几种方法(PC与手机网页通用)
网页中加入视频的几种方法(PC与手机网页通用) 方法一: <!doctype html> <html> <head> <meta charset=" ...
- 在网页中怎样给已发布的Flash添加链接的方法(zhuan)
因为网页中的 Flash 是以控件形式出现的,优先级别较高,所以直接对它加链接是无效的,不过可以用按钮控件 BUTTON 来实现. 具体步骤 1.直接在按钮上加上onClick事件打开指定页面: &l ...
- 用flvplayer.swf在网页中播放视频(网页中flash视频播放的实现)
原:http://blog.csdn.net/ricciozhang/article/details/46868201 由于公司项目的需求,需要在展示一些信息的时候能够播放视频,拿到这个要求,我就从最 ...
- 网页中flash设置
我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...
随机推荐
- js下判断 iframe 是否加载完成的完美方法
一般来说,我们判断 iframe 是否加载完成其实与 判断JavaScript 文件是否加载完成. 采用的方法很类似: var iframe = document.createElement( ...
- java中父类和子类初始化顺序
顺序 1. 父类中静态成员变量和静态代码块 2. 子类中静态成员变量和静态代码块 3. 父类中普通成员变量和代码块,父类的构造函数 4. 子类中普通成员变量和代码块,子类的构造函数 其中“和”字两端的 ...
- Parcel极速零配置Web应用打包工具
当听到极速零配置打包,我不经兴奋起来,零配置!!!想起在webpack打包的配置,这个零配置着实让我好奇不已,迅速学习一波. Parcel(parcel 英[ˈpɑ:sl] 美[ˈpɑ:rsl])有以 ...
- python3.5 自带的虚拟环境使用
首先我们要选择一个目录作为虚拟环境的目录, 这里选择c:\myenv cd myenv python -m venv . #在当前目录下创建虚拟环境 创建完成之后,myenv下会多出一些文件 进入sc ...
- VMware vsphere Hypervisor、VMware vsphere和VMware Workstation小记
VMware Workstation软件需要依赖于宿主操作系统之上. VMware vSphere是VMware公司推出一套服务器虚拟化解决方案,它是可以直接独立安装和运行在祼机上的系统. VMwar ...
- Codeforces 986D Perfect Encoding FFT
题意: 给定一个数n,选出m个数使得 $\Pi_{i=1}^m a_i\ge n$,求$\sum_{i=1}^m a_i$的最小值 ,其中$m$的大小不限 $n$的长度$\le 10^6$ 简单的计算 ...
- Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树
F. st-Spanning Tree 题目连接: http://codeforces.com/contest/723/problem/F Description You are given an u ...
- 无法在web服务器上启动调试,iis未列出与打开的URL匹配的网站
错误的原因可能是:在iis的网站上绑定的具体的机器的ip地址. 解决方法:可以在网站上绑定ip地址时选择“全部未分配”项.
- Graph database_neo4j 底层存储结构分析(2)
3 neo4j存储结构 neo4j 中,主要有4类节点,属性,关系等文件是以数组作为核心存储结构:同时对节点,属性,关系等类型的每个数据项都会分配一个唯一的ID,在存储时以该ID 为数组的 ...
- FireDAC 下的 Sqlite [3] - 获取数据库的基本信息
在空白窗体上添加: TFDConnection, TFDPhysSQLiteDriverLink, TFDGUIxWaitCursor, TMemo procedure TForm1.FormCrea ...