我得到了一个div,当用户悬停在它上面时,它会将背景更改为图像.当用户将鼠标悬停在背景上时,背景效果很好,变换效果得到平滑应用,但当用户移除鼠标时,图像会突然消失.

我不希望发生这种情况,我希望图像具有缩小效果,就像div中的文本一样,一旦效果完成,背景将更改为默认背景,并且不会在没有任何效果的情况下突然消失.

我怎样才能做到?

这是我的部门:

html,
body {
  margin: 0px;
  padding: 0px;
}
.wrapper {
  max-width: 1200px;
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}
.container {
  width: 45%;
  margin: 20px;
  height: 300px;
  border: 3px solid #eee;
  overflow: hidden;
  position: relative;
  display: inline-block;
  cursor: pointer;
}
.child {
  height: 100%;
  width: 100%;
  background-size: cover;
  background-repeat: no-repeat;
  -webkit-transition: all .5s;
  -moz-transition: all .5s;
  -o-transition: all .5s;
  transition: all .5s;
  background-color: darkgray;
}
span {
  display: block;
  font-size: 35px;
  color: #ffffff !important;
  font-family: sans-serif;
  text-align: center;
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  height: 50px;
  cursor: pointer;
  text-decoration: none;
}
.container:hover .child,
.container:focus .child {
  background-image: url(https://images.freeimages.com/images/large-previews/de7/energy-1-1176465.jpg);
  -ms-transform: scale(1.2);
  -moz-transform: scale(1.2);
  -webkit-transform: scale(1.2);
  -o-transform: scale(1.2);
  transform: scale(1.2);
}
.container:hover .child:before,
.container:focus .child:before {
  display: block;
}
.child:before {
  content: "";
  display: none;
  height: 100%;
  width: 100%;
  position: absolute;
  top: 0;
  left: 0;
  background-color: rgba(52, 73, 94, 0.75);
}
<div class="wrapper">
  <div class="container">
    <div class="child">
      <span>Text</span>
    </div>
  </div>
</div>

推荐答案

下面是一些使用display: grid并将图像放入HTML的简化CSS

  • 图像以opacity: 0开头,悬停后变为opacity: 0.75
  • 图像是在悬停时增加大小的项目,这样文本就不会被剪切
  • 通过向任意项添加style="--colorHover: red"来更改悬停重音.容器
  • 在更大的屏幕上,项目之间的差距更大

此外,你的浏览器会喜欢你,因为悬停时更改的属性不会触发布局,除了背景色之外,它不会触发绘制!请参阅此处了解更多详细信息https://csstriggers.com

* { box-sizing: border-box } body { font: 16px sans-serif; margin: 0 }


:root {
  --bgImg: url('https://images.freeimages.com/images/large-previews/de7/energy-1-1176465.jpg');
  --colorDefault: darkgray;
  --colorHover: black;
  --columnWidth: 1;
  --transTime: 660ms;
  --transFunc: cubic-bezier(0.77, 0, 0.175, 1);
  --wrapperGap: 1rem;
}
@media (min-width: 768px) { :root { --wrapperGap: 1.5rem } }
@media (min-width: 1200px) { :root { --wrapperGap: 2rem } }

.wrapper {
  display: flex;
  flex-wrap: wrap;
  gap: var(--wrapperGap);
  justify-content: center;
  margin: auto;
  max-width: 1200px;
  padding: var(--wrapperGap);
  text-align: center;
}
.container {
  border: 3px solid #eee;
  cursor: pointer;
  flex: 0 0 auto;
  width: calc( ( var(--columnWidth) * 50% ) - ( var(--wrapperGap) / 2 ) ) ;
  overflow: hidden;
}
.child {
  background-color: var(--colorDefault);
  display: grid;
  height: 100%; width: 100%;
  place-items: center;

  transition: background-color var(--transTime) var(--transFunc);
}
.child > * { grid-area: 1/1/-1/-1 }
.child .txt {
  color: #ffffff;
  cursor: pointer;
  font-size: 35px;
  text-align: center;
  z-index: 1;
}
.child .img {
  aspect-ratio: var(--columnWidth)/1;
  background-image: var(--bgImg);
  background-size: cover;
  opacity: 0;
  width: 100%;
  
  transition: opacity calc(var(--transTime) * 2) var(--transFunc), transform var(--transTime) var(--transFunc);
}

.container:hover .child {
  background-color: var(--colorHover);
  transition: background-color var(--transTime) calc(var(--transTime) / 2) var(--transFunc);
}

.container:hover .child .img {
  opacity: 0.75;
  transform: scale(1.2);
  transition: opacity var(--transTime) var(--transFunc), transform calc(var(--transTime) * 2) var(--transFunc);
}
<div class="wrapper">
  <div class="container">
    <div class="child">
      <div class="img"></div>
      <div class="txt">Original Image</div>
    </div>
  </div>
  <div class="container" style="--colorHover: green; --bgImg: url('https://picsum.photos/600?random=1');">
    <div class="child">
      <div class="img"></div>
      <div class="txt">Random One</div>
    </div>
  </div>
  <div class="container" style="--colorHover: blue; --bgImg: url('https://picsum.photos/600?random=2');">
    <div class="child">
      <div class="img"></div>
      <div class="txt">Random Two</div>
    </div>
  </div>
  <div class="container" style="--colorHover: red; --bgImg: url('https://picsum.photos/600?random=3');">
    <div class="child">
      <div class="img"></div>
      <div class="txt">Random Three</div>
    </div>
  </div>
  <div class="container" style="--columnWidth: 2; --colorHover: purple; --colorDefault: pink; --bgImg: url('https://picsum.photos/600?random=4');">
    <div class="child">
      <div class="img"></div>
      <div class="txt">Random Four (large)</div>
    </div>
  </div>
</div>

Html相关问答推荐

在inline-box中设置线高会使CSS中的高度变得奇怪

Xpath:提取标签之间的文本,但一旦出现嵌入标签就停止

为什么使用Google字体的SVG徽标内的文本不能在网页上正确呈现?

如何阻止Chromecast图标出现在HTML5视频

垂直页眉,每行只显示一个使用css的字母

react :事件和转发器在特定代码段中不起作用

在Chrome中使用手写笔时,滚动条方向反转

如何在垂直堆叠的表格中调整人造列的大小?

使用`<;use>;`与`<;img>;`时呈现的SVG大小不同

如何将功能附加到嵌入式药剂中的按钮?

有没有一种方法可以很容易地将这个div从底部:0转换到顶部:0?

div 中的垂直中心表格

无法在 CSS 中将 h1 标签居中

如何在CSS伪类函数中使用复合 Select 器:host-context()

网页设计不适合移动设备

如何在 blazor 中单击单个按钮调用 2 个等待任务

我可以在标签元素中使用标题元素吗?

flex-box 中的图像在 Chrome 和 Firefox 中看起来不同 - 如何使它们在 Firefox 中看起来像?

无法从社交栏中 Select 选项

svg 内容超过元素