1 2 3 4 5 |
.js-quick-view { ul.rollover-content.top.in li.rollover-item:first-child & { border: 4px solid red !important; } } |
Mois : avril 2018
[Bootstrap 3] Garder une popover ouverte lorsqu’on survole celle-ci avec la souris
Sources: How can I keep bootstrap popover alive while the popover is being hovered? et Live demo w/Plunker.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$(".pop").popover({ trigger: "manual" , html: true, animation:false}) .on("mouseenter", function () { var _this = this; $(this).popover("show"); $(".popover").on("mouseleave", function () { $(_this).popover('hide'); }); }).on("mouseleave", function () { var _this = this; setTimeout(function () { if (!$(".popover:hover").length) { $(_this).popover("hide"); } }, 300); }); |
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 |
<!DOCTYPE html> <html> <head> <link data-require="bootstrap-css@*" data-semver="3.2.0" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" /> <script data-require="jquery@*" data-semver="2.1.1" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script data-require="bootstrap@*" data-semver="3.2.0" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js"></script> <link rel="stylesheet" href="style.css" /> </head> <body> <h2 class='text-primary'>Another Great "KISS" Bootstrap Popover example!</h2> <p class='text-muted'>KISS = Keep It Simple S....</p> <p class='text-primary'>Goal:</p> <ul> <li>Open popover on hover event for the popover button</li> <li>Keep popover open when hovering over the popover box</li> <li>Close popover on mouseleave for either the popover button, or the popover box.</li> </ul> <button type="button" class="btn btn-danger pop" data-container="body" data-toggle="popover" data-placement="right" data-content="Optional parameter: Skip if this was not requested<br> A placement group is a logical grouping of instances within a single Availability Zone. Using placement groups enables applications to get the full-bisection bandwidth and low-latency network performance required for tightly coupled, node-to-node communication typical of HPC applications.<br> This only applies to cluster compute instances: cc2.8xlarge, cg1.4xlarge, cr1.8xlarge, hi1.4xlarge and hs1.8xlarge.<br> More info: <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html" target="_blank">Click here...</a>" data-original-title="" title=""> HOVER OVER ME </button> <br><br> <button type="button" class="btn btn-info pop" data-container="body" data-toggle="popover" data-placement="right" data-content="Optional parameter: Skip if this was not requested<br> A placement group is a logical grouping of instances within a single Availability Zone. Using placement groups enables applications to get the full-bisection bandwidth and low-latency network performance required for tightly coupled, node-to-node communication typical of HPC applications.<br> This only applies to cluster compute instances: cc2.8xlarge, cg1.4xlarge, cr1.8xlarge, hi1.4xlarge and hs1.8xlarge.<br> More info: <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html" target="_blank">Click here...</a>" data-original-title="" title=""> HOVER OVER ME... Again! </button><br><br> <button type="button" class="btn btn-success pop" data-container="body" data-toggle="popover" data-placement="right" data-content="Optional parameter: Skip if this was not requested<br> A placement group is a logical grouping of instances within a single Availability Zone. Using placement groups enables applications to get the full-bisection bandwidth and low-latency network performance required for tightly coupled, node-to-node communication typical of HPC applications.<br> This only applies to cluster compute instances: cc2.8xlarge, cg1.4xlarge, cr1.8xlarge, hi1.4xlarge and hs1.8xlarge.<br> More info: <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html" target="_blank">Click here...</a>" data-original-title="" title=""> Okay one more time... ! </button> <br><br> <p class='text-info'>Hope that helps you... Drove me crazy for a while</p> <script src="script.js"></script> </body> </html> |
[jQuery] Redimensionner automatiquement un element HTML Select en fonction de la largeur de l’Option sélectionnée
Source: Auto resizing the SELECT element according to selected OPTION’s width. Voir le jsFiddle ici.
1 2 3 4 5 6 7 8 |
<select id="resizing_select"> <option>All</option> <option>Longer</option> <option>A very very long string...</option> </select> <select id="width_tmp_select"> <option id="width_tmp_option"></option> </select> |
1 2 3 4 5 6 |
$(document).ready(function() { $('#resizing_select').change(function(){ $("#width_tmp_option").html($('#resizing_select option:selected').text()); $(this).width($("#width_tmp_select").width()); }); }); |
1 2 3 4 5 6 7 |
#resizing_select { width: 50px; } #width_tmp_select{ display : none; } |
Cas particulier: la page se recharge après sélection
Source: Persist variables between page loads.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
ACC.naosPagination.resizeSelectOnTheFly(); var sortOptionsWidth = sessionStorage.getItem('sortOptionsWidth'); $('#sortOptions1').width(sortOptionsWidth); sessionStorage.removeItem('sortOptionsWidth'); resizeSelectOnTheFly: function(){ $('#resizing_select').change(function(){ $("#width_tmp_option").html($('#resizing_select option:selected').text()); $(this).width($("#width_tmp_select").width()); var getWidth = ($('#resizing_select').width()) + 2; sessionStorage.setItem('sortOptionsWidth', getWidth+'px'); }); } |
[jQuery] Vérifier en cours de saisie en live si un input[type= »text »] contient du contenu avec l’événement Input et la méthode Val
Dans l’exemple qui suit, on procède à cette vérification pour désactiver une fonctionnalité de Collapse (Bootstrap) des champs de formulaires si du texte est saisi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<div class="form-group address-extra-info-trigger"> <span class="control-label"> <spring:theme code="address.line2"/> </span> <button id="triggerBillingAddressExtraInfo" class="btn-naked" type="button" data-toggle="collapse" data-target="#collapseBillingAddressExtraInfo" aria-expanded="false" aria-controls="collapseBillingAddressExtraInfo"> <span class="show-extra-fields"> <i class="glyphicon glyphicon-chevron-down"></i> <spring:theme code="naos.show"/></span> <span class="hide-extra-fields"> <i class="glyphicon glyphicon-chevron-up"></i> <spring:theme code="naos.hide"/></span> </button> </div> <div class="collapse address-extra-info-fields" id="collapseBillingAddressExtraInfo"> <input type="text" id="one" /> <input type="text" id="two" /> <input type="text" id="three" /> [...] </div> |
Si un seul champ à vérifier:
Si le champ qui a le focus n’est pas vide, on agit sur #triggerBillingAddressExtraInfo
en ajoutant un style inline pointer-events: none;
(qui désactive la possibilité de cliquer sur l’élément).
1 2 3 4 5 6 7 8 9 10 11 |
$('input').on('input', function(e){ var toto = $(this).val(); console.log(toto); if(!toto == ''){ $('#triggerBillingAddressExtraInfo').css('pointer-events', 'none'); } else{ $('#triggerBillingAddressExtraInfo').removeAttr('style'); } }); |
Si plusieurs champs à vérifier:
Sources: jQuery check if any text input has value et Detect changed input text box.
Si le champ qui a le focus n’est pas vide, on agit sur #triggerBillingAddressExtraInfo
en ajoutant un style inline pointer-events: none;
(qui désactive la possibilité de cliquer sur l’élément).
On ajoute la condition: si tous les champs au sein de #collapseBillingAddressExtraInfo
sont vides, on retire le style inline pointer-events: none;
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function hasValue(elem) { return $(elem).filter(function() { return $(this).val(); }).length > 0; } $('input', '#collapseBillingAddressExtraInfo').on('input', function(e){ var toto = $(this).val(); var titi = hasValue('#collapseBillingAddressExtraInfo input'); // console.log(toto); // console.log(titi); if(!toto == ''){ $('#triggerBillingAddressExtraInfo').css('pointer-events', 'none'); } else if(!titi == true) { $('#triggerBillingAddressExtraInfo').removeAttr('style'); } }); |
Mieux, avec deux fonctions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function hasValue(elem) { return $(elem).filter(function() { return $(this).val(); }).length > 0; } function deactivateCollapse(collapseElement, triggerElement){ $('input', collapseElement).on('input', function(e){ var focusedInputValue = $(this).val(); var inScopeInputsValues = hasValue(collapseElement+' input'); if(!focusedInputValue == ''){ $(triggerElement).css('pointer-events', 'none'); } else if(!inScopeInputsValues == true) { $(triggerElement).removeAttr('style'); } }); } deactivateCollapse('#collapseBillingAddressExtraInfo', '#triggerBillingAddressExtraInfo'); deactivateCollapse('#collapseDeliveryAddressExtraInfo', '#triggerDeliveryAddressExtraInfo'); |
[Bootstrap 3 et 4] Composant Collapse, la classe collapsed n’apparaît qu’après un premier affichage/masquage des éléments
Si toi aussi tu travailles encore avec Bootstrap en 2018 (ou +), tu t’es forcément retrouvé face à ce problème qui existait dans la version 3 de Bootstrap et est toujours présent dans la version 4: la classe collapsed
sur le lien ou le bouton qui va permettre d’afficher/masquer des éléments n’apparaît qu’après un premier affichage/masquage de ces dits éléments.
Fais le test sur les exemples qu’on retrouve dans les docs officielles : https://getbootstrap.com/docs/3.3/javascript/#collapse ou https://getbootstrap.com/docs/4.0/components/collapse/.
Il est d’ailleurs étonnant que personne ne leur ait jamais remonté ce bug… Peut-être parce que plus personne n’utilise Bootstrap en 2018 (ou +).
Solution #1
Pour solutionner notre problème, il suffit de mettre un setTimeout
javaScript quelque part dans tes sources pour délayer l’ajout dans le DOM de la classe collapsed
à l’affichage de la page. Oui: c’est sâle. Oui: c’est une vilaine câle en bois. Non: on n’aurait pas pu mettre la classe dans le code HTML car le code natif Bootstrap te la supprime illico. Oui: tu peux peut-être passer par les events proposés par l’api pour faire ça mieux, mais ça veut dire que tu ne peux pas utiliser les data-attributes
pour initier ton collapse.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<div class="form-group address-extra-info-trigger"> <span class="control-label"> <spring:theme code="address.line2"/> </span> <button id="triggerAddressExtraInfo" class="btn-naked" type="button" data-toggle="collapse" data-target="#collapseAddressExtraInfo" aria-expanded="false" aria-controls="collapseAddressExtraInfo"> <span class="show-extra-fields"> <i class="glyphicon glyphicon-chevron-down"></i> <spring:theme code="naos.show"/></span> <span class="hide-extra-fields"> <i class="glyphicon glyphicon-chevron-up"></i> <spring:theme code="naos.hide"/></span> </button> </div> <div class="collapse address-extra-info-fields" id="collapseAddressExtraInfo"> <p>bla bla bla toto...</p> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
.address-extra-info { &-trigger { .btn-naked { &.collapsed { .hide-extra-fields { display: none; } } &:not(.collapsed) { .show-extra-fields { display: none; } } } } } |
1 2 3 |
setTimeout(function(){ $('#triggerAddressExtraInfo').addClass('collapsed'); }, 500); |
Solution #2 (la meilleure)
Il est temps d’abandonner Bootstrap pour Foundation.
[javaScript] VideoJS – astuces et bonnes pratiques de mise en place
Centering the Big Ass Play Button in VideoJS
EDIT: ATTENTION, la méthode donnée dans ce lien n’est pas la bonne!!!
Il suffit, en effet d’ajouter la classe .vjs-big-play-centered
sur l’élément HTML video
.
Sous Edge la popin vidéo est écrasée
J’avais un height: 0px;
pour les sélecteurs .video-js.vjs-fluid, .video-js.vjs-16-9, .video-js.vjs-4-3
. Edge (jusqu’à 17 exclus) n’a pas aimé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@media (min-width: @screen-lg-min) { .edge-14, .edge-15, .edge-16 { #productDetailsVideoModal { .modal-body { height: 657px; } .main-preview-player { height: 657px - @grid-gutter-width; background-color: #1a1a1a; } } } .edge-14, .edge-15, .edge-16 { .video-js.vjs-fluid, .video-js.vjs-16-9, .video-js.vjs-4-3 { height: 100%; } } } |
[CSS] Masquer la scrollbar tout en permettant encore le scroll
Source: Hide scroll bar, but while still being able to scroll sur Stack Overflow
Sous Chrome:
…mais ne fonctionne pas sous Firefox ou Internet Explorer.
1 2 3 |
::-webkit-scrollbar { display: none; } |
Solutions universelles
Voir aussi plus bas dans le cas d’une iFrame. Voir le billet original sur Stack Overflow pour des liens vers des jsFiddle d’example.
1 2 3 4 5 6 7 8 9 10 11 12 |
#parent{ height: 100%; width: 100%; overflow: hidden; } #child{ width: 100%; height: 100%; overflow-y: scroll; padding-right: 17px; /* Increase/decrease this value for cross-browser compatibility */ } |
ou avec position: absolute;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#parent{ height: 100%; width: 100%; overflow: hidden; position: relative; } #child{ position: absolute; top: 0; bottom: 0; left: 0; right: -17px; /* Increase/Decrease this value for cross-browser compatibility */ overflow-y: scroll; } |
Cas d’une iFrame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
body.pageLabel--liste-de-naissance { .no-space { height: 100%; width: 100%; overflow: hidden; } iframe.js-rbschange-iframe { width: 100% !important; overflow-y: scroll; @media (min-width: @screen-md-min) { padding-right: 17px; /* Increase/decrease this value for cross-browser compatibility */ } } } #tplOneColumn { // un <div> englobant DANS l'iFrame overflow: hidden; } |