在调整容器大小时,我们的项目有一个情况。 似乎不可能保持元素边际的“自动”值。
例如,当尝试使用javascript或jquery获取边距值时,值始终返回0.我们确实需要在调整大小时保持“自动”,因此有没有办法确定哪些元素具有边距:auto;
即使可以使用原始javascript吗?
-----------------可能的解决方案,但需要扩展-----------------
我发现这很有用。这实际上解决了部分问题!
Retrieve element margin if it's 'auto'(答案3)
if($(this).position().left*2 == ($(this).parent().innerWidth() - $(this).outerWidth())) {
console.info($(this).attr('id'));
}
然而,这与许多元素相匹配,因此需要以某种方式更具体。 希望有人知道如何改进这段代码?
答案 0 :(得分:5)
编辑:我只在Chrome中测试了以下解决方案。它目前不在IE或Firefox中。当我开始工作时,我会提供更新。
编辑2 :Firefox解决方案:http://jsfiddle.net/E9eW6/8/。问题是每个浏览器以不同方式处理它们的CSSStyleDeclaration对象。虽然Firefox是可管理的,但是IE在某个地方出现了与CSSRuleStyleDeclaration相当的地方。我道歉,但我不了解微软的不良实施情况,也不会耐心等待将来可能发生变化。
经过对这个有趣问题的一些研究后,我找到了一个解决方案jsFiddle:http://jsfiddle.net/S5Sbf/3/
答案实际上是在Stackoverflow上的另一个问题:Can jQuery get all CSS styles associated with an element?(见第二个答案)
基本上,函数将遍历document.Stylesheets,寻找与你的元素相匹配的元素,并在一个漂亮的美味对象中返回它的所有CSS。
这是一个非常漂亮的功能,自豪地使用它!
function css(a){
var sheets = document.styleSheets, o = {};
for(var i in sheets) {
var rules = sheets[i].rules || sheets[i].cssRules;
for(var r in rules) {
if(a.is(rules[r].selectorText)) {
o = $.extend(o, css2obj(rules[r].style), css2obj(a.attr('style')));
}
}
}
return o;
}
function css2obj(css){
var s = {};
if(!css) return s;
if(css instanceof CSSStyleDeclaration) {
for(var i in css) {
if((css[i]).toLowerCase) {
s[(css[i]).toLowerCase()] = (css[css[i]]);
}
}
} else if(typeof css == "string") {
css = css.split("; ");
for (var i in css) {
var l = css[i].split(": ");
s[l[0].toLowerCase()] = (l[1]);
};
}
return s;
}
(第二回答中的使用详情:Can jQuery get all CSS styles associated with an element?)
使用上面的css函数:
$("*").each(function(index, element){
cssObj = css($(element));
$(element).after("margin-left is " + cssObj['margin-left'] + '<br/>');
$(element).after("margin-right is " + cssObj['margin-right'] + '<br/>');
$(element).after("margin-top is " + cssObj['margin-top'] + '<br/>');
$(element).after("margin-bottom is " + cssObj['margin-bottom'] + '<br/>');
});
答案 1 :(得分:1)
感谢Vigrond上面的回答。 我能够进一步研究CSS规则对象。
最后,我提出了自己的解决方案,直接从样式表中返回实际的CSS规则!这不仅解决了我对margin auto的问题,它还允许我返回jquery CSS对象未返回的所有其他css值。
虽然代码可以进一步优化。 我对结果非常满意,同时我添加了一个白名单,因为在我的情况下,没有必要遍历所有样式表。
以下是我最终的代码!
var cssObj = {};
function getStyle(element) {
var extractStyles = function(cssText) {
var css = {};
regEx = /\.*\{[^\}](.*)}/im;
styles = cssText.match(regEx)[1].split(';');
$.each(styles, function(k, style) {
$key = style.split(':')[0].trim();
$val = style.split(':')[1];
if($key != '')
css[$key] = $val.trim();
});
return css;
};
var sheets = document.styleSheets;
var whiteList = [
cssPath+'product.css',
cssPath+'style.css'
];
$.each(sheets, function(key, sheet) {
if($.inArray(sheet.href, whiteList) >=0) {
$rules = sheet.rules || sheet.cssRules;
$.each($rules, function(key, rule) {
if(element.is(rule.selectorText)) {
if(typeof(rule.cssText) != 'undefined' && rule.cssText) {
cssObj[rule.selectorText] = extractStyles(rule.cssText);
} else {
cssObj[rule.selectorText] = (typeof(rule.cssText) != 'undefined' ? extractStyles(rule.style.cssText) : '');
}
}
});
}
});
}
答案 2 :(得分:0)
$('.container').each(function(){
if($(this).css('margin') == 'auto'){
console.log($(this).attr('id')+' has margin auto');
}
});
但如果你发布一些代码或链接会更容易提供帮助
答案 3 :(得分:0)
您可以使用jQuery中的$(“*”)搜索对页面中的每个元素执行此操作
$("*").each(function(){
if($(this).css('margin') == 'auto'){
console.log($(this).attr('id')+' has margin auto');
}
});