Attach multiple divs and make them responsive - html

Hellow Guys,
I'm creating a loading animation with HTML and CSS. As I'm not really skilled in responsive front-end, I'm really struggling with making the text and the circle responsive.
What I really want is to attach the div with the background image and the text to the bar and make them responsive in order not to move and remain at the same position.
This is what I want to achieve:
Here's the code of what I have at the moment. I've tried attachment fixed and stuff like that, but the main problem is that the image keeps scaling when I use a max height/width and the text moves to the right depending on the width of the website.
Hope you can help me, thanks in advise.
body {
background: #111 url("");
background-size: 25vmin;
background-repeat: no-repeat;
background-position: center 40%;
height: 100vh;
margin: 0;
}
.logo {
background: url("https://openclipart.org/download/256338/whitecircle.svg");
background-size: 25vmin;
background-repeat: no-repeat;
position: absolute;
left: 28%;
bottom: 10vh;
height: 25vh;
width: 100px;
max-width: 150px;
}
h1 {
color: #fff;
position: absolute;
bottom: 20vh;
left: 35%;
}
.progress {
width: 400px;
max-width: 85vw;
height: 8px;
position: absolute;
bottom: 20vh;
left: 50%;
background: rgba(255, 255, 255, 0.5);
transform: translate(-50%, -50%);
overflow: hidden;
}
.progress:after {
content: '';
display: block;
width: 100%;
height: 8px;
background: #fff;
animation: load 5s linear;
}
#-moz-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#-webkit-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#-o-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
<div class="logo"> </div>
<h1 class="title"> Loading </h1>
<div class="progress"> </div>

What I normally do to make an item responsive and many parts need to work closely together is, create a container which holds all items that are related. Then within the container I align item using % so they scale nicely. The main container (in my example called loader) I use width and height using the vh and vw units.
Here's one way you can solve this. I've also replaced the SVG with a circle made using css. This way you don't need to load the image. It will make your page less resource heavy. Let me know if you specifically want to use the SVG and I can update the example.
NOTE: I added a light border to the loader div so you can see how it resized when you resize the window. Remove it when you copy it to your page.
body {
height: 100vh;
margin: 0;
background-color: black;
display: flex;
justify-content: center;
align-items: center;
}
.loader {
position: relative;
height: 30vh;
width: 50vw;
min-width: 200px;
min-height: 100px;
border: 1px solid #444; // added to see the responsiveness
}
.circle {
width: 55px;
height: 55px;
bottom: calc(40% - 27.5px);
left: -2px;
position: absolute;
border: 5px solid white;
border-radius: 50%;
}
h1 {
color: #fff;
position: absolute;
left: 75px;
bottom: 32%;
}
.progress {
position: absolute;
width: calc(100% - 60px);
height: 8px;
bottom: 40%;
left: 60px;
background: rgba(255, 255, 255, 0.5);
overflow: hidden;
}
.progress:after {
content: '';
display: block;
width: 100%;
height: 8px;
background: #fff;
animation: load 5s linear;
}
#-moz-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#-webkit-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#-o-keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
#keyframes load {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
<div class="loader">
<!--<div class="logo"> </div>-->
<!--<img class="img-logo" src="https://openclipart.org/download/256338/whitecircle.svg">-->
<div class="circle"></div>
<h1 class="title">Loading</h1>
<div class="progress"></div>
</div>

Related

Div Moving Around

Okay so I have been trying everything I can think of to get this div to stay where it is on any browser and I thought I would turn to you wonderful people to try to help me (I am sure its an easy fix that I have overlooked)
No matter what I do it seems to mess things up elsewhere.
I have tried to put all divs (and the body) into fixed position (and this seems to have worked to an extent)
I have also tried to make the whole page flex in the hope that if I allow flex to work then it will flex around the offending items.
I have literally spent 2 days bashing my head against a wall with this and I could really use another set of eyes on my code to show me where I am going wrong.
Thankyou so much for your responses
I have updated my code to now run without images and with colours instead. I have managed to sort some of the issues out I was having but now when I move the page from bottom up the blue door shrinks
#opening {
background-color: red;
min-width: 100%;
max-width: 100%;
max-height: 100%;
min-height: 100%;
margin-left: 0;
margin-right: 0;
background-attachment: fixed;
}
.wrap {
background-color: purple;
background-position: fixed;
min-height: 140px;
max-height: 140px;
max-width: 360px;
min-width: 360px;
color: #fff;
position: fixed;
margin: 20vh;
margin-left: 42%;
padding: 30% 2% 0% 0%;
}
div.left {
background-color: blue;
text-align: center;
max-width: 34vh;
max-height: 62vh;
min-width: 34vh;
min-height: 62vh;
/* background-image:url("door.png") ; */
background-position: fixed;
background-repeat: no-repeat;
margin-left: 42.1%;
margin-top: 12.5%;
animation-name: open-left;
animation-duration: 10s;
animation-easing-function: cubic-bezier(.06, .63, 0, 1);
animation-iteration-count: 1;
animation-fill-mode: forwards;
animation-delay: 10s;
position: fixed;
top: 0;
left: 0;
}
#-webkit-keyframes open-left {
from {
-webkit-transform: perspective(500) rotateY(0deg);
-webkit-transform-origin: 0% 20%;
}
to {
-webkit-transform: perspective(500) rotateY(89deg);
-webkit-transform-origin: 0% 20%;
}
}
button {
background-color: #000000;
max-width: 70%;
max-height: 20;
border: white;
border-style: double;
color: white;
text-align: center;
text-overflow: unset;
font-size: 20px;
margin-left: 1%;
}
<body id="opening">
<div class="wrap">
<span class="animated rubberBand infinite">
<div>
<div>
<button onclick="location.href = 'https://www.google.com';"class="button"> And the Gunslinger followed </button>
</div>
</div>
</span>
<div class="left">
</div>
</div>
</body>
this gives me an output of this on a full screen
Full size page, no shrink
and this is the output when I shrink the screen to the left
Div position moves
Is this what you are after?
html,
body {
display: flex;
background: #000 url('https://keiraj87.github.io/website/backg.png') top center no-repeat;
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#door-wrap {
height: 295px;
width: 175px;
margin: 150px auto 0 auto;
perspective: 420px;
transform-style: preserve-3d;
}
#door {
height: 100%;
width: 100%;
background: url('https://keiraj87.github.io/website/door.png') top center no-repeat;
background-size: 175px;
animation: open-left 10s cubic-bezier(.06, .63, 0, 1) 0s 1 forwards;
margin-left: -88px;
}
#keyframes open-left {
from {
transform: rotateY(0deg) translateX(88px);
}
to {
transform: rotateY(-85deg) translateX(88px);
}
}
<div id="door-wrap">
<div id="door">
</div>
</div>

Animation when hovering object-fit: contain <img>

On mouse hover, animated span tags beneath an img work fine when the img isn't using object-fit: contain like below:
body {
height: 100%;
width: 100%;
margin: 0
}
.container {
max-width: 600px;
position: relative;
text-align: center;
width: 100%;
}
.product {
position: relative;
width: 150px;
}
img.content {
background: white;
height: auto;
margin: 8%;
position: relative;
width: 84%;
vertical-align: middle;
z-index: 5000;
}
.product:hover .effect-1,
.product:hover .effect-2 {
display: block;
}
.effect-1,
.effect-2 {
border-radius: 30%;
display: none;
mix-blend-mode: multiply;
height: 84%;
opacity: 1;
position: absolute;
width: 84%;
z-index: 3000;
}
.effect-1 {
animation: rotate 1.8s linear infinite;
background: cyan;
}
.effect-2 {
animation: rotate 1.2s linear reverse infinite;
background: #e7a9ff;
}
.placeholder {
width: 84%;
height: auto;
visibility: hidden;
}
#keyframes rotate {
0% {
top: 0;
left: 8%;
}
25% {
top: 8%;
left: 0%;
}
50% {
top: 16%;
left: 8%;
}
75% {
top: 8%;
left: 16%;
}
100% {
top: 0;
left: 8%;
}
}
<body>
<div class="container">
<p>Hover image please</p>
<div class="product">
<img class="content" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg">
<span class="effect-1"><img class="placeholder" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg"></span>
<span class="effect-2"><img class="placeholder" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg"></span>
</div>
</div>
</body>
But when the img is using object-fit: contain the animated spans take up the entire area:
body {
height: 100%;
margin: 0;
}
.container {
max-width: 600px;
position: relative;
text-align: center;
width: 100%;
height: 100%;
min-height: 700px;
}
.product {
height: 100%;
position: absolute;
}
.content {
background: white;
margin: 8%;
position: relative;
width: 84%;
height: 100%;
vertical-align: middle;
z-index: 5000;
object-fit: contain;
}
.product:hover .effect-1,
.product:hover .effect-2 {
display: block;
}
.effect-1,
.effect-2 {
border-radius: 30%;
display: none;
mix-blend-mode: multiply;
height: 84%;
opacity: 1;
position: absolute;
width: 84%;
z-index: 3000;
}
.effect-1 {
animation: rotate 1.8s linear infinite;
background: cyan;
}
.effect-2 {
animation: rotate 1.2s linear reverse infinite;
background: #e7a9ff;
}
.placeholder {
width: 84%;
height: auto;
visibility: hidden;
}
#keyframes rotate {
0% {
top: 0;
left: 8%;
}
25% {
top: 8%;
left: 0%;
}
50% {
top: 16%;
left: 8%;
}
75% {
top: 8%;
left: 16%;
}
100% {
top: 0;
left: 8%;
}
}
<body>
<div class="container">
<div class="product">
<span class="effect-1"><img class="placeholder" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg"></span>
<span class="effect-2"><img class="placeholder" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg"></span>
<img class="content" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg">
</div>
</div>
</body>
How do you make these hover effects apply only to the area around the image (not the entire area) when using object-fit: contain? The image must remain vertically centered using object-fit.
Is this what you wanted? The image is centered between the animated divs.
The reason why your image is larger in the second example you've given is because you've changed your CSS there. You've changed the height/width values of .container, .product etc, so the children elements are showing up larger, because they inherit these values.
I've changed max-width and min-height in .container to reduce the overall size. And the width of .content should be less than the width of the effect divs
html {
width: 100%;
height: 100%;
}
body {
width: 100%;
height: 100%;
margin: 0;
}
.container {
max-width: 300px;
/* This is new */
position: relative;
text-align: center;
width: 100%;
height: 100%;
min-height: 300px;
/* This is new */
}
.product {
height: 100%;
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
}
.content {
display: flex;
align-self: center;
background: white;
margin: 0 auto;
position: relative;
width: 65%;
/* This is new */
object-fit: contain;
/* This is new */
}
.product:hover .effect-1,
.product:hover .effect-2 {
display: flex;
}
.effects {
position: absolute;
}
.effect-1,
.effect-2 {
border-radius: 30%;
display: flex;
mix-blend-mode: multiply;
height: 84%;
opacity: 1;
position: absolute;
width: 84%;
z-index: 3000;
visibility: visible;
}
.effect-1 {
animation: rotate 1.8s linear infinite;
background: cyan;
}
.effect-2 {
animation: rotate 1.2s linear reverse infinite;
background: #e7a9ff;
}
.placeholder {
width: 84%;
height: auto;
visibility: hidden;
object-fit: contain;
display: flex;
margin: 0 auto;
align-self: center;
position: relative;
}
#keyframes rotate {
0% {
top: 0;
left: 8%;
}
25% {
top: 8%;
left: 0%;
}
50% {
top: 16%;
left: 8%;
}
75% {
top: 8%;
left: 16%;
}
100% {
top: 0;
left: 8%;
}
}
<body>
<div class="container">
<div class="product">
<span class="effects">
<img class="placeholder" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg">
<span class="effect-1"></span>
<span class="effect-2"></span>
</span>
<img class="content" src="http://www.petsworld.in/blog/wp-content/uploads/2014/09/Golden-Retriever-Puppies-in-basket.jpg">
</div>
</div>
</body>

Shine effect on button ever 3 seconds (no hover)

I'd like to be able to have the div shine-box go across the image automatically from the top left ever like 3 seconds, left to right, left to right etc.
This is the current code:
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: darkblue;
}
img {
border: 0;
}
.shine-box {
position: absolute;
width: 200px height: 200px;
overflow: hidden;
border-radius: 40%;
}
.shine-box:before {
position: absolute;
top: 0;
left: -500px;
content: "";
width: 120px;
height: 500px;
background: rgba(255, 255, 255, 0.6);
transform: skew(-50deg);
transition: 1s;
}
.shine-box:hover:before {
left: 655px;
}
<div class="shine-box">
<img class="neko" src="neko-fin.png" alt="neko.png">
</div>
Is this something you are looking for. As #Pete suggested you have to use CSS animation instead of transition
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: darkblue;
}
img {
border: 0;
width: 100%;
}
.shine-box {
position: absolute;
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 40%;
}
.shine-box:before {
position: absolute;
top: 0;
left: -500px;
content: "";
width: 120px;
height: 500px;
background: rgba(255, 255, 255, 0.6);
transform: skew(-50deg);
/* transition: 1s; */
animation: shine 3s ease infinite;
}
#keyframes shine {
from {left: -500px;}
to {left: 655px;}
}
/* .shine-box:hover:before {
left: 655px;
} */
<div class="shine-box">
<img class="neko" src="data:image/jpeg;base64,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" alt="neko.png">
</div>

Limit hover area of CSS shapes to :after

I am trying to make a sort of Venn-Diagram that is going to be used for navigation later.
I have three intersecting ellipsoids created with CSS shapes. Each ellipsoid, as well as their two intersections, will be distinct links later on. Also, when you hover over them they should pop out as per transform: scale(1.3).
My issue is that I'm using ellipsoids which are partially transparent with :after to create the intersections, which creates a problem when hovering over them because the :hover condition gets triggered when hovering anywhere on the partially transparent ellipsoid and not just the :after part. This means that the nonintersecting areas are not hoverable because they are obstructed by the other invisible ellipsoid.
I think the example will make this clearer.
Here is the code:
CSS:
.venn-container{position: relative; left: 0;}
.cat_one{
width: 400px;
height: 200px;
background: red;
border-radius: 200px / 100px;
position: absolute;
float: left;
opacity: 0.5;
}
.cat_two{
width: 400px;
height: 200px;
background: green;
border-radius: 200px / 100px;
position: absolute;
float: left;
left: 240px;
opacity: 0.5;
}
.cat_three{
width: 400px;
height: 200px;
background: blue;
border-radius: 200px / 100px;
position: absolute;
float: left;
left: 480px;
opacity: 0.5;
}
.int1{
background: transparent;
width: 400px;
height: 200px;
border-radius: 200px / 100px;
position: relative;
opacity: 0.5;
overflow: hidden;
float: left;
}
.int1:after{
background: black;
position: absolute;
content: '';
border-radius: 200px / 100px;
width: 400px;
height: 200px;
left: 240px;
}
.int1:hover{
transform: scale(1.3);
left: -35px;
}
.int2{
background: transparent;
width: 400px;
height: 200px;
border-radius: 200px / 100px;
position: relative;
opacity: 0.5;
overflow: hidden;
float: left;
left: 80px;
}
.int2:after{
background: black;
position: absolute;
content: '';
border-radius: 200px / 100px;
width: 400px;
height: 200px;
left: -240px;
}
.int2:hover{
transform: scale(1.3);
left: 115px;
}
HTML:
<div class="venn-container">
<div class="cat_one"></div>
<div class="cat_two"></div>
<div class="cat_three"></div>
<div class="int1"></div>
<div class="int2"></div>
</div>
And here is a fiddle: https://jsfiddle.net/y3Lvmuqg/2/
I would like the :hover to only get triggered in the intersections, and later make cat_one and cat_two hoverable outside the intersections.
I don't know if there is a way I'm doing this is the best and I'm open to suggestions.
Thanks for getting back to me #ge0rg I spent about an hour fiddling with CSS and HTML and came up with this code using just divs with background colors, hover events and border radius's (along with a few z-index and positioning techniques).
Hope you enjoy your reworked venn diagram...
You may have to mess around with the size, and definetly will have to mess with the positioning (however they're all inside a div and so it makes it so that you can just position the div and the rest will happen magically) I added a background color to the div just to show that nothing was transparent, and I also added a always on top function for viewing a section, and I hope you enjoy!
.Venn {
background: linear-gradient(to bottom right, blue, lightblue);
}
.d1:hover, .d2:hover, .d3:hover {
color: #565656;
animation: top 2s steps(2, end) forwards;
-webkit-animation: top 2s steps(2, end) forwards;
box-shadow: 0px 0px 20px white;
}
.d1, .d2, .d3 {
overflow-wrap: break-word;
}
.d1 center, .d3 center {
position: absolute;
top: 50%;
left: 50%;
transform: translateY(-50%) translateX(-50%);
}
.d1 {
padding: 10px;
width: 100px;
height: inherit;
z-index: 1;
position: absolute;
border-radius: 100%;
top: 0px;
}
.d3 {
padding: 10px;
width: 100px;
height: inherit;
z-index: 2;
position: absolute;
border-radius: 100%;
top: 0px;
left: 81px;
}
.d1:hover, .d3:hover {
transform: scale(1.05);
}
.d2 {
border-radius: 100% 0;
height: 90px;
width: 87.5px;
transform: rotate(-45deg) scale(.7);
position: absolute;
top: 15px;
left: 55.35px;
z-index: 3;
border: 1px solid black;
}
.d2b {
transform: rotate(45deg);
padding: 0;
margin: 0;
}
.d2b center {
position: relative;
left: 20px;
}
.d2:hover {
transform: rotate(-45deg);
}
.Venn {
height: 100px;
}
-webkit #keyframes top {
99% {
z-index: previous;
background-image: none;
}
100% {
z-index: 7;
}
}
#keyframes top {
99% {
z-index: previous;
background-image: none;
}
100% {
z-index: 7;
}
}
<div class="Venn" style="position: relative; left: 50px; width: 300px; height: 100px;">
<div class="d1" style=" background-color: grey;">
<center> 1 </center>
</div>
<div class="d2" style=" background-color: #AAAAAA;">
<div class="d2b" style="max-width: inherit;">
<center> 2 </center>
</div>
</div>
<div class="d3" style=" background-color: lightgrey;">
<center> 3 </center>
</div>
</div>
For those of you who would prefer a JSfiddle/ CodePen here you go a Codepen.

Transition HTML element from center in CSS3

I am trying to animate height property of an element using CSS but I want it from the center. Below is my code but it changes height from bottom.
.toggle {
position: absolute;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 50px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s;
}
#-webkit-keyframes height {
from {
height: 60px;
}
to {
height: 10px;
}
}
<div class="toggle">
<div class="left-border"></div>
</div>
Here is JSFIDDLE
You can use transform
from {
}
to {
transform: scaleY(0.1666);
}
0.1666 comes from 10px / 60px
Here you go. I use animation top instead of height. The red toggle also needs a 'container' now so I just used the one you had there. When changing the dimensions of the red toggle, change the outer wrapper, not the toggle element (it will fit to whatever the container is, both width and height wise)
https://jsfiddle.net/j2refncs/7/
.toggle {
width: 20px;
height: 40px;
background: #ccc;
position: relative;
.left-border {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s;
}
}
#-webkit-keyframes height {
from {
top: 0;
}
to {
top: 30px;
}
}
Just add top: 75px to the keyframe since the change in height is 50px. You want to reduce the height by 25px or half from both sides, top and bottom, to come to the desired 10px. So 50px / 2 + top: 50px = top: 75px:
.toggle {
position: absolute;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 50px; /* starting position from the top */
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #f00;
animation: height 2s;
}
#-webkit-keyframes height {
to {height: 10px; top: 75px} /* + ending position from the top */
}
<div class="toggle">
<div class="left-border"></div>
</div>
You can animate the top with the height to make the height change appear from the center:
.toggle {
position: relative;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 25px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s forwards;
}
#keyframes height {
from {
top: 25px;
height: 60px;
}
to {
top: 50px;
height: 10px;
}
}
<div class="toggle">
<div class="left-border"></div>
</div>
You can also use transform: scaleY() in the animation. The default transform origin is the center.
.toggle {
position: relative;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 25px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s forwards;
}
#keyframes height {
from {
transform: scaleY(1);
}
to {
transform: scaleY(0.167);
}
}
<div class="toggle">
<div class="left-border"></div>
</div>