问题
I'm working on a responsive design. I've hit a bit of a wall with there not being enough space for an input
box and it's label
. So I have decided to hide the label on smaller screen sizes.
At present it has the placeholder text your email
inside it, but I want only on screens less than 400 (so up to 399px wide) a different place holder of Join our newsletter
.
I reckon there will need to be some JS to perform this, rather than anything with CSS.
Essentially: if screen size less than 400: placeholder text = Join our newsletter
else: placeholder text = Your email.
Here is the HTML I have:
<div id="mc_embed_signup">
<input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="Your Email">
</div>
回答1:
As a pure CSS solution, we could have two <input>
s - having different placeholder
s - which are shown in different screen sizes - Example here:
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">
Important notes:
In this case we should make sure that the
id
of our twoinput
s are different. Besides, Ifid
is added to<input>
just because of its usage forlabel
elements, we could just wrap theinput
bylabel
instead.Using more than one
input
which have the samename
, will override thename/value
pair in HTTP request method.
One possible solution is to use an array name value for name
attribute, (as example above) and handle it at server-side (It's better to keep name
values in lowercase).
Alternatively, we could disable
the hidden input
in order to prevent its value from being sent to server:
$('input:hidden').prop("disabled", true);
Using JavaScript in a Pure CSS Solution? Maybe... maybe not... but nowadays no websites in the modern world are empty of JavaScript. If it helps to get rid of the problem, it's alright to get hands a little dirty!.
回答2:
if ($(window).width() < 400 ) {
$("input[type='email']").attr("placeholder","join our newsletter");
}
else { $("input[type='email']").attr("placeholder","your email");}
demo: http://jsfiddle.net/fcrX5/
回答3:
While a bit hacky, this is possible to do in pure HTML/CSS (no javascript required) without duplicating elements in the DOM if you only need to show/hide the text, not change it.
The hack is to simply style of the placeholder text differently depending on width (or whatever your media query is) and change the opacity to make it appear or disappear, like so:
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);
}
}
回答4:
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");
}
});
回答5:
Just check for the screen size, and act accordingly :
$(function() {
var txt = screen.width < 400 ? 'Join our newsletter' : 'Your email';
$('#mce-EMAIL').attr('placeholder', txt);
});
Note that you explicitly asked for "screen size", window size and resize events are something else entirely.
回答6:
if you use angular and lodash you can use this directive I've written for my use in one projects where the designer insisted...
lodash is used only to save us writing the debouncer function for window.resize events, can be replaced in 5 minutes of boilerplate setTimeout thingy...
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));
}
};
})
use like this:
<input type="search" media-placeholder="{0:'search',989:'long search placeholder'}">
来源:https://stackoverflow.com/questions/18176102/swap-placeholder-text-based-on-resolution-media-query