【问题标题】:md-color set hover colormd-color 设置悬停颜色
【发布时间】:2016-09-20 06:30:29
【问题描述】:

我正在使用 Angular Material 1.* 组件,对此我感到非常高兴。

我想像普通md-colors 背景一样使用主题颜色设置悬停状态背景,但找不到任何有关如何设置悬停状态颜色的文档。

有谁知道这是否可行以及怎么做?

【问题讨论】:

    标签: angularjs angular-material


    【解决方案1】:

    我通过使用 md-colors 设置背景颜色并将其隐藏在另一个元素后面来创建一个解决方法。然后悬停状态使顶层透明,因此它看起来是一个动态设置的悬停状态! 在此处查看此答案:

    https://stackoverflow.com/a/46650109/4881971

    【讨论】:

      【解决方案2】:

      如果你查看角度材质库的colors.js文件,你会发现没有让我们配置悬停效果状态的选项:

           /**
         * @ngdoc directive
         * @name mdColors
         * @module material.components.colors
         *
         * @restrict A
         *
         * @description
         * `mdColors` directive will apply the theme-based color expression as RGBA CSS style values.
         *
         *   The format will be similar to our color defining in the scss files:
         *
         *   ## `[?theme]-[palette]-[?hue]-[?opacity]`
         *   - [theme]    - default value is the default theme
         *   - [palette]  - can be either palette name or primary/accent/warn/background
         *   - [hue]      - default is 500 (hue-x can be used with primary/accent/warn/background)
         *   - [opacity]  - default is 1
         *
         *   > `?` indicates optional parameter
         *
         * @usage
         * <hljs lang="html">
         *   <div md-colors="{background: 'myTheme-accent-900-0.43'}">
         *     <div md-colors="{color: 'red-A100', 'border-color': 'primary-600'}">
         *       <span>Color demo</span>
         *     </div>
         *   </div>
         * </hljs>
         *
         * `mdColors` directive will automatically watch for changes in the expression if it recognizes an interpolation
         * expression or a function. For performance options, you can use `::` prefix to the `md-colors` expression
         * to indicate a one-time data binding.
         * <hljs lang="html">
         *   <md-card md-colors="::{background: '{{theme}}-primary-700'}">
         *   </md-card>
         * </hljs>
         *
         */
        function MdColorsDirective($mdColors, $mdUtil, $log, $parse) {
          return {
            restrict: 'A',
            require: ['^?mdTheme'],
            compile: function (tElem, tAttrs) {
              var shouldWatch = shouldColorsWatch();
      
              return function (scope, element, attrs, ctrl) {
                var mdThemeController = ctrl[0];
      
                var lastColors = {};
      
                var parseColors = function (theme) {
                  if (typeof theme !== 'string') {
                    theme = '';
                  }
      
                  if (!attrs.mdColors) {
                    attrs.mdColors = '{}';
                  }
      
                  /**
                   * Json.parse() does not work because the keys are not quoted;
                   * use $parse to convert to a hash map
                   */
                  var colors = $parse(attrs.mdColors)(scope);
      
                  /**
                   * If mdTheme is defined up the DOM tree
                   * we add mdTheme theme to colors who doesn't specified a theme
                   *
                   * # example
                   * <hljs lang="html">
                   *   <div md-theme="myTheme">
                   *     <div md-colors="{background: 'primary-600'}">
                   *       <span md-colors="{background: 'mySecondTheme-accent-200'}">Color demo</span>
                   *     </div>
                   *   </div>
                   * </hljs>
                   *
                   * 'primary-600' will be 'myTheme-primary-600',
                   * but 'mySecondTheme-accent-200' will stay the same cause it has a theme prefix
                   */
                  if (mdThemeController) {
                    Object.keys(colors).forEach(function (prop) {
                      var color = colors[prop];
                      if (!$mdColors.hasTheme(color)) {
                        colors[prop] = (theme || mdThemeController.$mdTheme) + '-' + color;
                      }
                    });
                  }
      
                  cleanElement(colors);
      
                  return colors;
                };
      
                var cleanElement = function (colors) {
                  if (!angular.equals(colors, lastColors)) {
                    var keys = Object.keys(lastColors);
      
                    if (lastColors.background && !keys.color) {
                      keys.push('color');
                    }
      
                    keys.forEach(function (key) {
                      element.css(key, '');
                    });
                  }
      
                  lastColors = colors;
                };
      
                /**
                 * Registering for mgTheme changes and asking mdTheme controller run our callback whenever a theme changes
                 */
                var unregisterChanges = angular.noop;
      
                if (mdThemeController) {
                  unregisterChanges = mdThemeController.registerChanges(function (theme) {
                    $mdColors.applyThemeColors(element, parseColors(theme));
                  });
                }
      
                scope.$on('$destroy', function () {
                  unregisterChanges();
                });
      
                try {
                  if (shouldWatch) {
                    scope.$watch(parseColors, angular.bind(this,
                      $mdColors.applyThemeColors, element
                    ), true);
                  }
                  else {
                    $mdColors.applyThemeColors(element, parseColors());
                  }
      
                }
                catch (e) {
                  $log.error(e.message);
                }
      
              };
      
              function shouldColorsWatch() {
                // Simulate 1x binding and mark mdColorsWatch == false
                var rawColorExpression = tAttrs.mdColors;
                var bindOnce = rawColorExpression.indexOf('::') > -1;
                var isStatic = bindOnce ? true : STATIC_COLOR_EXPRESSION.test(tAttrs.mdColors);
      
                // Remove it for the postLink...
                tAttrs.mdColors = rawColorExpression.replace('::', '');
      
                var hasWatchAttr = angular.isDefined(tAttrs.mdColorsWatch);
      
                return (bindOnce || isStatic) ? false :
                  hasWatchAttr ? $mdUtil.parseAttributeBoolean(tAttrs.mdColorsWatch) : true;
              }
            }
          };
      
        }
      

      【讨论】:

        【解决方案3】:

        虽然css中不支持hover状态,但是可以用ng-mouseenter模拟,用angular来模拟mouseleave。

        类似于这些指令的组合应用于元素:

        md-colors="{backgroundColor: hover ? '{{$ctrl.theme}}-warn' : '{{$ctrl.theme}}-background'}"
        ng-mouseenter="hover = true"
        ng-mouseleave="hover = false"
        

        其中 $ctrl.theme 是您当前主题的字符串。通过在 $scope 中注册 hover 属性,您可以将其用作颜色的控制,以在 md-colors 指令中传递。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-08
          • 2012-12-29
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 2021-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多