Je travaille sur un design réactif. J'ai heurté un mur avec un espace insuffisant pour une boîte input
et c'est label
. J'ai donc décidé de masquer l'étiquette sur des tailles d'écran plus petites.
À l'heure actuelle, il contient le texte de substitution your email
, mais je veux uniquement sur les écrans de moins de 400 (donc jusqu'à 399 pixels de large) d'un espace réservé différent de Join our newsletter
.
Je pense qu'il faudra un certain JS pour le faire, plutôt que tout ce qui est en CSS.
Essentiellement: Si la taille de l’écran est inférieure à 400: Placeholder text = Inscrivez-vous à notre newsletter
else: placeholder text = Votre email.
Voici le code HTML que j'ai:
<div id="mc_embed_signup">
<input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="Your Email">
</div>
En tant que solution CSS pure, nous pourrions avoir deux <input>
s - ayant différents placeholder
s - qui sont affichés dans différentes tailles d'écran - Exemple ici:
input.large { display: inline-block; }
input.small { display: none; }
@media (max-width: 399px) {
input.large { display: none; }
input.small { display: inline-block; }
}
<input type="email" name="email[]" class="required email large" id="mce-EMAIL" placeholder="Your Email">
<input type="email" name="email[]" class="required email small" placeholder="Join our newsletter">
Dans ce cas, nous devons nous assurer que la id
de nos deux input
s est différente. De plus, si id
est ajouté à <input>
juste à cause de son utilisation pour les éléments label
, nous pourrions simplement envelopper la input
par label
à la place.
L'utilisation de plusieurs variables input
qui ont le même name
remplacera la paire name/value
dans la méthode de requête HTTP.
Une solution possible consiste à utiliser une valeur de nom de tableau pour l'attribut name
(comme dans l'exemple ci-dessus) et à la gérer côté serveur (Il est préférable de conserver les valeurs name
en minuscules)}.
Alternativement, nous pourrions disable
la input
cachée afin d'empêcher que sa valeur soit envoyée au serveur:
$('input:hidden').prop("disabled", true);
Utilisation de JavaScript dans une Pure CSS Solution? Peut-être ... peut-être pas ... mais de nos jours, aucun site Web dans le monde moderne n'est vide de JavaScript. Si cela peut vous aider à vous en débarrasser, vous pouvez vous salir les mains !.
if ($(window).width() < 400 ) {
$("input[type='email']").attr("placeholder","join our newsletter");
}
else { $("input[type='email']").attr("placeholder","your email");}
Bien que cela soit un peu compliqué, il est possible de le faire en HTML/CSS pur (aucun javascript n'est requis) sans dupliquer les éléments dans le DOM si il vous suffit d'afficher/masquer le texte, pas de le modifier.
Le hack consiste simplement à styler différemment le texte de l'espace réservé en fonction de la largeur (ou de votre requête multimédia) et à modifier l'opacité pour le faire apparaître ou disparaître, comme suit:
input.responsive::-webkit-input-placeholder,
input.responsive::-moz-placeholder,
input.responsive:-moz-placeholder,
input.responsive:-ms-input-placeholder {
color: rgba(25, 25, 25, 1.0);
}
@media (max-width: 399px) {
input.responsive::-webkit-input-placeholder,
input.responsive::-moz-placeholder,
input.responsive:-moz-placeholder,
input.responsive:-ms-input-placeholder {
color: rgba(0, 0, 0, 0);
}
}
This script include initial setting of the placeholder and changing on resizing the window:
//set responsive mobile input field placeholder text
if ($(window).width() < 769) {
$("input").attr("placeholder", "Short text");
}
else {
$("input").attr("placeholder", "Long text for wide input filed");
}
$(window).resize(function () {
if ($(window).width() < 769) {
$("input").attr("placeholder", "Short text");
}
else {
$("input").attr("placeholder", "Long text for wide input field");
}
});
Il suffit de vérifier la taille de l'écran et d'agir en conséquence:
$(function() {
var txt = screen.width < 400 ? 'Join our newsletter' : 'Your email';
$('#mce-EMAIL').attr('placeholder', txt);
});
Notez que vous avez explicitement demandé la "taille de l'écran", la taille de la fenêtre et les événements de redimensionnement sont complètement différents.
si vous utilisez angular et lodash, vous pouvez utiliser la directive que j'ai écrite pour mon utilisation dans un projet où le concepteur a insisté.
lodash n’est utilisé que pour nous sauver lors de l’écriture de la fonction debouncer pour les événements window.resize.
angular.module('yourModuleNameHere').directive('mediaPlaceholder', function ($window, $parse) {
return {
restrict: 'A',
link: function ($scope, $elem, $attrs) {
var defObj = $parse($attrs.mediaPlaceholder)($scope);
function setPlaceholder() {
var lastFitting, windowWidth = $($window).width();
angular.forEach(defObj, function (placeholderValue,widthSetting) {
if (parseInt(widthSetting) <= windowWidth) {
lastFitting = placeholderValue;
}
});
$elem.attr('placeholder', lastFitting);
}
setPlaceholder();
$($window).resize(_.debounce(setPlaceholder, 40));
}
};
})
utiliser comme ceci:
<input type="search" media-placeholder="{0:'search',989:'long search placeholder'}">