【问题标题】:CSS Transform Translate to center of Window [duplicate]CSS变换转换到窗口中心[重复]
【发布时间】:2018-12-14 01:10:14
【问题描述】:

我有一个元素列表,并且在执行特定操作时,我想应用 css-transform 转换将其移动到窗口的中心。我知道 css-transform 用于相对移动元素,但我想知道是否可以将它绝对锚定在某个地方,即在窗口中间(灯箱样式)。我正在看一个类似于 iPad 音乐应用程序的动画,其中专辑封面翻转和居中。

注意:我想使用 css-transforms,因为它可以避免周围元素的回流。

名字

编辑:为了更好的说明,我创建了一个 JSfiddle:http://jsfiddle.net/bdtZc/,相关行:

.card:focus {
   -webkit-transform: rotateY(180deg);
}

【问题讨论】:

  • 也许这有助于How to Create a Responsive Centered Image in CSS3。他们使用transform: translate(-50%, -50%);
  • 什么动作,Jquery,css hover??
  • @Cam,我目前尝试在 css:focus 上执行此操作,我想避免使用 js 并有一个仅 css 的解决方案
  • 你可以轻松地做 postion: absolute;左:50%;最高:50%
  • 我刚试过,但是如果你改变定位,会打断卡片的翻转动画?据我所知,它还将强制回流。我认为我的问题没有解决方案

标签: html css webkit


【解决方案1】:

2017 年更新

由于我刚刚收到了另一个对此答案的赞成票,我想我会重新审视它。

对于当前的浏览器,您应该对其他答案中的 transform(-50%, -50%) 技术有好运,但这取决于您的内容容器的设置方式,可能不会导致窗口居中;它可能是容器的中心,可能比窗口小或大。

最新的浏览器支持视口单位(vh、vw),就视口居中而言,这将为您提供您正在寻找的内容。由于滚动,从当前位置到视口中心的动画将是一个不同的问题。

http://caniuse.com/#feat=viewport-units https://developer.mozilla.org/en-US/docs/Web/CSS/length(见 vh、vw)

没有 CSS 转换

您可以在不使用 css-transform 的情况下通过使用绝对定位来完成此操作:

(此处为完整代码:http://jsfiddle.net/wkgWg/

.posDiv
{
    position:absolute;
    top:0;
    left:0;
    margin:0;
    border:1px solid red;

    -moz-transition:all 2s;
    -webkit-transition:all 2s;
    -o-transition:all 2s;
    transition:all 2s;
}

.triggerElement:hover .posDiv
{
    top:50%;
    left:50%;
    margin-left:-50px;
    margin-top:-50px;

    -moz-transition:all 2s;
    -webkit-transition:all 2s;
    -o-transition:all 2s;
    transition:all 2s;
}

使用 CSS 变换

如果您想继续使用 CSS-Transform,您需要使用 JavaScript 计算转换的“中心”或结束位置,然后在运行时生成并附加转换语句。您的原点变换向量需要从“中心到屏幕”向量中减去。

这是通过 jQuery.transit plugin by Rico Sta. Cruz 使用 css-transform(如果支持)的 javascript 版本。

(这里是完整的小提琴:http://jsfiddle.net/ZqpGL/263/

$(function() {
    var $cards = $('.card');
    var cardInFocus = null;


    $cards.each(function(index, elem) {
        var $elem = $(elem);
        var pos = $elem.position();
        $(elem).data('orig-x', pos.left);
        $(elem).data('orig-y', pos.top);
    });

    var reset = function() {
        if (cardInFocus) {
            $(cardInFocus).transition({
                x: 0,
                y: 0
            });
        }
    };

    $cards.on('focus', function(e) {
        reset();
        cardInFocus = this;
        var $doc = $(document);
        var centerX = $doc.width() / 2;
        var centerY = $doc.height() / 2;
        var $card = $(this);
        var origX = $card.data('orig-x');
        var origY = $card.data('orig-y');
        $(this).transition({
            x: centerX - origX,
            y: centerY - origY
        });
    });

    $cards.on('blur', function(e) {
        reset();
    });

});

【讨论】:

  • 是的,我可以用绝对定位做到这一点,但关键是由于定位变化和回流,这是不可取的
  • 我已经用 css-transform 版本更新了我的答案。
  • 对于这种方法,您需要知道元素的大小,因此它必须是固定大小的,或者您需要 javascript 来计算大小。 This approach with transform: translate(-50%, -50%) 更优雅,性能更好。
  • 你有没有 jQuery 或没有任何插件的“使用 CSS 转换”
【解决方案2】:

CSS-Tricks (http://css-tricks.com/centering-percentage-widthheight-elements/) 的一篇文章指出,可以混合使用绝对定位和平移,而无需借助 JS。

这有助于限制重排,即使在元素或屏幕大小发生变化时也能保持元素居中。

.center {
    position: absolute;
    left: 50%;
    top: 50%;

    /*
    Nope =(
    margin-left: -25%;
    margin-top: -25%;
    */

    /* 
    Yep!
    */
    transform: translate(-50%, -50%);

    /*
    Not even necessary really. 
    e.g. Height could be left out!
    */
    width: 40%;
    height: 50%;
}

【讨论】:

【解决方案3】:

您现在可以在纯 CSS 中使用 vh(视图高度)单元来实现。它总是相对于屏幕大小,而不是元素本身:

/* position element in middle of screen */
translateY(calc(50vh))

所以如果你知道元素的高度(比如height:320px),你就可以将它精确地移动到屏幕的中心。

/* moves the element down exactly off the bottom of the screen */
translateY(calc(50vh - 160px))

【讨论】:

  • 或者只是translateY(calc(50vh - 50%))
  • 虽然这个答案太老了,但我 -1'ed 因为翻译“移动”,它没有定位。所以这只有在元素已经位于 (0, 0) 时才有效,否则它只会扩展页面。
【解决方案4】:

我建议为此研究一个 JS 解决方案,因为这对于不同尺寸的图像会产生问题,但既然您要求的是 CSS 解决方案......

你可以像这样使用关键帧动画来实现这个效果:jsFiddle

.card:focus {
    transition:all 2s;
    position: absolute;
    animation: center 3s forwards;
}

@keyframes center {
    0% {
        top:0%;
        left:0%;
    }
    100% {
        top:45%;
        left:45%;
        -webkit-transform: rotateY(180deg);
        transform: rotateY(180deg);
    }
}

编辑: 这是一个使用

rough 更好的 jQuery 版本

position:relative;

jsFiddle

$('.card').focusin(function () {
    var tc = $(window).height() / 2 - $('.card').height() / 2;
    var lc = $(window).width() / 2 - $('.card').width() / 2 - $(this).offset().left;

    $(this).animate({
        left: lc,
        top: tc
    });
});

$('.card').focusout(function () {
    $(this).animate({
        top: 0,
        left: 0
    });
});

【讨论】:

  • 感谢您的详尽回答。我应该强调我想使用转换,因为它可以避免网格的回流。
  • 是的,我最终计算了偏移量,但随后使用该偏移量动态设置转换,因为它们的性能更高(虽然不是非常跨浏览器)
  • @nambrot 如果它对您有用,请将其发布为答案,您最终可能会帮助那些对您的问题投赞成票的人。您到底遇到了哪些跨浏览器问题?
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2015-09-01
  • 2011-07-14
  • 2013-03-15
相关资源
最近更新 更多