Constructing a responsive website - html
In today's web development community, It is almost 'standard practise' to make a website "fully responsive" - meaning it would work on all screen sizes.
I currently have a website that is designed for a set width and height of 900 * 600px. However, I would like to alter this in such a way that I can make it mobile responsive, without loosing its functionality.
I was looking for some 'industry standard' concepts in which I could adapt to this purpose, although I am at a slight loss as to how 'professionals' would go about achieving this in real world situations?
+---------------------------------------+
| NAVBAR (900px) |
+---------------------------------------+
| | |
| | |
| | body |
|200px | (700px) |
| | |
| | |
| | |
| | |
+---------------------------------------+
Here's a quick demo of a layout design which suits the 900 * 600px screen:
.page-wrap {
height: 600px;
width: 900px;
background: lightgray;
position: absolute;
top: 0;
left: 0;
}
.nav {
position: absolute;
top: 0;
left: 0;
height: 50px;
width: 900px;
background: tomato;
}
.sidebar {
position: absolute;
top: 50px;
left: 0;
height: 550px;
width: 200px;
background: dimgray;
}
.nav a {
display: inline-block;
height: 50px;
width: 100px;
line-height: 50px;
text-decoration: none;
background: rgba(200, 200, 200, 0.4);
}
.nav a:hover {
background: transparent;
}
<div class="page-wrap">
<div class="nav">
nav bar itemnav bar itemnav bar itemnav bar itemnav bar item
</div>
<div class="sidebar">
</div>
</div>
In short, how would this 'responsive' design be constructed? Is there a 'best practise' when dealing with responsive-designs?
there are many ways in order to make a website responsive. It bottles down to so many factors.
You need to use RWD, which stands for Responsive Web Design.
It means that you can deliver your webpage in a variable size of screen, without having to re-write your html over and over. This is very much a must-do if you had to work with mobile and/or tablet devices.
Use Dynamic Units
One of the most important features of making a webpage responsive is the units you use, so I'll mention that first of all. At the moment, you have 'hard coded' these values by using a (pixel) px unit, which would be seen as a 'static unit'.
Below is a couple of units you may want to consider in the generation of your markup:
The absolute length units are fixed in relation to each other and
anchored to some physical measurement. They are mainly useful when the
output environment is known. The absolute units consist of the
physical units (in, cm, mm, pt, pc) and the px unit ~ w3.org
The above table displays what is known as 'absolute' units, and this is because they do not 'technically' change when you resize your browser or view on a mobile device.
Instead of using such units, you should consider using one of the 'dynamic' units. For example:
percentage (%)
viewport-width or viewport-height (vw and vh respectively)
~Image from this article note this is an old article, and support for these has improved a lot since
Using the likes of percentage, for example, means you can set the width and/or height of a div depending on your containing block's size.
For example, resize your screen here:
div {
width: 50%;
background: tomato;
height: 50px;
}
<div></div>
You should notice how that div will always be '50% of its container'.
This would become very handy if you were building your website from scratch, but would also be useful if you were adapting one as well.
Use Media Queries
Media queries are great when used properly.
A media query is a logical expression that is either true or false. A
media query is true if the media type of the media query matches the
media type of the device where the user agent is running (as defined
in the "Applies to" line), and all expressions in the media query are
true.
A shorthand syntax is offered for media queries that apply to all
media types; the keyword ‘all’ can be left out (along with the
trailing ‘and’). I.e. if the media type is not explicitly given it is
‘all’.
For example, you could test something like "if my screen is smaller than 500px, use this css instead".
This would use a definition of something like:
#media (max-width:500px) {
//my css for when screen is lass than 500px wide
}
Several media queries can be combined in a media query list. A
comma-separated list of media queries. If one or more of the media
queries in the comma-separated list are true, the whole list is true,
and otherwise false. In the media queries syntax, the comma expresses
a logical OR, while the ‘and’ keyword expresses a logical AND
A simple demo of this would be:
div{
width:500px;
height:200px;
background:gray;
}
#media screen and (max-width:500px){
div{
width:100px;
background:tomato;
}
}
<div></div>
Use a Responsive Plugin
(Personally not advised, but still valid)
Bootstrap is the most popular HTML, CSS, and JS framework for
developing responsive webs.
Although I would advise not to using this, as it has a lot of 'unnecessary' css rules and hence I think it should only be used for 'concept code', and not production code.
Other Frameworks include:
foundation 3
skeleton
Bootstrap
Use a combination of these
In reality, most developers would use a whole range of combinations of these.
There isn't really a 'definitive' way of making a website responsive. However, hopefully you will be able to use some of this in future.
I've recently found that for responsive images I had to ensure that images in a Jekyll site (porting a template and adding functionality) would scale and fit on smaller screens, but not stretch and take up half the screen on screens with larger sizes.
Here are 2 methods to ensure that images/media do not overstretch or mess up the entire responsive site by going through the boundary without having to manually resize them.
CSS max/min-width attribute
For media assets like images, most browsers will support the max-width attribute that specifies how wide the image can be, or max-height if your use case prefers that. Here's an example:
/*in a css file */
img {
max-width: 90%;
height: auto;
width: auto;
}
That tells the browser to display images at a maximum width of 90% and resize the width and height accordingly (you do not need both attributes). For all img elements.
For even finer control individual styling of classes can be done like so:
img.responsive {
/*css for specific class here*/
}
And later specify the element is part of the image responsive class like so:
<img class="responsive" src="/assets/pic.png">
EDIT:
Centering or Positioning in CSS
I found a simple website that generates the code on how to position elements in CSS for you based on input settings, which is a real issue on responsive devices as well. This is the website: http://howtocenterincss.com/
Note that you will need to fully fill everything in (including the middle option). Also, despite the website's name, it also handles positions that are not center as well, so it is a fairly good catch-all.
Wrap the image in a container
The benefit of this is you style the container, and every element inside it will adhere to the container styles if their attributes are auto. By specifying a max size for a container with width=800px, whilst making the image width: auto so the image will resize to the dimensions of a container.
These 2 examples are adapted from the following site, which is a great resource for handling responsive assets like responsive videos/images/fonts and relative sizing, 5 useful CSS Tricks for a Responsive Website. The author is much more well-versed on the topic than I am currently.
Note that as mentioned in that tutorial not all browsers support max-width (IE7 and 9 do but not IE8) so that might be an issue for some people who use outdated browsers. In that case a conditional CSS is needed of a hack such as below (example taken from site) is needed:
#media \0screen {
img {
width: auto; /* for ie 8, */
}
}
-- Notice how I just placed width:auto in my first example with the max-width attribute
Additional: Another Framework
Many templates made by web designer n33 employ the lightweight Skel framework to make responsive websites that load the right CSS based on screen size. However this is a Javascript framework which won't function when users have noscript turned on. In which case you have to load the CSS by specifying <noscript> paths to CSS here </noscript>
A good reference on responsive templates (that have opensource files like CSS) that allowed me to study and understand some methods in making a responsive site can be found at HTML5UP.net also by the same developer that wrote Skel.
Related
How to reduce html or body width with media queries
I simply want to reduce desktop view width slightly but can't get it to work with media query. My latest attempt is #media (min-width: 992px) and (max-width: 1199.98px) { html, body { max-width: 80%; } } but it has no affect. I don't think I want to mess with container b/c that would leave out the navbar. Using my own stylesheet (added below bootstrap cdn stuff) rather than using the media queries directly in template.html but I don't know if that makes any difference. Am I trying to do this the right way or am I completely missing something?
You don't want go banging around on high-level elements when using a layout library. This limits what you and others can do in the page later (say you want a full-width banner somewhere). You also probably don't want to casually override all instances of a Bootstrap class. In this case, look at adding a custom class to the .container or .container-fluid element, limiting its width: .container.narrow { max-width: 80%; } Use that for any containers where you want a narrower width, and use containers without that class for wider content. <div class="container narrow"> ... </div> Whether you apply this in a media query is probably immaterial.
I was strugglng to find the answer to my screen not working correctly for the mobile and below answer from you worked like a charm. Thanks so much for your answer. I removed the meta-name line and it worked like a charm. Mohan #Beanic I presume that you have added the viewport tag for that() – Jan 22, 2020 at 12:50
How to apply CSS style based on parent element, similar to media queries [duplicate]
I would like to use media queries to resize elements based on the size of a div element they are in. I cannot use the screen size as the div is just used like a widget within the webpage, and its size can vary.
Yes, CSS Container Queries are what you're looking for. The CSS Containment Module is the specification that details this feature. You can read more about the decade of work, including proposals, proofs-of-concept, discussions and other contributions by the broader web developer community here! For more details on how such a feature might work and be used, check out Miriam Suzanne's extensive explainer. Currently only Chromium 105+ supports Container queries out of the box, though Safari 16 will include support as well. Hopefully it won't be much longer before we see a robust cross-browser implementation of such a system. It's been a grueling wait, but I'm glad that it's no longer something we simply have to accept as an insurmountable limitation of CSS due to cyclic dependencies or infinite loops or what have you (these are still a potential issue in some aspects of the proposed design, but I have faith that the CSSWG will find a way). Media queries aren't designed to work based on elements in a page. They are designed to work based on devices or media types (hence why they are called media queries). width, height, and other dimension-based media features all refer to the dimensions of either the viewport or the device's screen in screen-based media. They cannot be used to refer to a certain element on a page. If you need to apply styles depending on the size of a certain div element on your page, you'll have to use JavaScript to observe changes in the size of that div element instead of media queries. Alternatively, with more modern layout techniques introduced since the original publication of this answer such as flexbox and standards such as custom properties, you may not need media or element queries after all. Djave provides an example.
I've just created a javascript shim to achieve this goal. Take a look if you want, it's a proof-of-concept, but take care: it's a early version and still needs some work. https://github.com/marcj/css-element-queries
From a layout perspective, it is possible using modern techniques. Its made up (I believe) by Heydon Pickering. He details the process here: http://www.heydonworks.com/article/the-flexbox-holy-albatross Chris Coyier picks it up and works through a demo of it here: https://css-tricks.com/putting-the-flexbox-albatross-to-real-use/ To restate the issue, below we see 3 of the same component, each made up of three orange divs labelled a, b and c. The second two's blocks display vertically, because they are limited on horizontal room, while the top components 3 blocks are laid out horizontally. It uses the flex-basis CSS property and CSS Variables to create this effect. .panel{ display: flex; flex-wrap: wrap; border: 1px solid #f00; $breakpoint: 600px; --multiplier: calc( #{$breakpoint} - 100%); .element{ min-width: 33%; max-width: 100%; flex-grow: 1; flex-basis: calc( var(--multiplier) * 999 ); } } Demo Heydon's article is 1000 words explaining it in detail, and I'd highly recommend reading it. Update 2021/22 As mentioned in other answers, container queries are coming. There is a full spec for it, and its usage is detailed on MDN: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries and there is a polyfill to get browsers that don't yet support it up to speed: https://github.com/GoogleChromeLabs/container-query-polyfill There is a nice little overview video of it here: https://www.youtube.com/watch?v=gCNMyYr7F6w This has now shipped to Chrome (05 September 2022) https://caniuse.com/css-container-queries
A Media Query inside of an iframe can function as an element query. I've successfully implement this. The idea came from a recent post about Responsive Ads by Zurb. No Javascript!
This is currently not possible with CSS alone as #BoltClock wrote in the accepted answer, but you can work around that by using JavaScript. I created a container query (aka element query) polyfill to solve this kind of issue. It works a bit different than other scripts, so you don’t have to edit the HTML code of your elements. All you have to do is include the script and use it in your CSS like so: .element:container(width > 99px) { /* If its container is at least 100px wide */ } https://github.com/ausi/cq-prolyfill
I ran into the same problem a couple of years ago and funded the development of a plugin to help me in my work. I've released the plugin as open-source so others can benefit from it as well, and you can grab it on Github: https://github.com/eqcss/eqcss There are a few ways we could apply different responsive styles based on what we can know about an element on the page. Here are a few element queries that the EQCSS plugin will let you write in CSS: #element 'div' and (condition) { $this { /* Do something to the 'div' that meets the condition */ } .other { /* Also apply this CSS to .other when 'div' meets this condition */ } } So what conditions are supported for responsive styles with EQCSS? Weight Queries min-width in px min-width in % max-width in px max-width in % Height Queries min-height in px min-height in % max-height in px max-height in % Count Queries min-characters max-characters min-lines max-lines min-children max-children Special Selectors Inside EQCSS element queries you can also use three special selectors that allow you to more specifically apply your styles: $this (the element(s) matching the query) $parent (the parent element(s) of the element(s) matching the query) $root (the root element of the document, <html>) Element queries allow you to compose your layout out of individually responsive design modules, each with a bit of 'self-awareness' of how they are being displayed on the page. With EQCSS you can design one widget to look good from 150px wide all the way up to 1000px wide, then you can confidently drop that widget into any sidebar in any page using any template (on any site) and
The question is very vague. As BoltClock says, media queries only know the dimensions of the device. However, you can use media queries in combination with descender selectors to perform adjustments. .wide_container { width: 50em } .narrow_container { width: 20em } .my_element { border: 1px solid } #media (max-width: 30em) { .wide_container .my_element { color: blue; } .narrow_container .my_element { color: red; } } #media (max-width: 50em) { .wide_container .my_element { color: orange; } .narrow_container .my_element { color: green; } } The only other solution requires JS.
The only way I can think that you can accomplish what you want purely with css, is to use a fluid container for your widget. If your container's width is a percentage of the screen then you can use media queries to style depending on your container's width, as you will now know for each screen's dimensions what is your container's dimensions. For example, let's say you decide to make your container's 50% of the screen width. Then for a screen width of 1200px you know that your container is 600px .myContainer { width: 50%; } /* you know know that your container is 600px * so you style accordingly */ #media (max-width: 1200px) { /* your css for 600px container */ }
You can use the ResizeObserver API. It's still in it's early days so it's not supported by all browsers yet (but there's several polyfills that can help you with that). This API allows you to attach an event listener when resizing a DOM element. Demo 1 - Demo 2
I was also thinking of media queries, but then I found this: http://www.mademyday.de/css-height-equals-width-with-pure-css.html Maintain the aspect ratio of a div with CSS Just create a wrapper <div> with a percentage value for padding-bottom, like this: div { width: 100%; padding-bottom: 75%; background:gold; /** <-- For the demo **/ } <div></div> It will result in a <div> with height equal to 75% of the width of its container (a 4:3 aspect ratio). This technique can also be coupled with media queries and a bit of ad hoc knowledge about page layout for even more finer-grained control. It's enough for my needs. Which might be enough for your needs too.
For mine I did it by setting the div's max width, hence for small widget won't get affected and the large widget is resized due to the max-width style. // assuming your widget class is "widget" .widget { max-width: 100%; height: auto; }
apply css to specific elements
On my site I am using the theme Newspaper. I have modified it a bit with css. I am trying to get my sidebar (instagram, most popular, newsletter sign up) to have a width of 26% so it would be on the same row as the editor's picks. The problem is that I can not get the sidebar to have a width of 26% without affecting the 3 blocks above editor's picks. Since both of them are .td-pb-span4. I have tried to solve this issue by using a more specific code just for the sidebar (code down below) and it still will not work. It is weird because the code I am trying to use will apply in chrome developer, however once I add it to my css it doesn't apply to my site. I would really appreciate any solution, I have been trying to figure this out for a few days and can't seem to find the problem. code I first tried to add but it affected both the sidebar and the 3 blocks above editors picks (and I only want width:26% to apply to the sidebar) .td-pb-span4 { width: 26%; } more specific code I am trying to add that only applies to the sidebar (it will work in chrome developer, but will not work if I apply it to my site css) .vc_column.td_uid_70_5976097f07941_rand.wpb_column.vc_column_container.td-pb-span4 { width: 26%; }
Don't do this: /* index ~line 2817 */ .td-pb-span8 { /* WHY */ width: 70%; float: left; margin-right: 4%; } you're touching a well defined grid system that has to work out of the box: .td-pb-span8 { width: 66.66666667%; /* yep. There's no reason on earth you should set to 70% */ } Grids are 12 based so do the math: 100 / 12 * 8
tumblr theme, with photosets fitting whole screen
tldr: I want to create simple theme, based on 2 columns with just pictures, that fill the whole screen, like this - http://half-way.precrafted.com/ Hello. I started learning html/css yesterday, because i want to create rather simple theme that would fit my needs. However, it turned out to be harder than i thought, unfortunately. I post only pictures, without any captions or tags. All i want is theme based on 2 grids, where whole screen is occupied with pictures (except header on top). This is the best, almost exact example of what i want - http://half-way.precrafted.com/ However, the issue is that tumblr allows photoset with maximum width of 700px. This may be overriden with javascript - and i found such scripts, but it uses fixed values, so it won't really fit to any screen - just mine.
Set the photosetrow class to: <div class="photoset_row photoset_row_2"> The CSS for this: width: 400px; white-space: nowrap; overflow: hidden; margin-top: 10px; .photoset .photoset_row .photoset_photo:first-child { margin-left: 0 !important; } .photoset .photoset_row .photoset_photo { display: inline-block; vertical-align: top; margin-left: 10px; } I literally pulled that CSS from looking at the source code of that page you posted. It seems the most important one is the photoset_row_2
Should we be setting width on div#wrapper or the <body>?
A lot of people's HTML markup looks like this: <html> <body> <div id="wrapper"> <p>Stuff in here</p> </div> </body> </html> And most of the time in examples here, or on the web, people suggest that you should apply width settings to the #wrapper, instead of the <body>. Is there an underlying reason for that? For example, in an article on techniques for gracefully degrading media queries, and to give you some context on Technique 1: Do Nothing: The elephant in the room is Internet Explorer for the desktop. With a mobile-first solution, large screens will display the content in one column, resulting in a painful reading experience for the user, way past the established maximum for comfort: 50 to 75 characters. It might be worth setting a max-width property in your main container and then upping that max-width in a media query. And their CSS: #wrapper { _width: 460px; /* Take that, IE6! */ max-width: 460px; } #media only screen and (width) { #wrapper { max-width: 1200px; } } Here's how it'd come together for IE (media query is commented out). Would there be any difference whereby instead of applying that to #wrapper, we would apply it to <body> — with the standard website in mind? Any potential bugs? I tried it here, and it seems to be OK. Just what if the layout gets more advanced...
Well, you want to use as few elements as possible I guess. However there are many instances where #page-wrapper and body are not interchangeable. In many situations you need to use the body as the background color instead of the html tag. In these cases (weighted footers for example) you need the body to stretch out the html and you need a wrapper to contain the content, maybe center the content, and force the body to stretch out and contain it. So - I guess I would say, that most people use a wrapper because they saw it in their first class or online tutorial. I think that for the most part, it is a habit for many. I would leave the body as is and margin the wrapper to 0 auto and use a max width like you have. It's just EI 8 and before - can I use media queries ? - maybe you should detect EI 8 and make a unique style sheet. I find that after defining everything for mobil, my media queries are only a few lines of iteration after that -