• 关于chrome下的bug


    最近看了大神的一篇文章,于是尝试了一下里面说的bug以及修复

    1.Chrome下absolute绝对定位元素部分display属性值不渲染bug

    首先还原一下bug..

    ff下的下效果

    点击按钮后的效果

    代码如下:

    <style>

    .img{
    200px;
    position:absolute;
    -webkit-transform: translateZ(0);
    }
    .btn{
    200px;
    appearance:button;
    -moz-appearance:button; /* Firefox */
    -webkit-appearance:button;
    background:blue;
    display: block;
    }

    </style>

    <body>
        <div id='demo'>    
            <button class='btn' id='btn'>图片display:inline-block</button>
            <strong>点击上面按钮,改变图片display水平:</strong><img src="./img/1.jpg" id='img' class='img' alt="">
        </div>
    </body>
    <script> 
        //兼容绑定事件
        function bindEvent(elem,type,fn){
            window.addEventListener?elem.addEventListener(type,fn,false):elem.attachEvent('on'+type,fn);
        }
        var btn = $('btn'),img = $('img'),demo = $('demo');
        bindEvent(btn,'click',function(){
            if(img.style.display == 'block'){
                img.style.display = 'inline-block';
                btn.innerHTML = '图片display:inline-block';
            }else{
                img.style.display = 'block';
                btn.innerHTML = '图片display:block';
            }
        });
    </script>

    现在看看chrome下的效果

    可以看出img没有随着display的改变而换行,

    要注意的是,只有当图片元素设置了position,并且没有设top和left的情况下才会出现这种bug

    bug的修复

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <style>
        .translateZ{
            -webkit-transform: translateZ(0);
        }
        .img{
            width:200px;
            position:absolute;
            -webkit-transform: translateZ(0);
        }   
        .btn{
            width:200px;
            appearance:button; 
            -moz-appearance:button; /* Firefox */ 
            -webkit-appearance:button;
            background:blue;
            display: block;
        }
    </style>
    <body>
        <div id='demo'>    
            <button class='btn' id='btn'>图片display:inline-block</button>
            <strong>点击上面按钮,改变图片display水平:</strong><img src="./img/1.jpg" id='img' class='img' alt="">
        </div>
    </body>
    <script>
        //获取元素
        function $(id){
            return document.getElementById(id);
        }
        //判断类
        function hasClass(obj, cls) {  
            return obj.className.match(new RegExp('(\s|^)' + cls + '(\s|$)'));  
        }  
        //增加类
        function addClass(obj, cls) {  
            if (!this.hasClass(obj, cls)) obj.className += " " + cls;  
        }  
        //删减类
        function removeClass(obj, cls) {  
            if (hasClass(obj, cls)) {  
                var reg = new RegExp('(\s|^)' + cls + '(\s|$)');  
                obj.className = obj.className.replace(reg, ' ');  
            }  
        } 
        //兼容绑定事件
        function bindEvent(elem,type,fn){
            window.addEventListener?elem.addEventListener(type,fn,false):elem.attachEvent('on'+type,fn);
        }
        var btn = $('btn'),img = $('img'),demo = $('demo');
        bindEvent(btn,'click',function(){
            if(img.style.display == 'block'){
                img.style.display = 'inline-block';
                removeClass(demo,'translateZ');
                btn.innerHTML = '图片display:inline-block';
            }else{
                img.style.display = 'block';
                //addClass(demo,'translateZ');
                btn.innerHTML = '图片display:block';
            }
        });
    </script>
    </html>

    修复的方法,利用的是 -webkit-transform: translateZ(0);

    改变display为block的时候,同时添加 -webkit-transform: translateZ(0);

    改变display为inline-block的时候,同时删除 -webkit-transform: translateZ(0);

    2.Chrome下absolute绝对定位元素具有overflow属性的块状子元素visibility hover不渲染bug

    Chrome浏览器下,绝对定位元素,同时visibility:hidden时候,如果子元素具有块状水平,

    同时设置了overflow:hidden; 则父元素hover时候,无法让子元素visibility:visible渲染生效!

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <style>
        .outer{
            position:absolute;
            visibility: hidden;
        }
        .bug{
            overflow: hidden;/* 重要条件 */
        }
        .demo:hover .bug {
            visibility: visible; /* Chrome浏览器下,此声明无效 */
        }
    </style>
    <body>
       <div class='demo'>
           Chrome罕见visibility渲染bug(<em>hover me</em>)
           <div class='outer'>
               <div class='bug' id='bug'><img src="img/1.jpg"></div>
           </div>
       </div>
    </body>
    
      
    </html>

    ff下的效果

    chrome下的效果

    其实造成这效果的原因和position有很大关系,如果把position去掉visibility的效果有可以呈现了

    但是如果项目需要用到position:absolute,那么可以用下面的方法

    .hover:hover .bug {
        visibility: visible; 
        -webkit-transform: translateZ(0); /* 解决方法*/
    }

    添加后,问题就解决了

    本文参考自http://www.zhangxinxu.com/wordpress/2015/01/chrome-absolute-display-visibility-render-bug/

  • 相关阅读:
    干货!常见的SQL面试题:经典50例!
    图解SQL基础知识,小白也能看懂的SQL文章!
    30多个Java实战项目,全部在这里了。
    Spring的@PropertySource注解使用
    20201226[java]两数相加
    1013.表-约束-唯一、主键、外键和排他
    1012.表-约束-检查
    1011.表-生成列
    1010.表默认值
    1009.表基础-初识表
  • 原文地址:https://www.cnblogs.com/waisonlong/p/5552380.html
Copyright © 2020-2023  润新知