花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 43|回复: 13

自定义元素缩放

[复制链接]
  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

    发表于 2025-11-3 12:33 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 马黑黑 于 2025-11-3 12:35 编辑

    对业已存在的元素进行缩放,有多种实现方式。最容易想到的方法是利用CSS的 transform 的 scale() 函数,它接收一个倍数数值作为参数对元素进行原地缩放操作,不触发layout重置即不会重排DOM从而不影响排版,性能和用户体验都很理想,但它的应用需要一个前提:此前未对元素使用过 transform 属性,否则实现过程会复杂化——需要检测用过的一系列transform下的函数然后再设计一个插入 scale 机制。第二个想到的方法是使用 zoom 属性,这是一个非CSS标准下的属性,它来源于IE并被绝大多数现代浏览器一直支持(现在的Firefox也已支持)。使用 zoom 非常简单,像设置CSS属性值那样做即可,其值也是一个倍数数值。zoom 的特点主要有,一是会触发layout重置,引发DOM重排;二是缩放后以实际缩放的尺寸占位;三是它以元素的左上角为缩放中心,在Firefox下缩放中心点的表现会有一些古怪的现象。第三个想到的方法就是改变元素的宽高尺寸,本文要谈的就是这个。

    设想是这样:获取元素的宽高尺寸,然后将宽高在 0.5~2 之间随机缩放。下面是完整的示例,里面创建了一个 ranZoom() 函数,可根据需要对函数进行适应性、扩展性修改:

    <style> .mum { margin: 20px auto; width: 800px; height: 600px; border: 1px solid gray; position: relative; } .son { margin-bottom: 40px; width: 200px; height: 200px; background: tan; display: grid; place-items: center; position: relative; } .son::before { position: absolute; content: attr(data-tip); width: 200px; left: 0; top: -30px; text-align: center; } .zoom { zoom: 1.5; } #btnZoom { position: absolute; bottom: 20px; right: 20px; } </style> <div class="mum"> <div class="son">200 * 200</div> <div class="son" data-tip="200 * 200"></div> <button id="btnZoom" type="button" value="">Zoom</button> </div> <script> const ranZoom = (element) => { const getSize = (str) => { const match = str.match(/^([+-]?\d*\.?\d+)([a-zA-Z%]+)$/); if (match) return {size: match[1], unit: match[2]}; return null; }; const ranNum = (max,min) => (Math.random() * (max - min) + min).toFixed(2); const zoom = ranNum(0.5, 1.5); const style = window.getComputedStyle(element); let width = style.getPropertyValue('width'), height = style.getPropertyValue('height'); element.style.width = Math.ceil(getSize(width).size * zoom) + getSize(width).unit; element.style.height = Math.ceil(getSize(height).size * zoom) + getSize(height).unit; element.dataset.tip = element.clientWidth + ' * ' + element.clientHeight; element.innerText = zoom; }; const el = document.querySelectorAll('.son'); ranZoom(el[1]); // 缩放第二个子元素 btnZoom.onclick = () => ranZoom(el[1]); </script>

    ranZoom() 函数从 window.getComputedStyle API 中获得元素的宽高尺寸,是元素最终渲染的尺寸,所以,点击按钮对元素进行缩放时总是以元素的上一次实际尺寸为基准。

    上述自定义的实现元素缩放方法,本质上和 zoom 属性实现的手段差不多。事实上,我们还有一个更为简单易用的做法,那就是利用 CSS 的 scale 属性。自 2022年8月起,所有现代浏览器均已完全支持此属性以及 rotate 和 translate,但 skew 尚未得到支持。这些原本是 transform 属性使用的函数升级为独立属性之后具备了足够的灵活性,例如,针对本文开头提出的 transform 问题不再存在,即当一个元素之前使用了 transform 的相关属性,我们仍然可以直接使用 scale 属性对之进行自由缩放,彼此间不存在任何冲突。

    评分

    参与人数 4威望 +160 金钱 +320 经验 +160 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    杨帆 + 30 + 60 + 30 精品文章!
    樵歌 + 50 + 100 + 50 精彩帖子!
    梦江南 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2025-11-27 09:01
  • 签到天数: 591 天

    [LV.9]以坛为家II

    377

    主题

    1万

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师花潮贵宾

    发表于 2025-11-3 14:52 | 显示全部楼层
    谢谢黑黑老师辛苦!学习了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-30 07:59
  • 签到天数: 634 天

    [LV.9]以坛为家II

    1368

    主题

    7万

    回帖

    14万

    积分

    管理员

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

    花潮帅哥多彩人生海样胸怀春风拂面青草情怀心曲飞扬七彩绚丽活泼开朗男儿情怀鹰傲苍穹共看流星风雨同行我心永远天长地久幸福快乐春意盎然喜乐安康心想事成周年庆指尖上的流年舞会之星情人节花潮管理

    发表于 2025-11-3 17:27 | 显示全部楼层
    应该非常 实用,可惜,我不会
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-3 17:49 | 显示全部楼层
    樵歌 发表于 2025-11-3 17:27
    应该非常 实用,可惜,我不会

    用用就会
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-3 17:50 | 显示全部楼层
    梦江南 发表于 2025-11-3 14:52
    谢谢黑黑老师辛苦!学习了!

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-11-30 00:22
  • 签到天数: 380 天

    [LV.9]以坛为家II

    296

    主题

    2548

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2025-11-3 19:10 | 显示全部楼层
    对元素缩放又多了一条新路径,谢谢马老师经典探索
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-3 19:15 | 显示全部楼层
    杨帆 发表于 2025-11-3 19:10
    对元素缩放又多了一条新路径,谢谢马老师经典探索

    第四种方法最好,tz.v2 使用第四个实现方案
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-11-30 00:22
  • 签到天数: 380 天

    [LV.9]以坛为家II

    296

    主题

    2548

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2025-11-3 22:48 | 显示全部楼层
    马黑黑 发表于 2025-11-3 19:15
    第四种方法最好,tz.v2 使用第四个实现方案

    谢谢马老师~还是不太明白,文中提到共3个方法呀,尝试一下
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-3 23:47 | 显示全部楼层
    杨帆 发表于 2025-11-3 22:48
    谢谢马老师~还是不太明白,文中提到共3个方法呀,尝试一下

    你看文章的最后一段
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-11-30 00:22
  • 签到天数: 380 天

    [LV.9]以坛为家II

    296

    主题

    2548

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2025-11-4 16:18 | 显示全部楼层
    马黑黑 发表于 2025-11-3 23:47
    你看文章的最后一段

    明白了,谢谢老师~最后一段说的就是第四个方法:新增的CSS 的 scale 属性。
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-4 21:51 | 显示全部楼层
    “点击按钮对元素进行缩放时总是以元素的上一次实际尺寸为基准。”
    原来如此,还以为是200*200为基准呢,点击后感觉有点问题,其实是以上一次的尺寸为准的。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-4 21:52 | 显示全部楼层
    谢谢黑黑的讲解,又可以多了解点缩放的方法了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-4 21:54 | 显示全部楼层
    红影 发表于 2025-11-4 21:52
    谢谢黑黑的讲解,又可以多了解点缩放的方法了

    方法多多,哪个看顺眼用哪个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-30 07:45
  • 签到天数: 1655 天

    [LV.Master]伴坛终老

    3024

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2025-11-4 21:55 | 显示全部楼层
    红影 发表于 2025-11-4 21:51
    “点击按钮对元素进行缩放时总是以元素的上一次实际尺寸为基准。”
    原来如此,还以为是200*200为基准呢, ...

    这和函数设置有关:说明里提到的。

    可以设置为其它的方式,总是在 200*200这个基准缩放
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-11-30 14:28 , Processed in 0.090772 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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