Responsive elements - stretching and then stacking - html

I'm fairly new to responsive web design, so don't beat me up too badly.
I have a currently fixed-width gallery page that is 1000px wide. The 1000px outer div has 30px padding and 30px between each pair of images. So I've got 910px of space available for each pair. The page might look like this:
(30px spacing)(500px img)(30px spacing)(410px image)(30px spacing)
(30px spacing)(480px img)(30px spacing)(430px image)(30px spacing)
(30px spacing)(450px img)(30px spacing)(440px image)(30px spacing)
...etc.
I'd like to convert it to a responsive page so that the images scale down as the browser window shrinks and ultimately stack on top of each other once the browser window drops below 640px.
The only way I know to make this 640px change is inside a stylesheet. Is this the only way I can do this? Am I going to have to define styles within the stylesheet for every image?
For example, for a 480px wide image:
img.img480 {
width: 48%;
float: left;
}
#media screen and (max-width: 640px) {
img.img480 {
width: 100%;
max-width: 480px;
float: none;
}
}

Here is an example of the effect you're asking for with responsive design.
A couple things to note:
margins are bad, use padding and wrappers instead
floats are bad, use inline-block instead
(Demo)
html, body {
margin: 0;
}
.wrapper {
padding: 0 15px;
font-size: 0;
}
.img-wrp {
width: 50%;
padding: 0 15px;
display: inline-block;
box-sizing: border-box;
}
.img-wrp img {
width: 100%;
}
#media screen and (max-width: 640px) {
.img-wrp {
width: 100%;
}
}
<div class="wrapper">
<i class="img-wrp"><img src="//lorempixel.com/640/480" /></i>
<i class="img-wrp"><img src="//lorempixel.com/640/480" /></i>
</div>

Related

#media only screen and (max-device-width) images width and height definition

I have a problem with width and height of images on the smartphone. I use this code. But I don't know why on the smartphone it also uses the same height of 13em like on desktop screen. All other amartphone definitions work fine.
#media only screen and (max-device-width: 60em) {
/* STYLES HERE for DEVICES with physical max-screen width of 60em */
article img {
float: left;
margin-right: 0.2em;
width: 100%;
height: auto;
}
}
article img {
float: left;
margin-right: 0.2em;
height: 13em;
}
Try putting the media query under the article img.
Not related but you don't need to repeat float and margin-right since you're not overriding them.

body is not covering full page

What can I do to make the body cover the whole page? In my CSS for body and html height and width 100%.
With the mobile version, the body is reduced in this way
With the pc version, everything is fine with the width, but the height is not on the whole page
html {
overflow: auto;
height: 100%;
width: 100%;
}
body {
background-color: #1c1c1c;
font-family: 'Press Start 2P', cursive;
}
Here is my full html and css
and if you can tell me what else can be corrected, I will be very grateful
many of your elements have fixed width in px, which doesn't change in the media query. E.g. you have:
.container {
width: 890px;
...
}
.menu__list {
...
width: 700px;
}
You need to change them in your media query
#media screen and (max-width: 450px) { ... }
Personallly I'd keep only the container width in px for desktop and other things in percents, then in mobile versions I'd keepp them all in percents like
.container {
width: 100%
}
Or sometimes
.container {
width: 100%
max-width: 320px;
}
Basing on the first code you posted.
Modify your container class css (Desktop) since its inheriting from wrapper.
.container {
margin: 0 auto;
}
Your current css ( remove width & padding )
.container {
width: 890px;
margin: 0 auto;
padding: 0 20px;
}
Mobile is fine, its just inheriting the screen size of the emulator.

HTML/CSS Fit Div to Contents unless screen is small

How do I setup HTML/CSS to have my DIV follow the screen size for width, but stop expanding once it fits the contents (it should scroll left/right when the div cannot fully contain the contents).
Pseudo-Code:
HTML:
<div class="image-container">
<img width="1000">
</div>
CSS:
.image-container {
/* ??? */
display: inline-block; /* ??? */
overflow: auto;
}
EDIT: Per Evadore's answer, I was able to come up with the following CSS.
.image-container {
display: inline-block;
overflow: auto;
}
/* optimize these px dimensions, 900 worked for my application */
#media (max-width: 900px) {
.image-container {
max-width: 710px;
}
}
/* redundant, I plan to tweak this range later */
#media (min-width: 901px) and (max-width: 1575px) {
.image-container {
max-width: 710px;
}
}
#media (min-width: 1576px) {
.image-container {
max-width: 1385px;
}
}
The following reference also helped: w3schools
Use CSS Media queries to setup for various screen sizes.
view source code of this page to see how media queries were used.
for this set the parent div width to fit-content and max-width to 100%. now the parent div will remain between the width of the content and the with of the screen if the screen size is not enough. And lastly for scrolling inside the parent div on the small screen devices put overflow:scroll.
Here is the Codepen demo
.parent {
background-color: green;
width: fit-content;
max-width: 100%;
overflow: scroll;
}
.child {
padding: 30px;
width: 700px;
background-color: red;
color: #fff;
}
<div class="parent">
<div class="child">
test string
</div>
</div>
ps: I've added bg colors just for reference purposes, to show whether the parent component is expanding or not.

Resize Element If It Moves Onto New Line

On http://www.rosstheexplorer.com/picture-test/ I have two images side by side. The two images have different height to width ratios. I wanted both images to have the same height so gave the images different widths. I used the padding bottom hack to get the images height and width to always stay proportional.
To do this I added the following to the CSS file
.wrapper-133percent-grampians {
width: 33.9%;
float: left;}
.wrapper-75percent-grampians {
width: 60.1%;
float: left;
}
.wrapper-133percent-grampians .inner {
position: relative;
padding-bottom: 133%;
height: 0;
}
.wrapper-75percent-grampians .inner {
position: relative;
padding-bottom: 75%;
height: 0;
}
.element-to-stretch-grampians {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
The HTML code is as follows
<div class="wrapper-133percent-grampians" style="min-width: 172px;">
<div class="inner"><img class="element-to-stretch-grampians alignleft" src="http://www.rosstheexplorer.com/wp-content/uploads/2016/05/venus-baths-test2-225x300.jpg" alt="venus baths test2" /></div>
</div>
<div class="wrapper-75percent-grampians" style="min-width:172px;" >
<div class="inner"><img class="element-to-stretch-grampians alignnone" src="http://www.rosstheexplorer.com/wp-content/uploads/2016/05/IMGP0038-300x225.jpg" alt="IMGP0038" /></div>
</div>
I have the 'min:width:172px' statement because I wanted the two images to appear on top of each other when being displayed on mobile devices. When the images were being displayed side by side on mobile devices the images were too small.
When the images appear on top of each other they are 172px wide, yet the width of the mobile browser could be larger than 172px. I do not want to have white space on the mobile browser. How can I instruct the images to occupy the full width of the device WHEN the two images move onto separate lines.
Thank You
This is because you have defined the width as 33% here
.wrapper-133percent-grampians {
width: 33.9%;
float: left;
}
Now I understand that you want the width to be 33% for desktop PC. But the same is being applied to mobile as well. You can separate both by defining different sized for different screen sizes
//for desktop applications
#media screen and (max-width: 499px) {
.wrapper-133percent-grampians {
width: 80%;
float: left;
}
}
//for mobile devices
#media screen and (min-width: 500px) {
.wrapper-133percent-grampians {
width: 33.9%;
float: left;
}
}

Bootstrap div won't adapt to height based on content

Note: Yes I did make a research first trying to find a solution and tried to implement a number of options to fix the problem, nothing I could find worked though!
UPDATE
Because media queries are not an optimal solution for my problem, as I have to take into account multiple cases of width/height combinations in a responsive layout, I used some javascript at the end in order to calculate the difference in height of the banner div and the content div in order to readjust height accordingly. Here is the code I used
function resizeContainers()
{
var bannerContainer = $('#banner');
var contentContainer = $('#homeFormContainer');
var bannerContainerHeight = bannerContainer.height();
var bannerContainerBottom = $(window).height() - bannerContainerHeight;
var contentContainerBottom = $(window).height() - contentContainer.height();
var containersDiff = bannerContainerBottom - contentContainerBottom;
if (containersDiff > -200) {
var newBannerContainerHeight = bannerContainerHeight+contentContainerBottom+20;
bannerContainer.css('height', newBannerContainerHeight);
}
}
$(document).ready(function () {
// check and resize after page loads
resizeContainers();
// check and resize containers on window resize
$(window).resize(function() {
resizeContainers();
});
});
I am struggling with a div in bootstrap that won't adapt to the height of it's inner content. As far as I can tell, CSS looks OK (but it probably is not, so I could use some help).
You can see the fiddle here
http://jsfiddle.net/spairus/fbmssraw/6/
The basic HTML structure looks like this
<div id="banner" class="banner">
<div class="banner-image"></div>
<div class="banner-caption" style="display: table;">
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
(content here)
</div>
</div>
</div>
</div>
</div>
And the CSS
html,
body {
height: 100%;
}
img {
display: block;
max-width: 100%;
height: auto;
}
.banner {
width: 100%;
height:100%;
min-height: 100%;
position: relative;
color: #fff;
}
.banner-image {
vertical-align: middle;
min-height: 100%;
width: 100%;
}
.banner:after {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.55);
content: "";
}
.banner-caption {
position: absolute;
top: 22%;
width: 100%;
z-index: 2;
}
.subfooter {
background-color: #fafafa;
border-top: 1px solid #f3f3f3;
border-bottom: 1px solid #f3f3f3;
padding: 40px 0;
}
/* Backgrounds
----------------------------------------------------------------------------- */
.default-bg {
background-color: #222222;
color: #ffffff;
}
.space {
padding: 20px 0;
}
I need the .banner and .banner-caption to expand along with the content.
If you're going to have the following code:
html,
body {
height: 100%;
}
and then on your main container:
.banner {
width: 100%;
height:100%;
min-height: 100%;
position: relative;
color: #fff;
}
the container is not going to be responsive to the content inside it, because what you've said in the CSS is basically "hey container (banner), I want you to be 100% of the screen size of whatever device you show up on" .
Instead you need to change the css to said "hey container I want you to have a min-width or be responsive to whatever content you have inside you", so you could do the following:
The best solution I have for this problem (which I face quite often) is as follows.
#media only screen and (min-width : 992px) {
.banner {
width: 100%;
height:120%; // adjust this to whatever size you think your content will stretch to there is no golden rule saying it has to be 100% only.
min-height: 100%;
position: relative;
color: #fff;
}
}
Edit
Why does the above solution work? Notice how I have added a media query that says min width of 992px, now it's safe to say that the dimension of devices above 992px are predictable, and thus it's safe to use a height:120%; it's only when you go below 992px or 768px that the screen resolution (height & width) become unpredictable to counter this you add absolutely no styling to the height of the container.
How effective is this technique? Well, it is pretty effective, but on some screens (the screens above 992px) there might arise a problem of excessive white spacing or slight overlapping of content.
Now to counter this problem you can use multiple media queries : eg.
#media only screen and (min-width : 768px) {
height : 125 %;
}
/* Medium Devices, Desktops */
#media only screen and (min-width : 992px) {
height : 120 %
}
/* Large Devices, Wide Screens */
#media only screen and (min-width : 1200px) {
height : 100 %
}
but IMHO, this is not needed unless you need pin point accuracy (multiple media queries are a pain!). Worst case scenario, use two media queries.
Anyway, here's the technique in action. Try to reduce the screen size and voila! Still looks pretty, and nowhere have a added height:400% for smaller screens: it adapts by itself.