Visual Studio突出顯示了我的div
標記的onresize
屬性,並表示它不是HTML5的有效屬性。這是真的?我應該用什麼來代替?看起來很愚蠢,情況就是如此。對div元素的onresize?
回答
微軟的Internet Explorer支持所有HTML元素的onresize
。 在所有其他瀏覽器中,onresize
僅在window
對象上可用。 https://developer.mozilla.org/en-US/docs/Web/API/Window.onresize
如果你想還有onResize在所有瀏覽器中div
檢查:
http://marcj.github.io/css-element-queries/
這個包內有類ResizeSensor
可用於resize
檢測。
我已經更新了我的方法,現在比以前的版本更簡單並且更準確。馬克,你應該更新元素查詢的東西來使用這個最新的代碼(backalleycoder是我的博客) – csuwldcat
@csuwldcat,是的它更簡單,但在初始化方式較慢,所以我沒有進一步遵循'對象'方法。 –
添加以下CSS和JavaScript到您的網頁,並使用addResizeListener
和removeResizeListener
方法來監聽單元尺寸的改變(博客文章進一步的細節:http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/):
調整尺寸傳感器CSS
.resize-triggers {
visibility: hidden;
}
.resize-triggers, .resize-triggers > div, .contract-trigger:before {
content: " ";
display: block;
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
.resize-triggers > div {
background: #eee;
overflow: auto;
}
.contract-trigger:before {
width: 200%;
height: 200%;
}
Resize事件方法
以下是JA您需要啓用調整事件監聽的vaScript。前兩個函數是在主addResizeListener和removeResizeListener方法中使用的先決條件。
(function(){
var attachEvent = document.attachEvent;
if (!attachEvent) {
var requestFrame = (function(){
var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
function(fn){ return window.setTimeout(fn, 20); };
return function(fn){ return raf(fn); };
})();
var cancelFrame = (function(){
var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame ||
window.clearTimeout;
return function(id){ return cancel(id); };
})();
function resetTriggers(element){
var triggers = element.__resizeTriggers__,
expand = triggers.firstElementChild,
contract = triggers.lastElementChild,
expandChild = expand.firstElementChild;
contract.scrollLeft = contract.scrollWidth;
contract.scrollTop = contract.scrollHeight;
expandChild.style.width = expand.offsetWidth + 1 + 'px';
expandChild.style.height = expand.offsetHeight + 1 + 'px';
expand.scrollLeft = expand.scrollWidth;
expand.scrollTop = expand.scrollHeight;
};
function checkTriggers(element){
return element.offsetWidth != element.__resizeLast__.width ||
element.offsetHeight != element.__resizeLast__.height;
}
function scrollListener(e){
var element = this;
resetTriggers(this);
if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);
this.__resizeRAF__ = requestFrame(function(){
if (checkTriggers(element)) {
element.__resizeLast__.width = element.offsetWidth;
element.__resizeLast__.height = element.offsetHeight;
element.__resizeListeners__.forEach(function(fn){
fn.call(element, e);
});
}
});
};
}
window.addResizeListener = function(element, fn){
if (attachEvent) element.attachEvent('resize', fn);
else {
if (!element.__resizeTriggers__) {
if (getComputedStyle(element).position == 'static') element.style.position = 'relative';
element.__resizeLast__ = {};
element.__resizeListeners__ = [];
(element.__resizeTriggers__ = document.createElement('div')).className = 'resize-triggers';
element.__resizeTriggers__.innerHTML = '<div class="expand-trigger"><div></div></div>' +
'<div class="contract-trigger"></div>';
element.appendChild(element.__resizeTriggers__);
resetTriggers(element);
element.addEventListener('scroll', scrollListener, true);
}
element.__resizeListeners__.push(fn);
}
};
window.removeResizeListener = function(element, fn){
if (attachEvent) element.detachEvent('resize', fn);
else {
element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
if (!element.__resizeListeners__.length) {
element.removeEventListener('scroll', scrollListener);
element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);
}
}
}
})();
Demo-licious!
下面是該方法的僞代碼用法。
var myElement = document.getElementById('my_element'),
myResizeFn = function(){
/* do something on resize */
};
addResizeListener(myElement, myResizeFn);
removeResizeListener(myElement, myResizeFn);
似乎不適用於我:http://jsfiddle.net/t2Aqa/7/ 應該調用resize事件,方法是按下切換按鈕或調整HTML呈現區域的大小,但似乎是隻有在佈局完成後調用一次。 我錯過了什麼嗎? – suamikim
@suamikim是的,在你的addResizeListener處理程序中,你吹掉傳感器元素,方法通過覆蓋目標target.html(target.width()+'x'+ target)的所有內容來偵聽調整大小。 height());' – csuwldcat
@csuwldcat如果您要複製並粘貼來自其他資源的答案,請至少提供參考資料和確認:http://www.backalleycoder.com/2013/03/18/跨瀏覽器事件爲基礎的元素調整大小檢測/ –
只有Window.onResize
存在於規範。請記住,每個IFrame
元素會創建支持onResize
的新對象Window
。因此,IMO檢測元素大小變化的最可靠方法是將隱藏的iframe添加到元素中。
如果您對整潔便攜的解決方案感興趣,請檢查this plugin。 需要1行代碼來監聽div的寬度或高度變化。
<!-- (1) include plugin script in a page -->
<script src="/src/jquery-element-onresize.js"></script>
// (2) use the detectResizing plugin to monitor changes to the element's size:
$monitoredElement.detectResizing({ onResize: monitoredElement_onResize });
// (3) write a function to react on changes:
function monitoredElement_onResize() {
// logic here...
}
這可能沒有任何插件來完成,簡單通過收集所有DIV的一些窗口的數組被描述下here
- 1. 跨瀏覽器元素onresize(HTML/JS)
- 2. 把絕對div元素後的元素
- 3. 對齊div元素
- 4. 針對div元素
- 5. 對齊Div中的Div元素
- 6. 對齊浮動元素DIV
- 7. 正確對齊div元素
- 8. 內嵌div元素對齊
- 9. jquery |動態改變div的高度onresize
- 10. 聽窗口在onResize,不包括jQuery的對話框的在onResize
- 11. 絕對覆蓋div元素不覆蓋相對定位元素
- 12. Div元素在另一個div元素
- 13. 對齊中心對齊div元素
- 14. Justify JavaScript更新後的父div元素中的div div元素
- 15. 如何將不在div內的元素與div內的其他元素對齊?
- 16. CSS塊元素div元素
- 17. 如何對齊div內的元素
- 18. 垂直對齊div中的元素
- 19. 如何垂直對齊Div的元素
- 20. 對div元素的文本溢出
- 21. `對象添加元素的div
- 22. 嘗試對齊div中的元素
- 23. 垂直對齊div元素的中間
- 24. CSS:對齊div中的元素
- 25. 對div元素的模糊效果
- 26. 右對齊的div表單元素
- 27. div元素的水平對齊
- 28. CSS:對齊DIV中的元素
- 29. 定位的div位置:絕對元素
- 30. 如何對齊div內的span元素?
請不要使用Google 10秒前問爲別人的時間。 https://developer.mozilla.org/en-US/docs/Web/API/Window.onresize「不是規範的一部分。」 –
那篇文章是關於Window的resize事件,它是否適用於像div這樣的元素?而不是規範的一部分並不告訴我它有多少瀏覽器支持,或者它是否具有更有效的規範解決方案。 – Oztaco
@ leaf68首先你用什麼來調整div的大小?提供相關的代碼使我們可以更輕鬆地爲您提供幫助 –