【问题标题】:Vertically center a button inside a responsive container with pure CSS?使用纯 CSS 在响应式容器中垂直居中按钮?
【发布时间】:2014-05-12 19:01:37
【问题描述】:

所以我想做这个thumbnail effect

$(window).resize(setThumbHeight);
$(window).resize(centerBtn);

SEE HERE

如您所见,我编写了一些 JQuery 来设置容器高度并将 btn 居中,我认为这很愚蠢。

我有几个问题:
1.不使用JQuery如何保持容器的纵横比。
2. 如何使用纯 CSS 在容器内垂直居中按钮? (似乎有人用表格和表格单元完成了它)
3. 为什么后台网址不起作用? (我在 CSS 中注释掉了这一行。)

谢谢各位。

【问题讨论】:

  • 既然你已经依赖 jQuery,为什么还需要纯 CSS 解决方案?
  • IDK。也许这并不重要。我只是对我需要使用一些代码来垂直居中的事实感到不舒服。不过,我还有 2 个其他问题。
  • 这可以只用 CSS 来完成,不需要用 Javascript 过于复杂
  • 表解决方案jsfiddle.net/46psK/186

标签: javascript jquery css twitter-bootstrap responsive-design


【解决方案1】:

这是一个简单的跨浏览器方法来实现您想要做的事情:

http://codepen.io/aecend/pen/KEvBa

我没有处理任何 CSS 过渡,只关注居中。要保持容器尺寸,只需设置外部缩略图容器的宽度,高度会自动调整以适应。此外,背景网址似乎确实有效,图像本身覆盖了您小提琴中的背景。

HTML

<div class="thumbnail">
  <img src="http://placekitten.com/300/200">
  <div class="mask center-in-container"></div>
  <button class="button center-in-container">Enter</button>
</div>

CSS

.thumbnail {
  width: 30%;
  position: relative;
}
img {
  display: block;
  width: 100%;
  height: 100%;
}
.center-in-container {
  position: absolute;
  margin: auto;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
}
.button {
  width: 50px;
  height: 30px;
  display: none;
}
.mask {
  background-color: rgba(0,0,0,0.3);
  display: none;
}
.thumbnail:hover .button {
  display: block;
}
.thumbnail:hover .mask {
  display: block;
}

【讨论】:

    【解决方案2】:

    你可以用这个技巧使元素垂直居中:

    如果您更改按钮的宽度或高度,则更改边距值。

    -17px 是高度的一半,-30px 是宽度的一半

    .thumbnail-mask .btn{
        position:absolute;
        top:50%;
        left:50%;
        margin:-17px -30px;
    }
    

    对于放大图片,你可以使用这个:

    .my-thumbnail:hover img{
         -webkit-transform:scale(1.5);
         -moz-transform:scale(1.5);
         -o-transform:scale(1.5);
         -ms-transform:scale(1.5);
         transform:scale(1.5);
     }
    

    如果你想用背景css属性显示你的图片,你的容器上必须有高度.my-thumbnail

    【讨论】:

    • 老兄,这很聪明。我没有想到。一开始我想使用比例。但它对我的导航栏产生了一些奇怪的影响,我认为这是一个渲染错误。所以,我决定坚持简单的过渡。但是,嘿,少一个 JQuery。 jsfiddle.net/5hKXX/2
    【解决方案3】:

    哈希虫,

    除了您使用的 JavaScript 方法之外,没有针对您尝试执行的操作的动态、跨浏览器兼容的解决方案。

    如果您仍然不想使用 JavaScript,并且可以。由于这个不能跨浏览器工作,那么你可能想看看 CSS3 的 flexbox。正如我所说的,所有浏览器版本还不支持 flexbox,你可以在这里找到:caniuse.com。我做了一个小提琴来展示你的解决方案在这里用 flexbox 更新:

    http://jsfiddle.net/jpatterson69/z8uCK/

    .thumbnail-mask {
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 1;
        width: 100%;
        height: 100%;
        text-align: center;
        background: rgba(0,0,0,0.4);    
        opacity: 0;
    
      -webkit-transition: opacity 0.3s ease-out;
         -moz-transition: opacity 0.3s ease-out;
           -o-transition: opacity 0.3s ease-out;
          -ms-transition: opacity 0.3s ease-out;
              transition: opacity 0.3s ease-out;
    }
    

    我没有包括其他用户发布的任何“黑客”,因为它们通常会给您带来比需要的更多的冲突 - 与这些相比,您的解决方案是最简单的。请问为什么要使用flexbox?

    【讨论】:

    • 哇。以前从未听说过这些属性。很高兴知道。我不知道为什么。我只是不喜欢在设计工作中使用太多代码。如果你曾经在 PS 或 AI 中对齐两个对象,你就会知道这有多容易。而且我认为浏览器也应该支持。
    • 我同意。我从事前端 / UI / UX 开发人员已有 10 多年了,但我仍然对此感到愤怒。作为一个人 - 现在有很多网络/技术的东西有太多的选择。这是问题的一部分。 //结束咆哮
    • 我可能应该补充一点,aecend 的方法可以工作,只是不是在每个浏览器的所有版本中都有效——其中包括绝大多数。只是想明确一点,您的 javascript 解决方案将覆盖最广泛的受众并发挥最佳效果。
    • 我也刚刚阅读了 Cam 对您原始帖子的评论。当然可以用 CSS 完成,但 CSS 是否是最好的解决方案还有待商榷。
    • 有同感的人总是好事。 :) 感谢您的提醒。
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2012-01-05
    • 2014-11-16
    • 1970-01-01
    • 2014-09-02
    • 2014-03-05
    相关资源
    最近更新 更多