IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[SRC] Savoir si un élément est visible à l'écran


Sujet :

Contribuez

  1. #1
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut [SRC] Savoir si un élément est visible à l'écran
    Bonjour,
    Voici un petit script qui permet de tester si un élément (repéré par son id) est visible à l'écran.
    Désolé pour le manque de commentaires, je n'ai pas encore eu le temps !!!
    Fonction estVisible pour tester si un élément passé en paramètre est visible à l'écran.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function estVisible(id_element){
    	var cadreVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0}, elementVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0};
    	var source = document.getElementById(id_element), sourceParent = source.offsetParent;
    	var total = {hauteur: false, largeur: false}, partiel = {hauteur: false, largeur: false};
    	cadreVisible.xMin = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    	cadreVisible.xMax = window.pageXOffset + window.innerWidth || document.documentElement.scrollLeft + document.documentElement.clientWidth || document.body.scrollLeft + document.body.clientWidth;
    	cadreVisible.yMin = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    	cadreVisible.yMax = window.pageYOffset + window.innerHeight || document.documentElement.scrollTop + document.documentElement.clientHeight || document.body.scrollTop + document.body.clientHeight;
    	elementVisible.xMin = source.offsetLeft;
    	elementVisible.yMin = source.offsetTop;
    	while(sourceParent) {
    		elementVisible.xMin += sourceParent.offsetLeft;
    		elementVisible.yMin += sourceParent.offsetTop;
    		sourceParent = sourceParent.offsetParent;
    	}
    	elementVisible.xMax = elementVisible.xMin + source.offsetWidth;
    	elementVisible.yMax = elementVisible.yMin + source.offsetHeight;
    	if(cadreVisible.xMin <= elementVisible.xMin && cadreVisible.xMax >= elementVisible.xMax){
    		total.largeur = true;
    	}
    	else if(!(cadreVisible.xMax < elementVisible.xMin || cadreVisible.xMin > elementVisible.xMax)){
    		partiel.largeur = true;
    	}
    	if(cadreVisible.yMin <= elementVisible.yMin && cadreVisible.yMax >= elementVisible.yMax){
    		total.hauteur = true;
    	}
    	else if(!(cadreVisible.yMax < elementVisible.yMin || cadreVisible.yMin > elementVisible.yMax)){
    		partiel.hauteur = true;
    	}
    	if(total.largeur && total.hauteur){
    		return(id_element + ' est entièrement visible dans la page !');
    	}
    	else if(total.largeur && partiel.hauteur){
    		return(id_element + ' est entièrement visible en largeur mais tronqué en hauteur');
    	}
    	else if(total.hauteur && partiel.largeur){
    		return(id_element + ' est entièrement visible en hauteur mais tronqué en largeur');
    	}
    	else if(partiel.hauteur && partiel.largeur){
    		return(id_element + ' est tronqué en hauteur et en largeur');
    	}
    	else{
    		return(id_element + ' n\'est pas visible dans la page !');
    	}
    }
    Utilisation
    La fonction prend donc en paramètre l'id d'un élément HTML, calcule la portion visible de la page, la position de l'élément dans la page et teste si la position est dans la partie visible.
    Elle renvoie une chaine de caractère indiquant si :
    • L'élément est entièrement visible
    • L'élément est visible partiellement (en hauteur et / ou largeur
    • L'élément n'est pas visible.

    Exemple d'intégration dans une page HTML
    Une page complète de test (faites défiler la page en hauteur et largeur et cliquez sur la page pour afficher le résultat) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Test</title>
    <style type="text/css">
    <!--
    body{
            width: 5000px;
            height: 2500px;
    }
    .test{
            position: relative;
            width: 500px;
            height: 250px;
            left: 1500px;
            top: 1000px;
            background-color: silver;
            text-align: center;
            border: 1px solid black;
    }
    -->
    </style>
    <script type="text/javascript"> 
    <!--// [CDATA[ 
    document.onclick=function(){alert(estVisible('test'))}
    function estVisible(id_element){
            var cadreVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0}, elementVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0};
            var source = document.getElementById(id_element), sourceParent = source.offsetParent;
            var total = {hauteur: false, largeur: false}, partiel = {hauteur: false, largeur: false};
            cadreVisible.xMin = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
            cadreVisible.xMax = window.pageXOffset + window.innerWidth || document.documentElement.scrollLeft + document.documentElement.clientWidth || document.body.scrollLeft + document.body.clientWidth;
            cadreVisible.yMin = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
            cadreVisible.yMax = window.pageYOffset + window.innerHeight || document.documentElement.scrollTop + document.documentElement.clientHeight || document.body.scrollTop + document.body.clientHeight;
            elementVisible.xMin = source.offsetLeft;
            elementVisible.yMin = source.offsetTop;
            while(sourceParent) {
                    elementVisible.xMin += sourceParent.offsetLeft;
                    elementVisible.yMin += sourceParent.offsetTop;
                    sourceParent = sourceParent.offsetParent;
            }
            elementVisible.xMax = elementVisible.xMin + source.offsetWidth;
            elementVisible.yMax = elementVisible.yMin + source.offsetHeight;
            if(cadreVisible.xMin <= elementVisible.xMin && cadreVisible.xMax >= elementVisible.xMax){
                    total.largeur = true;
            }
            else if(!(cadreVisible.xMax < elementVisible.xMin || cadreVisible.xMin > elementVisible.xMax)){
                    partiel.largeur = true;
            }
            if(cadreVisible.yMin <= elementVisible.yMin && cadreVisible.yMax >= elementVisible.yMax){
                    total.hauteur = true;
            }
            else if(!(cadreVisible.yMax < elementVisible.yMin || cadreVisible.yMin > elementVisible.yMax)){
                    partiel.hauteur = true;
            }
            if(total.largeur && total.hauteur){
                    return(id_element + ' est entièrement visible dans la page !');
            }
            else if(total.largeur && partiel.hauteur){
                    return(id_element + ' est entièrement visible en largeur mais tronqué en hauteur');
            }
            else if(total.hauteur && partiel.largeur){
                    return(id_element + ' est entièrement visible en hauteur mais tronqué en largeur');
            }
            else if(partiel.hauteur && partiel.largeur){
                    return(id_element + ' est tronqué en hauteur et en largeur');
            }
            else{
                    return(id_element + ' n\'est pas visible dans la page !');
            }
    }
    // ]] -->
    </script> 
    </head>
    <body onload="document.getElementById('test').scrollIntoView(false)">
    <div id="test" class="test">Div de test</div>
    </body>
    </html>
    Compatiblité
    Testé sur FF2, IE6 et IE7
    EDIT :
    Tests complémentaires sur FF3, Opera, Chrome et Safari concluants.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  2. #2
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Bonjour!!
    je suis debutant en javascripte ,et merci pour ce script,
    je veux que l'element d1 soit avec opacity=0 ,mais des qu'il est visible sur l'ecran l'opacity=1 , le probleme, c'est que je ne sais pas comment faire pour que ce changement d'opacity soit "slow" .

    style.css
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .d1{
    font-family:'Segoe UI';
    font-SIZE: 16px;
    color:#F2F9F7;
    float:right;
    margin-right:80px;
    margin-top: 50px;
    opacity:0;
    }

    index.html
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="d1" class="d1" rel="500">Contacte et rencontre clients</div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    var element=document.getElementById('d1');
    document.onscroll=function(){estVisible('d1')}
     
    function estVisible(id_element){
        var cadreVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0}, elementVisible = {xMin: 0, xMax: 0, yMin: 0, yMax: 0};
        var source = document.getElementById(id_element), sourceParent = source.offsetParent;
        var total = {hauteur: false, largeur: false}, partiel = {hauteur: false, largeur: false};
        cadreVisible.xMin = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
        cadreVisible.xMax = window.pageXOffset + window.innerWidth || document.documentElement.scrollLeft + document.documentElement.clientWidth || document.body.scrollLeft + document.body.clientWidth;
        cadreVisible.yMin = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
        cadreVisible.yMax = window.pageYOffset + window.innerHeight || document.documentElement.scrollTop + document.documentElement.clientHeight || document.body.scrollTop + document.body.clientHeight;
        elementVisible.xMin = source.offsetLeft;
        elementVisible.yMin = source.offsetTop;
        while(sourceParent) {
            elementVisible.xMin += sourceParent.offsetLeft;
            elementVisible.yMin += sourceParent.offsetTop;
            sourceParent = sourceParent.offsetParent;
        }
        elementVisible.xMax = elementVisible.xMin + source.offsetWidth;
        elementVisible.yMax = elementVisible.yMin + source.offsetHeight;
        if(cadreVisible.xMin <= elementVisible.xMin && cadreVisible.xMax >= elementVisible.xMax){
            total.largeur = true;
        }
        else if(!(cadreVisible.xMax < elementVisible.xMin || cadreVisible.xMin > elementVisible.xMax)){
            partiel.largeur = true;
        }
        if(cadreVisible.yMin <= elementVisible.yMin && cadreVisible.yMax >= elementVisible.yMax){
            total.hauteur = true;
        }
        else if(!(cadreVisible.yMax < elementVisible.yMin || cadreVisible.yMin > elementVisible.yMax)){
            partiel.hauteur = true;
        }
        if(total.largeur && total.hauteur){
            source.style.opacity=1;
            return(id_element + ' est entièrement visible dans la page !');
        }
        else if(total.largeur && partiel.hauteur){
            return(id_element + ' est entièrement visible en largeur mais tronqué en hauteur');
        }
        else if(total.hauteur && partiel.largeur){
            return(id_element + ' est entièrement visible en hauteur mais tronqué en largeur');
        }
        else if(partiel.hauteur && partiel.largeur){
            return(id_element + ' est tronqué en hauteur et en largeur');
        }
        else{
            return(id_element + ' n\'est pas visible dans la page !');
        }
    }
    alors si vous pouvez m'aidez, merci d'avance

Discussions similaires

  1. Savoir si mon élément est visible
    Par mapmip dans le forum jQuery
    Réponses: 9
    Dernier message: 16/12/2014, 13h55
  2. Savoir si un élément est affiché ou non
    Par romaintaz dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/04/2008, 15h43
  3. Savoir si un JPane est visible
    Par julien1311 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/07/2007, 17h38
  4. [MySQL] Savoir si un élément est déjà présent dans la table
    Par camzo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/12/2006, 17h46
  5. [Liste] Savoir si un élément est présent dans une liste
    Par Wookai dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/05/2005, 20h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo