是否可以确定哪些元素具有自动保证金?

时间:2011-12-02 12:34:16

标签: jquery css

在调整容器大小时,我们的项目有一个情况。 似乎不可能保持元素边际的“自动”值。

例如,当尝试使用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'));
}

然而,这与许多元素相匹配,因此需要以某种方式更具体。 希望有人知道如何改进这段代码?

4 个答案:

答案 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');
      }
 });