资讯专栏INFORMATION COLUMN

从一个居中方法说起 —— 谈 translate 与 相对、绝对定位

DandJ / 3230人阅读

摘要:方法介绍垂直水平居中是日常前端开发当中一个常见的需求,在支持属性的现代浏览器当中,有一个利用属性的垂直水平居中方法例子传送门请用现代浏览器打开从上面的例子看到,无论我们怎样调整窗口的大小,红色方块始终会在窗口垂直水平居中。

方法介绍

垂直水平居中是日常前端开发当中一个常见的需求,在支持 CSS3 属性的现代浏览器当中,有一个利用 CSS3 属性的垂直水平居中方法:

    .center {
        position: absolute;
        top: 50%;
        left: 50%;
        -ms-transform: translate(-50%,-50%);
        -moz-transform: translate(-50%,-50%);
        -o-transform: translate(-50%,-50%);
        transform: translate(-50%,-50%); 
    }

例子传送门(请用现代浏览器打开)

从上面的例子看到,无论我们怎样调整窗口的大小,红色方块始终会在窗口垂直、水平居中。

原理

为了解释原理,我们创建两个元素:

    

先不加上 transform 属性:

    #outer {
        position: relative;
        width: 500px;
        height: 500px;
        border: 2px solid yellow;
    }
    
    #inner {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 100px;
        height: 100px;
        background-color: red;
    }

未加上 transform 属性的例子。

可以看到红色方块左、上方距离外层方块的距离都是250个像素,如果我们想实现垂直水平居中,就应该将红色方块的中心点移动到目前元素左上角的位置,也就是分别向上和向左移动一半方块边长的长度,50个像素。

     #inner {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 100px;
        height: 100px;
        background-color: red;
        -ms-transform: translate(-50%,-50%);
        -moz-transform: translate(-50%,-50%);
        -o-transform: translate(-50%,-50%);
        transform: translate(-50%,-50%);
    }

加上 transform 属性。

所以我们可以看到在 translate 函数当中使用百分比是以该元素的内容区、补白(padding)、边框(border)为标准计算的,为了说明这一点,我们在 innner 元素加上一些 paddingborder:

    #inner {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 100px;
        height: 100px;
        border: 25px solid yellow;
        padding: 25px;
        background-color: red;
        -ms-transform: translate(-50%,-50%);
        -moz-transform: translate(-50%,-50%);
        -o-transform: translate(-50%,-50%);
        transform: translate(-50%,-50%);
   }

加上 paddingborder 以后。

可以看到 inner 元素一样做到了垂直、水平居中。

translate 与绝对定位、相对定位

在表现上看,使用 CSS3 translate 函数和绝对定位、相对定位属性加上 topleft 数值都可以使元素产生位移。实际上它们还是有不少的区别。

元素视图属性中的 offsetLeftoffsetTop 属性。

我们分别用相对定位和 translate 的方法来使元素产生位移:

    #box1 {
        position: relative;
        width: 50px;
        height: 50px;
        background-color: blue;
        top: 100px;
        left: 300px;
   }
   #box2 {
       width: 50px;
       height: 50px;
       background-color: red;
       -ms-transform: translate(300px,100px);
       -moz-transform: translate(300px,100px);
       -o-transform: translate(300px,100px);
       transform: translate(300px,100px);
   }

然后看看两者的 offsetTopoffsetLeft 的数值:

    var box1 = document.getElementById("box1");
    
    alert(box1.offsetLeft);
    alert(box1.offsetTop);
    var box2 = document.getElementById("box1");
    
    alert(box2.offsetLeft);
    alert(box2.offsetTop);

使用相对定位的例子

使用 translate 的例子

可以看出使用 translate 的例子的 offsetTopoffsetLeft 的数值与没有产生位移的元素没有然后区别,无论位移多少这两个数值都是固定不变的。

而使用相对定位的例子 offsetTopoffsetLeft 的数值则根据位移的长度发生了改变。

动画表现的区别

在 CSS3 属性还没很好地被浏览器支持的时候,我们常常会使用绝对定位(position:absolute),然后结合 jQuery 改变元素的 topleft 的数值来做位移的动画效果。

然而,两者在位移动画的表现上也有一定的区别。借用国外博主 Paul Irish 的两个例子:

Animating with Top/Left

Animating with Translate

对比两个例子来看,可以看出使用 translate 来制作的动画比绝对定位的动画更加平滑。

原因在于使用绝对定位的动画效果会受制于利用像素(px)为单位进行位移,而使用 translate 函数的动画则可以不受像素的影响,以更小的单位进行位移。

另外,绝对定位的动画效果完全使用 CPU 进行计算,而使用 translate 函数的动画则是利用 GPU,因此在视觉上使用 translate 函数的动画可以有比绝对定位动画有更高的帧数。

最后

CSS3 动画相关的属性出现以后,可以让我们更加轻松地制作复杂的动画,同时 position:relativeposition:absolute 这一类的属性可以回归它们原本的定位,为定位、布局服务,而将动画的重任交给 CSS3 的相关属性。

感谢您的阅读,有不足之处请为我指出。

参考

Why Moving Elements With Translate() Is Better Than Pos:abs Top/left

本文同步于我的个人博客 http://blog.acwong.org/2014/12/21/css3-middle-translate-and-relative/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110985.html

相关文章

  • css魔幻属性跟进篇

    摘要:中是这样定义的属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。其同样适用于设置属性为绝对定位或固定定位的内联元素。至于为什么,可以理解为内联元素没有盒模型,其高度由内容决定。 白话:即上一篇我脑中飘来飘去的css魔幻属性自己的文章推出之后,这是自己写的第四篇CSS相关的文章,文章绝大部分是自己工作总结得来,另一部分是平日sf回答的与面试中向面试官交流学到的,都是一...

    oogh 评论0 收藏0
  • CSS 布局经典问题初步整理

    摘要:布局经典问题初步整理标签前端本文主要对布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负,清除浮动,居中布局,响应式设计,布局,等等。 CSS 布局经典问题初步整理 标签 : 前端 [TOC] 本文主要对 CSS 布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负 margin,清除浮动,居中布局,响应式设计,Fl...

    Amos 评论0 收藏0
  • 整理:子容器垂直居中于父容器的方案

    摘要:子容器溢出时,父容器出现滚动条。父容器或很显然,子容器溢出时,被父容器截断的情形无法和父容器自适应于子容器共存。现在这个布局可以自动生成,详见林小志的小工具图片垂直居中。溢出子容器溢出时会变成顶对齐,原因同上。 本文在evernote里有备份。如果evernote的阅读区域嫌窄了,那么可以把这个链接拖入书签并点击javascript:jQuery(#container).width(9...

    youkede 评论0 收藏0
  • 水平居中、垂直居中、水平垂直居中、浮动居中绝对定位居中.......帮你搞定

    摘要:包括水平居中,垂直居中,还有水平垂直居中。如果要再要细分,还要分浮动元素绝对定位的居中。样式水平居中的元素图片的水平居中图片的居中,比较特殊。 2018.05.29 居中一个元素?你会想到啥?这里面的知识还真不少。包括水平居中,垂直居中,还有水平垂直居中。如果要再要细分,还要分浮动元素、绝对定位的居中。为了代码简介,没有加背景和其他样式,需要看效果的,可以加上背景。 目录: 第一...

    waterc 评论0 收藏0
  • CSS || 元素垂直居中笔记

    摘要:种元素垂直居中根据不同情况,使用的垂直居中方式各异针对块级元素与行级元素的垂直居中不同。行级元素行内包含特殊元素如果行内包含特殊元素图片输入框元素或者粗体使用设置对齐方式即可垂直居中。 CSS种元素垂直居中 根据不同情况,使用的垂直居中方式各异:针对块级元素与行级元素的垂直居中不同。 1 行级元素 1.1 行内包含特殊元素 如果行内包含特殊元素:图片、input输入框、inline-...

    VPointer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<