How can I place text on top of flexible images? - html

friends!
I`m trying to make a grid of flexible images that come in a row. I dont even need additional div properties for that, works fine as is
<div class="container_imggrid"> <img> </div>
Css
.container_imggrid img {
display: inline-block;
max-width: 25%;
height: auto;
}
But now i need to add text above my picture, Div with text should be flexible as well.
U can see what i mean at this page http://www.reebok.com/us. That big image with "start designing" sign is flexible until some point, as well as text above it.
I need similar Header properties for my grid elements, but cant position my text block properly.
Can you please help me? Maybe i need absolutely another grid basis for such features?
My interactive fiddle is here: https://jsfiddle.net/CapablancaYEAH/yr809ty8/
P.S. To make things more clear, let me re-phrase.
I need a flexible grid.
Each separate block of grid is Square DIV with image inside and centered header on top of image.
Image should be resized and fit accordingly to div`s width/height (browser window size change).
Header should remain centered with div after any browser window resize.

Just set position:relative to parent div and position:absolute with top and left 50% for h2 tag.
.container_banner{position:relative;}
.container_banner img{width:100%;height:auto;}
.container_banner h2{position: absolute;
right: 0;
width: 50%;
left: 0;
margin: 0 auto;
text-align: center;
top: 44%;}
.container_imggrid{width:25%;}
<div class="container">
<div class="container_banner">
<h2>Swimming</h2>
<img src="https://i.yapx.ru/JEvD.jpg" width="1000" height="300">
</div>
<div class="container_imggrid container_banner">
<h2>Swimming</h2>
<img src="https://i.yapx.ru/JEvC.jpg" width="500" height="500" alt="Подводное плавание">
</div>
</div>
Make sure your parent div width is same as your <img> tag with. It should be same otherwise you need to set your image in background inside the parent div.
Hope this will helpful for you.
Thanks.

Using position: relative (for parent) and position: absolute (for child)
https://jsfiddle.net/kaskull/yr809ty8/4/

You can use media queries at each stage to manipulate the text size at different screen sizes like:
#media only screen and (min-width: 360px){
.flx-text{
font-size:1em;
}
}
Example Fiddle (try resizing for effect):
JSFIDDLE
Snippet [Go full screen and resize for effect]:
.container_banner {
padding-bottom: 15px;
}
.container_banner img {
max-width: 100%;
height: auto;
}
.container_imggrid img {
display: inline-block;
max-width: 25%;
height: auto;
}
.container_imggrid h2 {
display: block;
position: fixed;
max-width: 50%;
}
#media only screen and (min-width: 360px) {
.flx-text {
font-size: 0.9rem
}
}
#media only screen and (min-width: 390px) {
.flx-text {
font-size: 1.0rem
}
}
#media only screen and (min-width: 420px) {
.flx-text {
font-size: 1.1rem
}
}
#media only screen and (min-width: 450px) {
.flx-text {
font-size: 1.2rem
}
}
#media only screen and (min-width: 480px) {
.flx-text {
font-size: 1.3rem
}
}
#media only screen and (min-width: 510px) {
.flx-text {
font-size: 1.4rem
}
}
#media only screen and (min-width: 540px) {
.flx-text {
font-size: 1.5rem
}
}
#media only screen and (min-width: 570px) {
.flx-text {
font-size: 1.6rem
}
}
#media only screen and (min-width: 600px) {
.flx-text {
font-size: 1.7rem
}
}
#media only screen and (min-width: 630px) {
.flx-text {
font-size: 1.8rem
}
}
#media only screen and (min-width: 660px) {
.flx-text {
font-size: 1.9rem
}
}
#media only screen and (min-width: 690px) {
.flx-text {
font-size: 2.0rem
}
}
#media only screen and (min-width: 720px) {
.flx-text {
font-size: 2.1rem
}
}
#media only screen and (min-width: 750px) {
.flx-text {
font-size: 2.2rem
}
}
#media only screen and (min-width: 780px) {
.flx-text {
font-size: 2.3rem
}
}
#media only screen and (min-width: 810px) {
.flx-text {
font-size: 2.4rem
}
}
#media only screen and (min-width: 840px) {
.flx-text {
font-size: 2.5rem
}
}
#media only screen and (min-width: 870px) {
.flx-text {
font-size: 2.6rem
}
}
#media only screen and (min-width: 900px) {
.flx-text {
font-size: 2.7rem
}
}
#media only screen and (min-width: 930px) {
.flx-text {
font-size: 2.8rem
}
}
#media only screen and (min-width: 960px) {
.flx-text {
font-size: 2.9rem
}
}
#media only screen and (max-width: 360px) {
.flx-text {
font-size: 0.8rem
}
}
<div class="container">
<div class="container_banner">
<img src="https://i.yapx.ru/JEvD.jpg" width="1000" height="300">
</div>
<div class="container_imggrid">
<h2 class="flx-text">Swimming</h2>
<img src="https://i.yapx.ru/JEvC.jpg" width="500" height="500" alt="Подводное плавание">
</div>
</div>

After all, I was able to figure out a solution. It uses a trick with
font-size: 0;
see https://jsfiddle.net/CapablancaYEAH/68aqv37b/

Related

media query css responsive [duplicate]

This question already has an answer here:
CSS specificity, Media Queries and min-width
(1 answer)
Closed 2 years ago.
I have this p:
<p class="p">This is for tests</p>
.p {
font-size: 50px;
background-color: blue;
}
When i the screen is 320px width change to :
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}
and when is 375px:
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
Why the 375px query set background-color to 320px, when the screen is 320px i want to remain red, and when is 375 px i want to be green.
(New in media responsive!)
just reorder your media queries. Otherwise the max-width:375px over rides max-width:320px
.p {
font-size: 50px;
background-color: blue;
}
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}
<p class="p">This is for tests</p>
There is nothing wrong, just change the orders.
.p {
font-size: 50px;
background-color: blue;
}
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}
<p class="p">This is for tests</p>
We need to reorder the media queries, because if you write two rules “max-width: 320px” and “max-width: 375px” for one screen size which satisfy both the rules, it will choose the last css rule that was declared. You can use !important to the first rule which can solve your problem without reordering, but this not a correct approach of doing it.
As per your example, if the browser window is 320px pixels wide, the background-color will be green, because 320px condition satisfies both media queries, so it will select the last rule
//First rule
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}
//Last rule
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
When you reorder, the background color will be green, when the screen size is 320px, because we have added the 320px media query at last.
//First rule
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
//Last rule
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}
I hope this solves your query.
Just change the orders.
.p {
font-size: 50px;
background-color: blue;
}
#media only screen and (max-width: 375px) {
.p {
background-color: green;
font-size: 20px;
}
}
#media only screen and (max-width: 320px) {
.p {
background-color: red;
font-size: 30px;
}
}

Responsive iframe with varying aspect ratio content - have solution looking for better one

I have a requirement for a responsive iframe. I have found many solutions for embeding videos (and Bootstrap even has classes for this specific case) but I'm embeding a form which itself is responsive (This is a Global Payments / Realex Paymenmts HPP card paymemt form if anyone know it).
So, the aspect ration of the form changes based on its size and also what the user does - for example it gets longer to display error messages.
Also, as can be seen the initial content is the iframe is just "Please wait..." and the thoird party form is loaded via javascript.
I have modified the video embeding method by adding progressive media queries to increase padding as the device gets smaller and thus the form longer, to avoid scroll bars. It seems to work well, but there must be a more efficient/simple/elegant solution?
HTML
<div class='hpp_iframe_wrapper'>
<iframe class='hpp_iframe' id='realex_hpp_iframe' name='realex_hpp_iframe' srcdoc='<p>Please wait ...</p>'></iframe>
</div>
CSS
.hpp_iframe_wrapper {
position: relative;
overflow: hidden;
padding-top: 80%;
}
.hpp_iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: 0;
}
#media (max-width: 1000px) {
.hpp_iframe_wrapper {
padding-top: 90%;
}
}
#media (max-width: 900px) {
.hpp_iframe_wrapper {
padding-top: 100%;
}
}
#media (max-width: 800px) {
.hpp_iframe_wrapper {
padding-top: 130%;
}
}
#media (max-width: 700px) {
.hpp_iframe_wrapper {
padding-top: 145%;
}
}
#media (max-width: 600px) {
.hpp_iframe_wrapper {
padding-top: 160%;
}
}
#media (max-width: 500px) {
.hpp_iframe_wrapper {
padding-top: 185%;
}
}
#media (max-width: 450px) {
.hpp_iframe_wrapper {
padding-top: 200%;
}
}
#media (max-width: 400px) {
.hpp_iframe_wrapper {
padding-top: 220%;
}
}
#media (max-width: 360px) {
.hpp_iframe_wrapper {
padding-top: 240%;
}
}
#media (max-width: 340px) {
.hpp_iframe_wrapper {
padding-top: 260%;
}
}

CSS/Bootstrap - Is there anyway to avoid this redundancy?

I need to change the font-size based on the view port, for that I am using the below code; however, I feel it's a bit redundant and un-professional. I believe that it should be a better way to achieve the same result.
P.S. I am using Bootstrap 4
#media (min-width: 0px) and (max-width: 500px) {
.block {
font-size: 5.1em !important;
}
}
#media (min-width: 501px) and (max-width: 800px) {
.block {
font-size: 6.1em !important;
}
}
#media (min-width: 801px) and (max-width: 1100px) {
.block {
font-size: 4.8em !important;
}
}
#media (min-width: 1101px) and (max-width: 1300px) {
.block {
font-size: 5.5em !important;
}
}
#media (min-width: 1301px) {
.block {
font-size: 6em !important;
}
}

#media section styles are not being applied; other #media sections working

I'm editing a pre-existing stylesheet. It currently has #media sections for 0-319px and for 320-479px, as well as a few others for larger screens. I'm trying to add iphone-specific styles. However, my iphone's screen is 320px, but I don't want to put iphone styles in the 320-479 section, because I only want it to be applied to the iphone, not tablets. So, I added a new section to the end of my stylesheet that goes up to 329px, and put the specific styles in there, but they are not being recognized.
#media screen and (min-width: 0px) and (max-width: 319px) {
.carousel-slide-dialog {
position: relative !important;
margin-top: 1px;
height: auto;
padding: 0 0 24px 25px;
width: 100%;
background-color: #de0662;
}
}
#media screen and (min-width: 320px) and (max-width: 479px) {
.carousel-slide-dialog {
position: relative !important;
margin-top: 1px;
height: auto;
min-height: 90px;
padding: 0 0 24px 25px;
width: 100%;
background-color: #de0662;
}
}
#media screen and (max-width: 329px) {
.carousel-slide-dialog {
min-height: 115px;
}
.carousel-slide-dialog p {
max-width: 235px;
}
}
When I look at the stylesheet in dev tools, my new section is there, so it's not a cache issue. But it's not being applied (I have my window size at 323px).
Your first two media queries are mostly the same, with the exception of the min-height attribute in 320-479. Also, #media screen and (min-width: 0px) and (max-width: 319px) is the essentially the same thing as just #media screen and (max-width: 319px)
Why don't you refactor the media queries so that there are not overlapping media queries, like this:
#media screen {
.carousel-slide-dialog {
position: relative !important;
margin-top: 1px;
height: auto;
padding: 0 0 24px 25px;
width: 100%;
background-color: #de0662;
}
}
#media screen and (max-width: 319px) {
.carousel-slide-dialog {
min-height: initial;
}
.carousel-slide-dialog p {
max-width: initial;
}
}
#media screen and (min-width: 320px) and (max-width: 329px) {
.carousel-slide-dialog {
min-height: 115px;
}
.carousel-slide-dialog p {
max-width: 235px;
}
}
#media screen and (min-width: 330px) and (max-width: 479px) {
.carousel-slide-dialog {
min-height: 90px;
}
.carousel-slide-dialog p {
max-width: initial;
}
}

media screen and max width

I don't know much about media queries, but I want to try making responsive divs.
I set div for some resolutions:
#media screen and (max-width: 768px) {
div#zarada p {
width: 100%;
font-size: 14px;
}
.zaradabox img {
display: none;
}
}
#media screen and (max-width: 1024px) {
div#zarada p {
width: 38%;
font-size: 14px;
}
}
#media screen and (max-width: 1280px) {
div#zarada p {
width: 38%;
}
}
#media screen and (max-width: 1366px) {
div#zarada p {
width: 39%;
}
}
#media screen and (max-width: 1440px) {
div#zarada p {
width: 42%;
}
}
#media screen and (max-width: 1536px) {
div#zarada p {
width: 46%;
}
}
#media screen and (max-width: 1600px) {
div#zarada p {
width: 48%;
}
}
#media screen and (max-width: 1680px) {
div#zarada p {
width: 50%;
}
}
#media screen and (max-width: 1920px) {
div#zarada p {
width: 56%;
}
}
But if display 1024x600px or ANY, always read width:56% (last style line)
What did I miss?
Essentially what your code is saying is "if it's the screen's size, do this until you reach max-width. Since your smallest value is the screen size, your last media query is overriding all of the previous ones.
If you require such specific handling of the divs, specify the min-width in the handling. e.g.
#media only screen and (max-width:768px) {
div#zarada p {width:100%; font-size: 14px;}
.zaradabox img {display:none;}
}
#media only screen and (min-width:769px) and (max-width:1024px) {
div#zarada p {width:38%; font-size: 14px;}
}
#media only screen and (min-width:1025px) and (max-width:1280px) {
div#zarada p {width:38% }
}
#media only screen and (min-width:1281px) and (max-width:1366px) {
div#zarada p {width:39% }
}
etc. Good luck and let me know how it works!
You should revert them (higher to lower):
#media screen and (max-width:1920px) {
div#zarada p {width:56% }
}
#media screen and (max-width:1680px) {
div#zarada p {width:50% }
}
#media screen and (max-width:1600px) {
div#zarada p {width:48% }
}
#media screen and (max-width:1536px) {
div#zarada p {width:46% }
}
#media screen and (max-width:1440px) {
div#zarada p {width:42%}
}
#media screen and (max-width:1366px) {
div#zarada p {width:39% }
}
#media screen and (max-width:1280px) {
div#zarada p {width:38% }
}
#media screen and (max-width:1024px) {
div#zarada p {width:38%; font-size: 14px;}
}
#media screen and (max-width:768px) {
div#zarada p {width:100%; font-size: 14px;}
.zaradabox img {display:none;}
}
Mobile First - If you do mobile first, you never need a max-width.
/* this code will be in effect unless from 0px width */
div#zarada p {width:100%; font-size: 14px;}
.zaradabox img {display:none;}
#media screen and (min-width:768px) {
/* this code will be in effect from 768px width and up */
div#zarada p {width:38%; font-size: 14px;}
}
#media screen and (min-width:1024px) {
/* this code will be in effect from 1024px width and up */
div#zarada p {width:38%; }
}
#media screen and (min-width:1280px) {
/* this code will be in effect from 1280px width and up */
div#zarada p {width:39%; }
}
#media screen and (min-width:1366px) {
/* this code will be in effect from 1366px width and up */
div#zarada p {width:42%;}
}
#media screen and (min-width:1440px) {
/* this code will be in effect from 1440px width and up */
div#zarada p {width:46%; }
}
#media screen and (min-width:1536px) {
/* this code will be in effect from 1536px width and up */
div#zarada p {width:48%; }
}
#media screen and (min-width:1600px) {
/* this code will be in effect from 1600px width and up */
div#zarada p {width:50%; }
}
#media screen and (min-width:1680px) {
/* this code will be in effect from 1680px width and up */
div#zarada p {width:56%; }
}
Also, You should always end you css lines with a ;. e.g. p {width:50%;}