Test la css en javascript - Les cours javascript

Introduction

Infos

Il existe une technique qui consiste à mettre en javascript dans l'attribut class de la balise un nom de propriété CSS et de le préfixer par no- quand cette dernière n'est pas reconnue par le navigateur.
Cette technique vous permet en CSS de prévoir les deux cas, le cas où la propriété est reconnue et le cas où la propriété n'est pas reconnue.

Code CSS :
.propriete #moblock{}
.no-propriete #moblock{}

Par exemple, nous voulons tester la propriété css . Voici le code HTML de la balise HTML au départ :

Code HTML :
<html class="">

Si après nos tests javascript la propriété css est reconnue on obtient :

Code HTML :
<html class="boxsizing">

sinon :

Code HTML :
<html class="no-boxsizing">

Vous devrez avoir dans votre feuille de style :

Code CSS :
.boxsizing #moblock{}
.no-boxsizing #moblock{}

Fonction pour ajouter à l'attribut class

Voici, un exemple de fonction qui va vous permettre d'ajouter une propriété dans l'attribut class de la balise .

La fonction addClass accepte comme paramètres :

  • sPropriete, valeur de type String qui représente est le nom de la propriété.
  • bTest, valeur de type Boolean, pour la valeur false la propriété sera préfixée de 'no-'.
La fonction Javascript :
function addClass(sPropriete, bTest){
  var sPropriete = sPropriete.toLowerCase(),
  sNewClass = (bTest ? '' : 'no-') + sPropriete,
  bFind=false,
  aPropExist = document.documentElement.className.split(' ');

  for (var i in aPropExist) {
    if(bTest){
      if(aPropExist[i] == sPropriete){bFind=true;break;}
      else if(aPropExist[i] == 'no-'+sPropriete){ aPropExist[i] = sPropriete;bFind=true;break;}
    }else{
      if(aPropExist[i] == sNewClass){bFind=true;break;}
      else if(aPropExist[i] == sPropriete){ aPropExist[i] = 'no-'+sPropriete;bFind=true;break;}
    }
  }

  if(!bFind){ aPropExist.push(sNewClass); }

  document.documentElement.className = aPropExist.join(' ');

}

Les tests des propriétés en javascript

box-sizing CSS

La propriété CSS n'est pas reconnue par tous les navigateurs. Il est donc nécessaire à mon avis de pouvoir proposer une alternative.

Dans cette fonction, nous testons aussi les propriétés préfixées telles que ou .
Et si on est en compatMode supérieur à Internet Explorer 7.

La fonction boxSizingTest renvoi une valeur de type Boolean :
- true, la propriété box-sizing ou une de ses versions préfixées est comprise,
- false, la propriété box-sizing et ses versions préfixées se sont pas comprises,

La fonction Javascript :
function boxSizingTest(){
  var aJsPre = ('Webkit Moz O ms').split(' '),
  sjPro = 'boxSizing',
  aJsCssPre = (sjPro + ' ' + aJsPre.join(sjPro + ' ') + sjPro).split(' ');
  docElement = document.documentElement,
  myDiv = document.createElement('div');
    for (var i in aJsCssPre) {
      var sProp = aJsCssPre[i];
      if (myDiv.style[sProp] !== undefined && (document.documentMode === undefined || document.documentMode > 7)) {
        return true;
      }
    }	
  return false;
}

addClass('boxsizing', boxSizingTest());

Le code CSS :
.boxsizing #moblock{}
.no-boxsizing #moblock{}

Résultat :

box-shadow CSS

La propriété CSS n'est pas reconnue par tous les navigateurs. Il est donc nécessaire à mon avis de pouvoir proposer une alternative.

Dans cette fonction, nous testons aussi les propriétés préfixées telles que ou .
Et si on est en compatMode supérieur à Internet Explorer 7.

La fonction boxShadowTest renvoi une valeur de type Boolean :
- true, la propriété box-shadow ou une de ses versions préfixées est comprise,
- false, la propriété box-shadow et ses versions préfixées se sont pas comprises,

La fonction Javascript :
function boxShadowTest(){
  var aJsPre = ('Webkit Moz O ms').split(' '),
  sjPro = 'boxShadow',
  aJsCssPre = (sjPro + ' ' + aJsPre.join(sjPro + ' ') + sjPro).split(' ');
  docElement = document.documentElement,
  myDiv = document.createElement('div');
    for (var i in aJsCssPre) {
      var sProp = aJsCssPre[i];
      if (myDiv.style[sProp] !== undefined && (document.documentMode === undefined || document.documentMode > 7)) {
        return true;
      }
    }	
  return false;
}

addClass('boxshadow', boxShadowTest());

Le code CSS :
.boxshadow#moblock{}
.no-boxshadow#moblock{}

Résultat :

border-radius CSS

La propriété CSS n'est pas reconnue par tous les navigateurs. Il est donc nécessaire à mon avis de pouvoir proposer une alternative.

Dans cette fonction, nous testons aussi les propriétés préfixées telles que ou .
Et si on est en compatMode supérieur à Internet Explorer 7.

La fonction borderRadiusTest renvoi une valeur de type Boolean :
- true, la propriété border-radius ou une de ses versions préfixées est comprise,
- false, la propriété border-radius et ses versions préfixées se sont pas comprises,

La fonction Javascript :
function borderRadiusTest(){
  var aJsPre = ('Webkit Moz O ms').split(' '),
  sjPro = 'borderRadius',
  aJsCssPre = (sjPro + ' ' + aJsPre.join(sjPro + ' ') + sjPro).split(' ');
  docElement = document.documentElement,
  myDiv = document.createElement('div');
    for (var i in aJsCssPre) {
      var sProp = aJsCssPre[i];
      if (myDiv.style[sProp] !== undefined && (document.documentMode === undefined || document.documentMode > 7)) {
        return true;
      }
    }	
  return false;
}

addClass('borderradius', borderRadiusTest());

Le code CSS :
.borderradius#moblock{}
.no-borderradius#moblock{}

Résultat :

content CSS

La génération de texte avec la propriété CSS via le sélecteur ou n'est pas reconnue par tous les navigateurs. Il est donc nécessaire à mon avis de pouvoir proposer une alternative.

Exemple de code :
SELECTEUR:after{content:"texte";}

La fonction textContent renvoi une valeur de type Boolean :
- true, la génération de texte avec content est comprise,
- false, la génération de texte avec content n'est pas comprise,

La fonction Javascript :
function textContent(){
  var sStyle ='<style id="textContentcss">#textContent{font:0/0 a}#textContent:after{content:"(!)";font:3px/1 a}</style>',
  bool=false,
  docElement = document.documentElement,
  myDiv = document.createElement('div');
  myDiv.id = 'textContent';
  docElement.appendChild(myDiv);
  myDiv.innerHTML += sStyle;
  bool = myDiv.offsetHeight >= 3;
  docElement.removeChild(myDiv);
  return bool;
}

addClass('contenttext', textContent());

Le code CSS :
.contenttext#moblock{}
.no-contenttext#moblock{}

Résultat :