【问题标题】:accessing pseudo-element property values through getComputedStyle in dartdart 中通过 getComputedStyle 访问伪元素属性值
【发布时间】:2014-07-15 10:22:12
【问题描述】:

我希望检测哪些媒体查询处于活动状态 - 我正在使用 Bootjack,因此我使用的是默认断点

我希望能够在下面的示例中使用getComputedStyle() 来获取“内容”属性的值——但我似乎没有正确理解语法。我可以很高兴地得到一个元素的值——比如 body 上的 font-famly,而不是伪元素......

这是我正在做的事情:

鉴于这个 css..

/* tablets */
@media(min-width:768px){
     body::after {
        content: 'tablet';
        display: none;
    }

}

@media(min-width:992px){
     body::after {
        content: 'desktop';
        display: none;
    }

}
@media(min-width:1200px){
   body::after {
        content: 'large-screen';
        display: none;
    }
 } 

我的飞镖文件中有这个:

String activeMediaQuery = document.body.getComputedStyle('::after').getPropertyValue('content');

但 activeMediaQuery 始终为空。

我尝试过 ('after') 和 (':after') 以及其他任何奇怪而美妙的方法,但都无济于事。

String activeMediaQuery = document.body.getComputedStyle().getPropertyValue('font-family');

将变量 activeMediaQuery 设置为我正在使用的字体系列的值(不过对我来说用处不大!)

我该怎么办?

【问题讨论】:

    标签: dart pseudo-element getcomputedstyle


    【解决方案1】:

    您还可以订阅 MediaQuery 更改事件

    更多详情见https://github.com/bwu-dart/polymer_elements/blob/master/lib/polymer_media_query/polymer_media_query.dart

    Dart 中有一个错误,解决方法是使用 dart-js-interop。

    这是来自 polymer-media-query 元素的代码。我不知道 cmets not suppored in Dart yet 是否仍然有效。我已经尝试了几个月了。

    这是一个展示如何使用该元素的示例页面。 https://github.com/bwu-dart/polymer_elements/blob/master/example/polymer_media_query.html

      var _mqHandler;
      var _mq;
    
      init() {
        this._mqHandler = queryHandler;
        mqueryChanged(null);
    
        if (_mq != null) {
          if(context['matchMedia'] != null) {
            _mq.callMethod('removeListener', [_mqHandler]);
          }
          // TODO not supported in Dart yet (#84)
          //this._mq.removeListener(this._mqHandler);
        }
    
        if (mquery == null || mquery.isEmpty) {
          return;
        }
    
        if(context['matchMedia'] != null) {
          _mq = context.callMethod('matchMedia', ['(${mquery})']);
          _mq.callMethod('addListener', [_mqHandler]);
          queryHandler(this._mq);
        }
        // TODO not supported in Dart yet (#84)
        // Listener hast to be as MediaQueryListListener but this is and abstract 
        // class and therefor it's not possible to create a listner
        // _mq = window.matchMedia(q);
        // _mq.addListener(queryHandler);
        // queryHandler(this._mq);
      }
    
      void queryHandler(mq) {
        queryMatches = mq['matches'];
        //fire('polymer-mediachange', detail: mq);
      }
    

    这适用于您在问题中提供的 CSS,但仅当窗口宽于 768 像素时。您可能会错过max-width: 768px 的规则

    import 'dart:html' as dom;
    
    void main () {
      dom.window.onResize.listen((e) {
        var gcs = dom.document.body.getComputedStyle('::after');
        print(gcs.content);
      });
    }
    

    【讨论】:

    • 天哪,这是一个飞跃 - 它表明我可以通过在聚合物媒体查询标签中包装 img 标签来根据媒体查询交换不同大小的图像 - 我读对了吗?如果是这样,所有图像都会在准备中加载 - 重点是默认情况下从小图像开始,以便为移动用户节省带宽。
    • 您不需要包装每个图像,但您可以创建一个媒体感知图像标签,该标签订阅放置在某处的一个聚合物媒体查询元素的 on-media-change-event页面,或者您可以将上面的代码直接合并到媒体感知图像标签中,并相应地更新src 属性。
    • 我仍然无法访问伪元素 - 虽然我正在按照您的建议使用数据绑定来实现我的目标,但作为一个学习者,我无法做到docs - 我假设第二个代码块是对我的问题的直接回应并且独立,不依赖于聚合物元素或相关代码 - 使用它或我的原始代码我可以访问元素的任何属性,但是不是 ::after 或 ::before 等的属性。
    • 暂时坚持原来的问题......关于删除'display:none;'原始代码有效-尽管显示了内容-我似乎发现,就像您一样,跳过了768px-我想我可以找到另一个不会搞砸的属性,但是为什么没有显示意味着它可以访问Dart ?
    • 我不认为有什么被跳过了。您需要使用max-with: 768min-with: 0 添加规则
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2016-01-01
    • 2017-05-17
    • 2016-02-25
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多