5568 sujets

Sémantique web et HTML

Bonjour
je rencontre un problème.
J'ai trouvé une création sympa pour créer une fenetre modale en html5 et css3 qui n'utilise pas de javascript à cette adresse http://www.webdesignerdepot.com/2012/10/creating-a-modal-window-with-html5-and-css3/

Mon problème c'est que je n'arrive pas à l'adapter pour que la fenetre s'ouvre toute seule à l'ouverture de la page.
Merci de votre aide

Je mets le code et le css dessous.

<a href="#openModal">Open Modal</a>
<div id="openModal" class="modalDialog">
	<div>
		<a href="#close" title="Close" class="close">X</a>
		<h2>Site en construction</h2>
		<p>Nous effectuons une mise à niveau de notre site Internet. Certaines pages peuvent être indisponibles.La page de contact reste disponible. Veuillez nous excuser pour le dérangement.</p>
		<p>Cliquez sur la croix pour fermer cette fenêtre.</p>
	</div>
</div>


.modalDialog {
	position: fixed;
	font-family: Arial, Helvetica, sans-serif;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0px;
	background: rgba(0,0,0,0.8);
	z-index: 99999;
	opacity: 0;
	-webkit-transition: opacity 400ms ease-in;
	-moz-transition: opacity 400ms ease-in;
	transition: opacity 400ms ease-in;
	pointer-events: none;
}
.modalDialog:target {
	opacity:1;
	pointer-events: auto;
}

.modalDialog > div {
	width: 400px;
	position: relative;
	margin: 10% auto;
	padding: 5px 20px 13px 20px;
	border-radius: 10px;
	background: #fff;
	background: -moz-linear-gradient(#fff, #999);
	background: -webkit-linear-gradient(#fff, #999);
	background: -o-linear-gradient(#fff, #999);
}
.close {
	background: #606061;
	color: #FFFFFF;
	line-height: 25px;
	position: absolute;
	right: -12px;
	text-align: center;
	top: -10px;
	width: 24px;
	text-decoration: none;
	font-weight: bold;
	-webkit-border-radius: 12px;
	-moz-border-radius: 12px;
	border-radius: 12px;
	-moz-box-shadow: 1px 1px 3px #000;
	-webkit-box-shadow: 1px 1px 3px #000;
	box-shadow: 1px 1px 3px #000;
}


.close:hover {
	background: #00d9ff;
}

Modifié par philllou (03 Mar 2014 - 13:23)
Salut,

Il faut utiliser Javascript (ou jQuery) pour déclencher un événement

Avec Javscript :

window.onload=function(){
        getElementsByClassName('.modalDialog').style.display = 'block';
    }


Avec jQuery :

$(document).ready(function() {
        $('.modalDialog').show();
    });


Après à vérifier car je ne suis pas un AS avec JS ou jQuery...
oui mais là justement le but c'est de ne se servir que de html5 et css3.

J'ai trouvé une solution pour faire apparaitre la fenêtre modale:
supprimer la ligne <div id="openModal" class="modalDialog">

et dans le css dans .modalDialog passer l'opacité à 1.

La fenêtre modale s'ouvre bien automatiquement mais ensuite refuse de se fermer lorqu'on clique sur la croix.

Je suis un peu paumé là je dois dire...

Merci par avance pour votre aide!
Si je comprends bien l'exemple donné sur le site, il suffit que la page soit ouverte directement sur l'ancre pour que la boîte s'affiche immédiatement.


Par contre, ce truc me fait doucement rigoler, pour deux raisons :
1 - Ce n'est pas véritablement accessible... sur leur démo, avec mon lecteur d'écran, même sous firefox 27, je vois la popup d'entrée sous le lien sans avoir rien touché. Si c'est une popup pour se logger on s'en fout, mais si le but est d'afficher un message d'erreur, c'est pas terrible. En théorie, je ne suis pas censé la voir tout de suite, d'autant plus que pointer-event lui je crois qu'il fonctionne (j'ai des parties que je vois mais qui sont non réactives). Pour que ça soit accessible, je suis d'avis qu'il doit manquer du display:none/block quelque part en plus de leur truc sur l'opacité. Ou alors :target ne marche pas avec firefox 27, dans ce cas j'ai peut-être dit n'importe quoi.
2 - « Boîte de dialogue modale » est ici un terme particulièrement mal employé. C'est une fausse popup sous forme de div, rien de plus. Sur le web, on crée des vraies boîtes de dialogue modales en javascript avec la fonction window.showModalDialog (fonction que tout le monde croit à tort comme étant spécifique à IE . Mais ce n'est pas le cas d'après la MDN (IE4/FX3/Safari5, ça fait déjà 75% du monde et je ne pense pas que Chrome soit passé à côté).
Tous ceux qui utilisent le terme sans utiliser cette fonction javascript font faux, ils ne créent pas des boîtes de dialogue modales, mais des vulgaires fausses popup à base de div.
Modifié par QuentinC (03 Mar 2014 - 16:11)
Bonjour philllou,

En effet il est inutile d'utiliser du JS pour réaliser les animations puisque le CSS s'en occupe.
Par contre pour simuler une action de souris (ici le clic sur <a href="#openModal" />) au chargement de la page, le JS devient indispensable.

La solution reste très simple, ajouter un attribut onLoad au <body /> :
<body onload="window.location.href = '#openModal';">
...
</body>
Ce code va pointer l'élément <div id="openModal" class="modalDialog" />, et du coup déclencher la propriété CSS suivante :
.modalDialog:target {
    opacity:1;
    pointer-events: auto;
}
Vous avez à disposition l'exemple en ligne : http://codepen.io/guiwint/pen/odwar

Dernier point : attention à l'incompatibilité avec les anciennes générations de navigateurs (http://caniuse.com/#feat=css-transitions).

Espérant que la solution vous convienne. Bon code...
Modifié par Guiwint (03 Mar 2014 - 18:28)
Trop fort!
Alors là chapeau! j'ai passé qq heures dessus cet aprem et j'ai bien cru que j'allais manger mon chapeau! Smiley cligne
Résultat parfait!
Merci encore!
a écrit :
Par contre pour simuler une action de souris (ici le clic sur <a href="#openModal" />) au chargement de la page, le JS devient indispensable.

Mais non ! Pas besoin de js ! Pourquoi ne pas tout simplement faire pointer le lien ou la redirection qui mène à la page directement sur l'ancre ?
<a href="page.html#modalDialog">Aller à la page magique</a>

ou bien
header("Location:page.html#modalDialog");

selon le contexte.
Rediriger côté serveur sur une ancre j'ai déjà testé, ça fonctionne; je m'en sers pour envoyer directement sur les messages d'erreur à la soumission d'un formulaire.
Ca a un effet bonus, un lecteur d'écran commencera la lecture immédiatement au bon endroit.

Pourquoi faire simple quand on peut compliquer inutilement ?
Modifié par QuentinC (03 Mar 2014 - 19:57)
Merci philllou,
Si la solution vous va, alors tout va Smiley biggrin

Et sinon vous avez tout à fait raison QuentinC, dans ce cas précis, j'ai été excessif en écrivant que "le JS devient indispensable". Le terme "le JS devient une alternative plausible" serait plus approprié pour ne pas circonscrire le problème avec qu'une seule solution.

Je suis tout à fait en accord avec le principe des compléments d'informations et/ou des contre-exemples. C'est la nature même du développement informatique : il est rare que nous soyons limités dans ce domaine à un seul chemin pour atteindre nos objectifs.

Par contre, si vous me le permettez, je vais revenir sur le "Mais non ! Pas besoin de js !..." sans formulation courtoise d'accueil, et sur le "Pourquoi faire simple quand on peut compliquer inutilement ?", formules qui me semblent quelque peu... abusives Smiley decu .

La solution proposée ici à philllou est définie par deux éléments essentiels :

1. L'écoute du contexte

- La question est posée dans le forum Sémantique web et HTML, XHTML, HTML5 et non dans celui du Développement web côté serveur, et ne fait aucune mention d'une approche PHP.
- Les fichiers sources sont dans le cadre exclusif du HTML & CSS.
- Est proscrit toute réflexion avec librairie JS puisque l'on ne parle ni de jQuery, de MooTools ou d'autres sources JS.

2. Une réponse efficiente au besoin

- Une explication claire de la solution.
- Un exemple concret réexploitable.
- Une mise en oeuvre en un minimum de copier/coller (dans ce cas un seul).

Il me semble que cette unique ligne window.location.href = '#openModal'; répond à tous ces critères.
QuentinC a écrit :
Pourquoi ne pas tout simplement faire pointer le lien ou la redirection qui mène à la page directement sur l'ancre ?
... Oui, c'est ce que fait window.location.href = '#openModal';.
QuentinC a écrit :
header("Location:page.html#modalDialog");
... Oui, c'est ce que fait window.location.href = '#openModal';,
et non avec #modalDialog, et en permettant un pointage relatif (pas besoin de spécifier une page .html ou .php), et en évitant l'insertion d'un 3ème langage, et en faisant aussi apparaître le #openModal dans l'URL.
QuentinC a écrit :
L'accessibilité, c'est aussi savoir rester simple et ne pas compliquer plus que nécessaire.
Luttons pour une utilisation saine, raisonnée et non abusive de javascript et d'AJAX.
...Cette solution n'est-elle pas dans ce cadre ?

Alors QuentinC, aviez-vous proposé ici des solutions concrètes liées à des exemples fonctionnels ? Smiley langue

En conclusion :
Un bon exemple pédagogique de code en ligne vaut mieux que toutes digressions philosophiques (Oups !... C'est ce que je viens de faire...).
Tout le monde y gagne en temps et en clarté... Smiley murf

Bonne soirée à tous, et bon code...
Modifié par Guiwint (04 Mar 2014 - 08:08)
Merci Guiwint.
Je passe ce sujet en résolu.
J'ai particulièrement apprécié votre écoute et votre clarté ainsi que votre lisibilité.
J'adhère à votre exposition de la méthode qui est définie en 2 parties:
1. L'écoute du contexte
2. Une réponse efficiente au besoin

Je remercie également QuentinC qui bien que ne répondant pas à mes attentes a eu l'attention de consacrer un peu de temps à mon problème.

Cordialement.
Je vais te donner une réponse honnête, je trouve que ta solution avec window.href est mauvaise voire même stupide.

Pourquoi :
Je défends l'idée que le javascript devrait être utilisé aussi rarement que possible, quand il n'y a pas d'autre alternative intéressante. Au jour d'aujourd'hui, on met du js partout et souvent pour n'importe quoi à mon avis. Alors oui, pour certaines choses c'est juste génial et totalement indispensable, pour un chat ou un jeu par exemple. Dans d'autres, c'est complètement justifié et utile, quand on fait de la vérification de formulaire intelligente par exemple. Mais dans plein d'autres cas, je trouve ça totalement ridicule et inutile. Remplacer tout un site en navigation classique par une navigation AJAX ? C'est une perte de temps, ça demande de vérifier deux fois plus de choses, et il y a 10 fois plus de risques de bugs. Et pourtant ça se fait de plus en plus. Sans compter tous les problèmes inhérants au référencement et à l'accessibilité. Pour cette dernière, sur les pages statiques ce n'est pas si mal, ça commence à rentrer si on exclut les gros lourds du marché. Mais dès qu'on touche au js, bizarrement, tout le monde a tout oublié et c'est la jungle. Bravo aux usines à gaz genre JQuery, qui maintiennent (bien malgré eux) cet état, en passant.

Pour une fois que quelqu'un avait trouvé un moyen de faire quelque chose d'assez bien vu sans recourir à js (malheureusement pas encore compatible partout, là-dessus tu marques un très très gros point), je trouve que c'est fort dommage de vouloir en rajouter, d'autant plus que la solution pour ne pas en utiliser était assez évidente. Alors certes, ton window.href fait la même chose qu'un lien ou une redirection, mais c'est justement en cela que je le trouve complètement idiot: ça revient à ce que j'ai déjà dit, pourquoi faire simple quand on peut compliquer ? Attention, j'ai pas dit nécessairement simple pour le développeur, mais simple pour le client.

Ah, et en parlant de risques de bugs potentiels, ton joli window.href sur le onload risque de provoquer une magnifique boucle infinie de rechargements sur certains navigateurs. Chez certains, envoyer vers une ancre rechargera effectivement la page et redéclenchera onload !

Quant à proposer des solutions prêtes à copier-coller, ce n'est pas un bon service. Le copier-coller est l'ennemi n°1 du programmeur, disait cet autre. En tout cas il invite à utiliser du code sans réfléchir à ce que ça fait vraiment, et c'est, je pense, une des raisons pourquoi malgré l'existance de normes, de documentations et de tutoriels très bien rédigés qui expliquent comment bien faire, on continue de reproduire encore et toujours les mêmes bêtises, les mêmes erreurs, et qu'on est pas capable de les résoudre.

Sur ce, je te souhaite une bonne journée.
Merci encore philllou
et bonne continuation.

Bonjour QuentinC,

Vous êtes tout à fait en droit de ne pas être d'accord avec les solutions que je propose, et c'est toujours intéressant d'avoir un autre regard alternatif à une situation donnée.
Comme disait Maslow "J'imagine qu'il est tentant, si le seul outil que vous avez est un marteau, de traiter tout problème comme si c'était un clou".

Je vous rejoins aussi sur le principe d'utiliser le JS avec parcimonie : il faut que l'exploitation d'un langage serve l'expérience utilisateur, mais pas au détriment de l'accessibilité.
Or vous le savez tout aussi bien que moi, avoir des sites et des contenus accessibles demandent un bagage technique, une vision globale du développement web et une formation allant au delà de l'amateur, même éclairé (pour la France, le Référentiel AccessiWeb 2.2 contient 133 critères tout de même, et le Référentiel Général d’Accessibilité pour les Administrations RGAA en contient 187).

On en revient encore aux solutions proposées en fonction du contexte.

Par contre au niveau technique...
QuentinC a écrit :
...ton joli window.href sur le onload risque de provoquer une magnifique boucle infinie de rechargements sur certains navigateurs. Chez certains, envoyer vers une ancre rechargera effectivement la page et redéclenchera onload !
...je suis surpris que le window.location.href = '#openModal'; puisse faire un rechargement de page.

Il n'y a pas de fichier .html ou .php visé, mais uniquement une ancre, ce qui ne devrait pas déclencher de nouvel appel. Auriez-vous s'il vous plaît la possibilité de me donner les références des navigateurs qui créeraient ce problème afin que je puisse ajuster ma solution proposée ? Ce problème ne devrait-il pas faire l'objet d'un autre sujet dans le forum ?

En vous remerciant encore par avance.
Cordialement.
Modifié par Guiwint (04 Mar 2014 - 15:13)
a écrit :
Il n'y a pas de fichier .html ou .php visé, mais uniquement une ancre, ce qui ne devrait pas déclencher de nouvel appel. Auriez-vous s'il vous plaît la possibilité de me donner les références des navigateurs qui créeraient ce problème afin que je puisse ajuster ma solution proposée ?

Je n'ai plus d'exemple exact où ça se produit, mais ça m'est déjà arrivé avec IE...
Bonjour,
je suis aussi d'accord avec Quentin pour le risque de lancer ton navigateur en orbite et de finir par avoir une boite de dialogue genre, "un script pose problème sur la page, voulez-vous continuez a l'executer ?" ... dans le meilleur des pires cas Smiley smile

Tu pourrais simplement passé ta boite modale en simple et joli encart dans ta page et t'appuyer sur du javascript pour la passer en modale avec la possibilité de la fermer.

Ou si tu tiens a faire sans js, tu peut te servir du selecteur :not() comme d'un filtre afin de laisser ta boite modal dans le flux pour les plus vieux navigateur : à tester avec différents navigateur : http://codepen.io/gc-nomade/pen/FjJih (mode editeur) et http://codepen.io/gc-nomade/full/FjJih (mode pleine page).
++

<edit> , si je suis d'accord , c'est que j'ai le même témoignage avec d'ancienne version de IE ... et autre navigateur par le passé avec un simple clique sur une ancre et parfois un cache navigateur mis a zéro volontairement dans FF 2/3x , depuis je laisse un peu de place dans le cache Smiley smile
Modifié par gc-nomade (05 Mar 2014 - 21:27)
Bonjour à tous.

Merci QuentinC de ton retour.

... tant pis, nous allons laisser du suspens avant de rencontrer un jour ce problème sur IE, et enfin connaitre la version en cause.

Bonne journée et bon code...
a écrit :
[...] finir par avoir une boite de dialogue genre, "un script pose problème sur la page, voulez-vous continuez a l'executer ?" ... dans le meilleur des pires cas

Dans ce genre de cas en pluss la fameuse boîte n'apparaîtrait pas je pense; elle n'apparaît que quand il y a un script qui tourne en boucle sur la même page.

a écrit :
... tant pis, nous allons laisser du suspens avant de rencontrer un jour ce problème sur IE, et enfin connaitre la version en cause.

Par contre je suis sûr d'une chose, ça ne le fait plus depuis au moins IE9.