zoukankan      html  css  js  c++  java
  • CSS开发技巧(三):图片点击缩放

    前言

     利用CSS实现图片的点击缩放是一个很值得研究的效果。在某些业务需求场景中,我们可能并没有足够的空间展示过大的图片,这就需要限制图片容器的宽度和高度。然而图片限制了宽度,一些图片的细节便又无法看清。
     实现这种需求的一种直观方式是固定图片宽高,然后提供点击缩放的功能,这是本文要讨论的要点。
     需要额外说明的是,CSS实现业务需求的方式是灵活的,这与开发者的功底也是密切相关的,实现上述的业务需求并非只有一种方式,甚至限于作者水平,以下所述也是不完善的,仅作分享,读者可自行探索和发挥。

    一、需求关键点

    1、固定宽高

    2、点击放大

    3、再次点击缩小

    4、优先用CSS实现

     这里强调了优先使用CSS,这是因为同样的效果,使用CSS实现一般而言性能更好。况且使用JS直接修改样式,易导致维护时难以定位问题。在开发中,建议实现JS和CSS的松耦合。这对代码优雅有利,利于后期维护。

    二、HTML结构

        <div class="img-container">
            <img src="./test.jpg" alt="案例图片" class="img">
        </div>
    

    以上,只有两层结构,我们的CSS都作用于这两层元素上。个人观点,HTML结构越简单越加清晰。只有当简单的HTML实在无法实现相关业务需求时,才建议添加元素用于实现复杂效果。

    三、CSS代码

    1、给容器设置固定宽高

    2、将img元素设置为容器的宽高

    3、设置img元素放大时的样式

    4、适当使用定位

            .img-container{
                position: relative;
    
                 100px;
                height: 100px;
            }
            .img-container .img{
                height: 100%;
                 100%;
                cursor: pointer;
            }
            .img-container .img.active{
                position: absolute;
    
                height: 400%;
                 400%;
            }
    

    四、JS代码

     1、本文主要讨论CSS,但要实现图片点击缩放,光使用CSS hover伪类的体验并不佳,鼠标移开就失去放大效果,无法悬停,因此使用JS的点击事件来进行监听。
     2、JS部分的主要思想是改变图片的类名,这样可以实现JS和CSS的松耦合,避免JS直接改变样式,利于维护。

            var img = document.getElementsByClassName('img');
            
            // 点击图片本身
            img[0].addEventListener('click',function(e){
                // 防止被document监听到
                e.stopPropagation();
    
                const isExpand = this.className.indexOf('active') !== -1;
    
                if (!isExpand) {
                    this.className += ' active';
                } else{
                    this.className = this.className.replace('active', '');
                } ;
            });
            
            // 点击其他位置
            document.addEventListener('click',function(e){
                img[0].className = img[0].className.replace('active', '');
            });
    

     以上JS部分显得有些繁琐,事实上,这是使用原生JS时几乎必然会呈现的特点。假如使用Vue.js这样的双向绑定框架,对类名进行绑定,那么JS将简单到只需几句代码。或者使用jquery这样的库,那么也将极大简化。

    五、优化改进

     以下是几个可以适当优化提升的地方:

    1、设置酷炫的动画效果;

    2、兼容性问题。

  • 相关阅读:
    分享分享JavaScript100例-仅供参考
    为每个页面加上Session判断
    Javascript实现真实字符串剩余字数提示
    格式与文件扩展名指定的格式不一致
    谈谈Github Universe 2019
    合并两个有序链表的golang实现
    二叉搜索树的最近公共祖先的golang实现
    验证二叉搜索树的golang实现
    三数之和的golang实现
    有效的字母异位词的golang实现
  • 原文地址:https://www.cnblogs.com/twodog/p/12134749.html
Copyright © 2011-2022 走看看