悬停时调整图像大小但保持纵横比和内部屏幕
Resize image on hover but keep aspect ratio and inside screen
这意味着只能在桌面上工作。
问题是,即使我设法在悬停时缩放图像并保持宽高比,我也无法获得流畅的悬停体验。
图像边界框(或父 div)比图像大,所以当用户滚动出图像时,缩放效果继续工作(逻辑上)加上屏幕右侧的图像,离开视图悬停时。
如何保持纵横比,保持屏幕上的图像,保持其余内容不变,并仅在用户将鼠标悬停在图像上时缩放(当用户停止悬停图像时返回默认值)。
.la-inversion {
max-width: 100%;
}
.la-inversion__izquierda img {
max-width: 100%;
}
.la-inversion__derecha__titulo {
font-size: 3.5rem;
margin-left: 2rem;
margin-top: 2.5rem;
}
.la-inversion__derecha__subtitulo {
margin-left: 2rem;
margin-top: 1rem;
width: 71.5%;
}
.la-inversion__derecha__imagenes {
margin-top: 1rem;
display: flex;
justify-content: space-evenly;
flex-direction: column;
}
.la-inversion__derecha__imagenes__derecha {
display: flex;
height: 90vw;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__derecha div {
width: 45vw;
height: 45vw;
overflow: hidden;
position: relative;
}
.la-inversion__derecha__imagenes__derecha div img {
position: absolute;
left: -1000%;
right: -1000%;
top: -1000%;
bottom: -1000%;
margin: auto;
min-height: 100%;
min-width: 100%;
max-width: 150%;
max-height: 150%;
}
.la-inversion__derecha__imagenes__derecha div:nth-child(2) {
align-self: flex-end;
}
.la-inversion__derecha__imagenes__izquierda {
display: flex;
height: 90vw;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__izquierda div {
height: 45vw;
width: 45vw;
overflow: hidden;
position: relative;
}
.la-inversion__derecha__imagenes__izquierda div img {
position: absolute;
left: -1000%;
right: -1000%;
top: -1000%;
bottom: -1000%;
margin: auto;
min-height: 100%;
min-width: 100%;
max-width: 150%;
max-height: 150%;
}
.la-inversion__derecha__imagenes__izquierda div:nth-child(2) {
align-self: flex-end;
}
.img-scale-div{
transition: .3s;
}
.img-scale-img{
transition: .3s;
}
@media only screen and (min-width: 769px) {
.img-scale-div:hover {
transform: scale(4, 4) translate(-2vw);
z-index: 2;
align-self: center;
outline: groove;
}
.img-scale-div:hover > .img-scale-img {
position: initial;
margin: 0;
min-height: 0;
min-width: 0;
max-width: 100%;
max-height: 100%;
}
.la-inversion {
display: flex;
-moz-column-gap: 7.5rem;
column-gap: 7.5rem;
width: calc( 100% - 9rem );
justify-content: center;
margin: 20rem auto 0;
}
.la-inversion__izquierda {
flex: 2 0 0;
}
.la-inversion__derecha {
flex: 1 0 0;
}
.la-inversion__derecha__subtitulo {
margin-left: 0rem;
width: auto;
-moz-column-count: 2;
column-count: 2;
font-size: 16px;
-moz-column-gap: 2rem;
column-gap: 2rem;
-moz-column-width: 234px;
column-width: 234px;
}
.la-inversion__derecha__imagenes {
flex-direction: row;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
margin-top: 4rem;
}
.la-inversion__derecha__imagenes__derecha {
height: 236px;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
}
.la-inversion__derecha__imagenes__derecha__titulo {
font-size: 4.5rem;
text-align: center;
margin-left: 0;
}
.la-inversion__derecha__imagenes__derecha div {
width: 118px;
height: 118px;
}
.la-inversion__derecha__imagenes__izquierda {
height: 236px;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
}
.la-inversion__derecha__imagenes__izquierda div {
width: 118px;
height: 118px;
}
}
<div class="la-inversion">
<div class="la-inversion__izquierda">
<img src="https://i.ibb.co/JktFp0J/imagen-vertical-inversion.png" alt="" >
</div>
<div class="la-inversion__derecha">
<h2 class="la-inversion__derecha__titulo">1. La Inversión</h2>
<p class="la-inversion__derecha__subtitulo">Rodeado de montañas, enclavado en un valle amplio con vegetación baja y autóctona que da la sensación de estar en plena estepa patagónica aunque en verdad nos encontramos dentro del bosque andino. <br><br>Suspendisse faucibus tincidunt pulvinar. Suspendisse quis tortor et sem lobortis auctor vehicula vitae libero. Aliquam nisl odio, sagittis.</p>
<div class="la-inversion__derecha__imagenes">
<div class="la-inversion__derecha__imagenes__derecha">
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/6R2XWkS/ba-o-vertical.jpg" alt="" srcset=""></div>
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/Jj5yHgt/ba-o-horizontal.jpg" alt="" srcset=""></div>
</div>
<div class="la-inversion__derecha__imagenes__izquierda">
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/SPpkq6Y/cocina-horizontal.jpg" alt="" srcset=""></div>
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/wMQzXxT/living-horizontal.jpg" alt="" srcset=""></div>
</div>
</div>
</div>
</div>
您需要获得自然尺寸的图像,为此您需要一些 javascript。
随意使用 dataset
从图像中获取初始大小值,我只是像写 css.
一样写它们
const onScaleImage = (e) => {
const image = e.target.closest('.img-scale-img');
if (image) {
if (e.type === 'mouseover') {
image.style.height = `${image.naturalHeight}px`;
image.style.width = `${image.naturalWidth}px`;
} else {
image.style.height = '118px';
image.style.width = '118px';
}
}
}
document.addEventListener('mouseover', onScaleImage)
document.addEventListener('mouseout', onScaleImage)
.la-inversion {
max-width: 100%;
}
.la-inversion__izquierda img {
max-width: 100%;
}
.la-inversion__derecha__titulo {
font-size: 3.5rem;
margin-left: 2rem;
margin-top: 2.5rem;
}
.la-inversion__derecha__subtitulo {
margin-left: 2rem;
margin-top: 1rem;
width: 71.5%;
}
.la-inversion__derecha__imagenes {
margin-top: 1rem;
display: flex;
justify-content: space-evenly;
flex-direction: column;
}
.la-inversion__derecha__imagenes__derecha {
display: flex;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__derecha div {
position: relative;
}
.la-inversion__derecha__imagenes__derecha div img {
height: 100%;
width: 100%;
object-fit: cover;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
.la-inversion__derecha__imagenes__derecha div:nth-child(2) {
align-self: flex-end;
}
.la-inversion__derecha__imagenes__izquierda {
display: flex;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__izquierda div {
position: relative;
}
.la-inversion__derecha__imagenes__izquierda div img {
height: 100%;
width: 100%;
object-fit: cover;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
.la-inversion__derecha__imagenes__izquierda div:nth-child(2) {
align-self: flex-end;
}
.img-scale-div{
transition: .3s;
}
.img-scale-img{
transition: .3s;
}
@media only screen and (min-width: 769px) {
.la-inversion {
display: flex;
-moz-column-gap: 7.5rem;
column-gap: 7.5rem;
width: calc( 100% - 9rem );
justify-content: center;
margin: 20rem auto 0;
}
.la-inversion__izquierda {
flex: 2 0 0;
}
.la-inversion__derecha {
flex: 1 0 0;
}
.la-inversion__derecha__subtitulo {
margin-left: 0rem;
width: auto;
-moz-column-count: 2;
column-count: 2;
font-size: 16px;
-moz-column-gap: 2rem;
column-gap: 2rem;
-moz-column-width: 234px;
column-width: 234px;
}
.la-inversion__derecha__imagenes {
flex-direction: row;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
margin-top: 4rem;
}
.la-inversion__derecha__imagenes__derecha {
height: 236px;
display: flex;
gap: 1.5rem;
}
.la-inversion__derecha__imagenes__derecha__titulo {
font-size: 4.5rem;
text-align: center;
margin-left: 0;
}
.img-scale-img:hover {
outline: groove;
}
.la-inversion__derecha__imagenes__derecha .img-scale-div {
width: 118px;
height: 118px;
}
.la-inversion__derecha__imagenes__izquierda {
height: 236px;
display: flex;
gap: 1.5rem;
}
.la-inversion__derecha__imagenes__izquierda .img-scale-div {
width: 118px;
height: 118px;
}
}
<div class="la-inversion">
<div class="la-inversion__izquierda">
<img src="https://i.ibb.co/JktFp0J/imagen-vertical-inversion.png" alt="" >
</div>
<div class="la-inversion__derecha">
<h2 class="la-inversion__derecha__titulo">1. La Inversión</h2>
<p class="la-inversion__derecha__subtitulo">Rodeado de montañas, enclavado en un valle amplio con vegetación baja y autóctona que da la sensación de estar en plena estepa patagónica aunque en verdad nos encontramos dentro del bosque andino. <br><br>Suspendisse faucibus tincidunt pulvinar. Suspendisse quis tortor et sem lobortis auctor vehicula vitae libero. Aliquam nisl odio, sagittis.</p>
<div class="la-inversion__derecha__imagenes">
<div class="la-inversion__derecha__imagenes__derecha">
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/6R2XWkS/ba-o-vertical.jpg" alt="" srcset=""></div></div>
<div> <div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/Jj5yHgt/ba-o-horizontal.jpg" alt="" srcset=""></div></div>
</div>
<div class="la-inversion__derecha__imagenes__izquierda">
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/SPpkq6Y/cocina-horizontal.jpg" alt="" srcset=""></div></div>
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/wMQzXxT/living-horizontal.jpg" alt="" srcset=""></div></div>
</div>
</div>
</div>
</div>
这意味着只能在桌面上工作。
问题是,即使我设法在悬停时缩放图像并保持宽高比,我也无法获得流畅的悬停体验。
图像边界框(或父 div)比图像大,所以当用户滚动出图像时,缩放效果继续工作(逻辑上)加上屏幕右侧的图像,离开视图悬停时。
如何保持纵横比,保持屏幕上的图像,保持其余内容不变,并仅在用户将鼠标悬停在图像上时缩放(当用户停止悬停图像时返回默认值)。
.la-inversion {
max-width: 100%;
}
.la-inversion__izquierda img {
max-width: 100%;
}
.la-inversion__derecha__titulo {
font-size: 3.5rem;
margin-left: 2rem;
margin-top: 2.5rem;
}
.la-inversion__derecha__subtitulo {
margin-left: 2rem;
margin-top: 1rem;
width: 71.5%;
}
.la-inversion__derecha__imagenes {
margin-top: 1rem;
display: flex;
justify-content: space-evenly;
flex-direction: column;
}
.la-inversion__derecha__imagenes__derecha {
display: flex;
height: 90vw;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__derecha div {
width: 45vw;
height: 45vw;
overflow: hidden;
position: relative;
}
.la-inversion__derecha__imagenes__derecha div img {
position: absolute;
left: -1000%;
right: -1000%;
top: -1000%;
bottom: -1000%;
margin: auto;
min-height: 100%;
min-width: 100%;
max-width: 150%;
max-height: 150%;
}
.la-inversion__derecha__imagenes__derecha div:nth-child(2) {
align-self: flex-end;
}
.la-inversion__derecha__imagenes__izquierda {
display: flex;
height: 90vw;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__izquierda div {
height: 45vw;
width: 45vw;
overflow: hidden;
position: relative;
}
.la-inversion__derecha__imagenes__izquierda div img {
position: absolute;
left: -1000%;
right: -1000%;
top: -1000%;
bottom: -1000%;
margin: auto;
min-height: 100%;
min-width: 100%;
max-width: 150%;
max-height: 150%;
}
.la-inversion__derecha__imagenes__izquierda div:nth-child(2) {
align-self: flex-end;
}
.img-scale-div{
transition: .3s;
}
.img-scale-img{
transition: .3s;
}
@media only screen and (min-width: 769px) {
.img-scale-div:hover {
transform: scale(4, 4) translate(-2vw);
z-index: 2;
align-self: center;
outline: groove;
}
.img-scale-div:hover > .img-scale-img {
position: initial;
margin: 0;
min-height: 0;
min-width: 0;
max-width: 100%;
max-height: 100%;
}
.la-inversion {
display: flex;
-moz-column-gap: 7.5rem;
column-gap: 7.5rem;
width: calc( 100% - 9rem );
justify-content: center;
margin: 20rem auto 0;
}
.la-inversion__izquierda {
flex: 2 0 0;
}
.la-inversion__derecha {
flex: 1 0 0;
}
.la-inversion__derecha__subtitulo {
margin-left: 0rem;
width: auto;
-moz-column-count: 2;
column-count: 2;
font-size: 16px;
-moz-column-gap: 2rem;
column-gap: 2rem;
-moz-column-width: 234px;
column-width: 234px;
}
.la-inversion__derecha__imagenes {
flex-direction: row;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
margin-top: 4rem;
}
.la-inversion__derecha__imagenes__derecha {
height: 236px;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
}
.la-inversion__derecha__imagenes__derecha__titulo {
font-size: 4.5rem;
text-align: center;
margin-left: 0;
}
.la-inversion__derecha__imagenes__derecha div {
width: 118px;
height: 118px;
}
.la-inversion__derecha__imagenes__izquierda {
height: 236px;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
}
.la-inversion__derecha__imagenes__izquierda div {
width: 118px;
height: 118px;
}
}
<div class="la-inversion">
<div class="la-inversion__izquierda">
<img src="https://i.ibb.co/JktFp0J/imagen-vertical-inversion.png" alt="" >
</div>
<div class="la-inversion__derecha">
<h2 class="la-inversion__derecha__titulo">1. La Inversión</h2>
<p class="la-inversion__derecha__subtitulo">Rodeado de montañas, enclavado en un valle amplio con vegetación baja y autóctona que da la sensación de estar en plena estepa patagónica aunque en verdad nos encontramos dentro del bosque andino. <br><br>Suspendisse faucibus tincidunt pulvinar. Suspendisse quis tortor et sem lobortis auctor vehicula vitae libero. Aliquam nisl odio, sagittis.</p>
<div class="la-inversion__derecha__imagenes">
<div class="la-inversion__derecha__imagenes__derecha">
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/6R2XWkS/ba-o-vertical.jpg" alt="" srcset=""></div>
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/Jj5yHgt/ba-o-horizontal.jpg" alt="" srcset=""></div>
</div>
<div class="la-inversion__derecha__imagenes__izquierda">
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/SPpkq6Y/cocina-horizontal.jpg" alt="" srcset=""></div>
<div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/wMQzXxT/living-horizontal.jpg" alt="" srcset=""></div>
</div>
</div>
</div>
</div>
您需要获得自然尺寸的图像,为此您需要一些 javascript。
随意使用 dataset
从图像中获取初始大小值,我只是像写 css.
const onScaleImage = (e) => {
const image = e.target.closest('.img-scale-img');
if (image) {
if (e.type === 'mouseover') {
image.style.height = `${image.naturalHeight}px`;
image.style.width = `${image.naturalWidth}px`;
} else {
image.style.height = '118px';
image.style.width = '118px';
}
}
}
document.addEventListener('mouseover', onScaleImage)
document.addEventListener('mouseout', onScaleImage)
.la-inversion {
max-width: 100%;
}
.la-inversion__izquierda img {
max-width: 100%;
}
.la-inversion__derecha__titulo {
font-size: 3.5rem;
margin-left: 2rem;
margin-top: 2.5rem;
}
.la-inversion__derecha__subtitulo {
margin-left: 2rem;
margin-top: 1rem;
width: 71.5%;
}
.la-inversion__derecha__imagenes {
margin-top: 1rem;
display: flex;
justify-content: space-evenly;
flex-direction: column;
}
.la-inversion__derecha__imagenes__derecha {
display: flex;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__derecha div {
position: relative;
}
.la-inversion__derecha__imagenes__derecha div img {
height: 100%;
width: 100%;
object-fit: cover;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
.la-inversion__derecha__imagenes__derecha div:nth-child(2) {
align-self: flex-end;
}
.la-inversion__derecha__imagenes__izquierda {
display: flex;
justify-content: space-evenly;
}
.la-inversion__derecha__imagenes__izquierda div {
position: relative;
}
.la-inversion__derecha__imagenes__izquierda div img {
height: 100%;
width: 100%;
object-fit: cover;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
.la-inversion__derecha__imagenes__izquierda div:nth-child(2) {
align-self: flex-end;
}
.img-scale-div{
transition: .3s;
}
.img-scale-img{
transition: .3s;
}
@media only screen and (min-width: 769px) {
.la-inversion {
display: flex;
-moz-column-gap: 7.5rem;
column-gap: 7.5rem;
width: calc( 100% - 9rem );
justify-content: center;
margin: 20rem auto 0;
}
.la-inversion__izquierda {
flex: 2 0 0;
}
.la-inversion__derecha {
flex: 1 0 0;
}
.la-inversion__derecha__subtitulo {
margin-left: 0rem;
width: auto;
-moz-column-count: 2;
column-count: 2;
font-size: 16px;
-moz-column-gap: 2rem;
column-gap: 2rem;
-moz-column-width: 234px;
column-width: 234px;
}
.la-inversion__derecha__imagenes {
flex-direction: row;
-moz-column-gap: 1.5rem;
column-gap: 1.5rem;
margin-top: 4rem;
}
.la-inversion__derecha__imagenes__derecha {
height: 236px;
display: flex;
gap: 1.5rem;
}
.la-inversion__derecha__imagenes__derecha__titulo {
font-size: 4.5rem;
text-align: center;
margin-left: 0;
}
.img-scale-img:hover {
outline: groove;
}
.la-inversion__derecha__imagenes__derecha .img-scale-div {
width: 118px;
height: 118px;
}
.la-inversion__derecha__imagenes__izquierda {
height: 236px;
display: flex;
gap: 1.5rem;
}
.la-inversion__derecha__imagenes__izquierda .img-scale-div {
width: 118px;
height: 118px;
}
}
<div class="la-inversion">
<div class="la-inversion__izquierda">
<img src="https://i.ibb.co/JktFp0J/imagen-vertical-inversion.png" alt="" >
</div>
<div class="la-inversion__derecha">
<h2 class="la-inversion__derecha__titulo">1. La Inversión</h2>
<p class="la-inversion__derecha__subtitulo">Rodeado de montañas, enclavado en un valle amplio con vegetación baja y autóctona que da la sensación de estar en plena estepa patagónica aunque en verdad nos encontramos dentro del bosque andino. <br><br>Suspendisse faucibus tincidunt pulvinar. Suspendisse quis tortor et sem lobortis auctor vehicula vitae libero. Aliquam nisl odio, sagittis.</p>
<div class="la-inversion__derecha__imagenes">
<div class="la-inversion__derecha__imagenes__derecha">
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/6R2XWkS/ba-o-vertical.jpg" alt="" srcset=""></div></div>
<div> <div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/Jj5yHgt/ba-o-horizontal.jpg" alt="" srcset=""></div></div>
</div>
<div class="la-inversion__derecha__imagenes__izquierda">
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/SPpkq6Y/cocina-horizontal.jpg" alt="" srcset=""></div></div>
<div><div class="img-scale-div"><img class="img-scale-img" src="https://i.ibb.co/wMQzXxT/living-horizontal.jpg" alt="" srcset=""></div></div>
</div>
</div>
</div>
</div>