使用Javascript

时间:2018-01-10 02:20:57

标签: javascript css

我想将以下CSS添加到元素 -

{min-height: calc(100% - 291px);
    min-height: -webkit-calc(100% - 291px);}

我想使用Javascript将此CSS添加到我的元素中。我的问题是,如何在不重写的情况下添加这两个值。

element.style.minHeight= "calc(100% - 291px)";
element.style.minHeight= "-webkit-calc(100% - 291px)"; // This should NOT overwrite the previous property.

我如何实现这一目标?谢谢!

4 个答案:

答案 0 :(得分:5)

您可以使用类添加样式。

.class1 {
   min-height: calc(100% - 291px);
   -webkit-min-height: calc(100% - 291px)
}

element.classList.add('class1')

答案 1 :(得分:1)

似乎你在寻找JavaScript的跨浏览器解决方案。从@Cecil回答的样式表类中添加类是个好主意。但是,如果你没有javascript,那么请尝试以下方法。

    import { Component, OnInit } from '@angular/core';
    import { Router, ActivatedRoute, ParamMap } from '@angular/router';
    import 'rxjs/add/operator/switchMap';
    import { StateService } from './state.service';
    import { State } from '../models/state';
    import { Params } from '@angular/router/src/shared';

    import { Observable } from 'rxjs/Observable';   


    @Component({
      selector: 'app-add',
      templateUrl: './add.component.html'
    })
    export class AddComponent implements OnInit {
      state$: Observable<State>;
      constructor(private route: ActivatedRoute,
        private router: Router,
        private stateService: StateService) { }

      ngOnInit() {    
        this.state$ = this.route.paramMap.switchMap((params: ParamMap) => this.stateService.getState(params.get('id')));    
      }    
}

如果您需要更多浏览器检测,请转到此处:How to detect Safari, Chrome, IE, Firefox and Opera browser?

答案 2 :(得分:1)

其他答案 - 虽然提供了各种工作 - 但缺乏关于“为什么”原始作品或如何“复制”JavaScript行为的细节。因此,这是避免推荐非转发兼容代码的直接答案。

首先,'重复CSS属性'技巧正常工作,因为现代CSS引擎将忽略属性,其值不可理解。

因此,原始代码可以语义编写如下(请注意,顺序是颠倒,因为CSS是last-valid-and-assigned-property-values wins ):

// assigns style property if value (-moz-calc..) is understood
element.style.minHeight = "-moz-calc(100% - 291px)";
if (element.style.minHeight === "") {
    // assigns style property if value (calc..) is understood
    element.style.minHeight = "calc(100% - 291px)";
}

也就是说, CSS min-height属性只有一个内联样式的值

更直接地,代码甚至可以在没有条件检查的情况下编写。也就是说,以下“作为”无效/不可理解的属性值不应导致更新

element.style.minHeight = "calc(100% - 291px)";
element.style.minHeight = "foo"; // min-height NOT updated

因此,我们可以编写原始的以下正常(注意“-webkit-”是第一个)CSS属性赋值阴影,如果/一旦浏览器支持,将应用'CSS标准'值:

// min-height set in webkit browser only
element.style.minHeight = "-webkit-calc(100% - 291px);";
// min-height set (reset in webkit) IF AND ONLY IF browser supports calc
element.style.minHeight = "calc(100% - 291px)";

如果希望获得“精确”的浏览器再现,可以通过直接分配样式属性来完成。 (在这种情况下,我将原始的CSS属性顺序保持不变。)

element.setAttribute("style",
  "min-height: calc(100% - 291px); min-height: -webkit-calc(100% - 291px);");

// Only *one* of these values was assigned to the CSS style element!
console.log(element.style.minHeight)

然而,使用样式表,即使是内联样式表,也是我的第一选择。

答案 3 :(得分:0)

您要求的是从JavaScript端设置样式,这样这些样式将是跨平台的。

首先,对于您的问题,设置两次相同的css属性;不,这是不可能的。简单地,dom元素的样式是具有一些键的对象,每个键都被赋予一些值。没有办法在一个对象中重复多次相同的键,类似于你正在寻找的;即minHeight的两个值。

您的问题背后的动机是确保从JavaScript设置的样式值在不同的浏览器上正常工作。事实上,我认为你不必担心。例如,在53之后的Firefox版本the -moz-calc() has been removed中。

假设您在分配某些值时仍然希望确定并支持该检查,那么您需要检查浏览器前缀;即moz-用于firefox,o-用于opera,webkit用于chrome,等等 以下是一个例子。检查前缀来自link

我知道你知道如何从css为你的元素设置跨浏览器样式,这是一种理想的方式。但是,正如我所看到的,您对使用JavaScript更感兴趣。

var prefix = (function () {
  var styles = window.getComputedStyle(document.documentElement, ''),
    pre = (Array.prototype.slice
      .call(styles)
      .join('') 
      .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])
    )[1];

  return ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1];
})();

然后您可以按如下方式设置元素属性

element.style.minHeight= previx + "-calc(100% - 291px)"