📄 layout.js
字号:
/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.html.layout");dojo.require("dojo.lang.common");dojo.require("dojo.string.extras");dojo.require("dojo.html.style");dojo.require("dojo.html.layout");/** * Layout a bunch of child dom nodes within a parent dom node * Input is an array of objects like: * @ container - parent node * @ layoutPriority - "top-bottom" or "left-right" * @ children an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ] */dojo.widget.html.layout = function(container, children, layoutPriority) { dojo.html.addClass(container, "dojoLayoutContainer"); // Copy children array and remove elements w/out layout. // Also record each child's position in the input array, for sorting purposes. children = dojo.lang.filter(children, function(child, idx){ child.idx = idx; return dojo.lang.inArray(["top","bottom","left","right","client","flood"], child.layoutAlign) }); // Order the children according to layoutPriority. // Multiple children w/the same layoutPriority will be sorted by their position in the input array. if(layoutPriority && layoutPriority!="none"){ var rank = function(child){ switch(child.layoutAlign){ case "flood": return 1; case "left": case "right": return (layoutPriority=="left-right") ? 2 : 3; case "top": case "bottom": return (layoutPriority=="left-right") ? 3 : 2; default: return 4; } }; children.sort(function(a,b){ return (rank(a)-rank(b)) || (a.idx - b.idx); }); } // remaining space (blank area where nothing has been written) var f={ top: dojo.html.getPixelValue(container, "padding-top", true), left: dojo.html.getPixelValue(container, "padding-left", true) }; dojo.lang.mixin(f, dojo.html.getContentBox(container)); // set positions/sizes dojo.lang.forEach(children, function(child){ var elm=child.domNode; var pos=child.layoutAlign; // set elem to upper left corner of unused space; may move it later with(elm.style){ left = f.left+"px"; top = f.top+"px"; bottom = "auto"; right = "auto"; } dojo.html.addClass(elm, "dojoAlign" + dojo.string.capitalize(pos)); // set size && adjust record of remaining space. // note that setting the width of a <div> may affect it's height. // TODO: same is true for widgets but need to implement API to support that if ( (pos=="top")||(pos=="bottom") ) { dojo.html.setMarginBox(elm, { width: f.width }); var h = dojo.html.getMarginBox(elm).height; f.height -= h; if(pos=="top"){ f.top += h; }else{ elm.style.top = f.top + f.height + "px"; } }else if(pos=="left" || pos=="right"){ var w = dojo.html.getMarginBox(elm).width; // width needs to be set for Firefox (#941) dojo.html.setMarginBox(elm, { width: w, height: f.height }); f.width -= w; if(pos=="left"){ f.left += w; }else{ elm.style.left = f.left + f.width + "px"; } } else if(pos=="flood" || pos=="client"){ dojo.html.setMarginBox(elm, { width: f.width, height: f.height }); } // TODO: for widgets I want to call resizeTo(), but for top/bottom // alignment I only want to set the width, and have the size determined // dynamically. (The thinner you make a div, the more height it consumes.) if(child.onResized){ child.onResized(); } });};// This is essential CSS to make layout work (it isn't "styling" CSS)// make sure that the position:absolute in dojoAlign* overrides other classesdojo.html.insertCssText( ".dojoLayoutContainer{ position: relative; display: block; }\n" + "body .dojoAlignTop, body .dojoAlignBottom, body .dojoAlignLeft, body .dojoAlignRight { position: absolute; overflow: hidden; }\n" + "body .dojoAlignClient { position: absolute }\n" + ".dojoAlignClient { overflow: auto; }\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -