春節
快樂

花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 7|回复: 2

元素水平方向自居中测试

[复制链接]
  • TA的每日心情
    奋斗
    2026-2-22 12:54
  • 签到天数: 1739 天

    [LV.Master]伴坛终老

    3113

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-2-22 13:05 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
  • TA的每日心情
    奋斗
    2026-2-22 12:54
  • 签到天数: 1739 天

    [LV.Master]伴坛终老

    3113

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-2-22 13:38 | 显示全部楼层
    元素在视口水平方向自居中的实现原理:先获取元素所在的父元素的相关值,主要是——

    其一,父元素左侧离浏览器视口左边缘的距离。这叫偏移量,它可以视为是元素的left属性值(严谨的话还应该让父元素的 margin、padding 等属性值参与计算);
    其二,元素自身的宽度;
    其三,视口宽度(window.innerWidth)。

    依据获取到的上述各值,我们要计算的是元素初始状态下的中心点和浏览器视口中心点的差距,其结果就是元素的偏移量,我们用 transform 属性的 translateX 将其平移即可。以下是 JS 核心函数:

    1. function setElmCenter (elm) {
    2.     const pa = elm.parentNode; // 获取父元素
    3.     const rect = pa.getBoundingClientRect(); // 获取父元素的矩形数据
    4.     const winCenter = window.innerWidth / 2; // 浏览器视口水平方向中心点
    5.     const offsetX = winCenter - (rect.left + elm.offsetWidth / 2); // 计算偏移量
    6.     elm.style.setProperty('--offsetX', `${offsetX}px`); // 通过CSS变量驱动元素平移
    7. }
    复制代码
    【附】元素的CSS变量设计:
    1. transform: translateX(var(--offsetX));
    复制代码
    同时需要注意:元素的 position 属性设置为 relative,left 默认(不设置),margin-left 为 0,这样才能配套 JS 的自动居中定位功能。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-2-22 12:54
  • 签到天数: 1739 天

    [LV.Master]伴坛终老

    3113

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-2-22 13:51 | 显示全部楼层
    一楼加入了 document.onresize 事件,这样,不论浏览器窗口变大变小,毛玻璃效果的元素始终保持水平居中状态。

    单独设置元素自居中的方式还有一种做法:为元素创建一个父元素,此父元素 position 去绝对定位 absolute、left 属性为 0,宽度100vw减去20(20是浏览器的滚动条厚度),并使用 grid 布局且约束子元素水平居中,并在获取元素的爷爷元素偏移量之后,使用 transform 的 translateX 将其平移负偏移量、使其与浏览器视口左边缘重合。这个方法还需要撑开元素的爷爷元素的高度,可以考虑的做法是直接设置爷爷元素的高度等于元素的高度(offsetHeight)。

    第一种方法较为简洁,第二种方法认为增加的额外考虑的因素过多、略显复杂。

    不论使用哪一种实现方法,若追究极致的精准度的话,细节处理都要比这里展示的过程要复杂。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-2-22 15:13 , Processed in 0.177765 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表