移动端边框1像素的问题

耗尽温柔 提交于 2020-04-03 04:47:22

前两天设计说我移动端为什么边框看起来像2px。

我代码检查了大半天,是1px啊。

仔细比对了很久,不得不承认,设计的眼睛比我的眼睛好太多太多了。

造成这个的原因是手机分辨率的问题。

原理都在代码里了。也不多说。下面这个代码重点是css的代码,html全部代码都贴了。less的代码就不分享了,我自己收藏着。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="initial-scale=1, width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1, user-scalable=no" media="(device-height: 568px)">
    <meta name="renderer" content="webkit">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-touch-fullscreen" content="yes">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="full-screen" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
    <meta name="format-detection" content="telephone=no">
    <meta name="format-detection" content="address=no">
    <script type="text/javascript">
        ;(function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;

                    if(typeof(clientWidth)=='number' && clientWidth <= 750 && clientWidth>319){  //手机端自适应,   基础20
                        docEl.style.fontSize = 20 * (clientWidth / 375) + 'px';
                    }else if(typeof(clientWidth)=='number' && clientWidth>750){   //pc端基础为40/2  20 手机端的适配
                        docEl.style.fontSize = '40'+'px';
                    }

                };
            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
            recalc();

        })(document, window);
    </script>
    <style>
        /*
        * 参照网址:http://blog.csdn.net/u011250652/article/details/70229058
        *
        * 上面的网址是参照下面这两个网址  下面的网址讲的是原理性的东西
        * 张鑫旭老师:设备像素比devicePixelRatio简单介绍:http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/
        * 移动端1px解决方案:http://www.cnblogs.com/lunarorbitx/p/5287309.html
        */

        /*
        * bug 1 : 若div容器有背景颜色,那么在有些设备下,边框的部分边缘颜色和背景颜色会在视觉上产生重合(其实没有重合,若背景颜色是白色则没有)
        * bug 2 : 边框线是覆盖div容器的,所以,需要div容器加一个padding为1px的像素
        */

        /*手机端实现真正的一像素边框*/
        .border-1px, .border-bottom-1px, .border-top-1px, .border-left-1px, .border-right-1px {
            position: relative;
        }
        /*线条颜色 黑色*/
        .border-1px::after, .border-bottom-1px::after, .border-top-1px::after, .border-left-1px::after, .border-right-1px::after {
            /*background-color: #000;*/
        }
        /*底边边框一像素*/
        .border-bottom-1px::after {
            content:"";
            position: absolute;
            left: 0;
            bottom: 0;
            width: 100%;
            height: 1px;
            transform-origin: 0 0;
            background-color:red;
        }

        /*上边边框一像素*/
        .border-top-1px::after {
            content:"";
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 1px;
            transform-origin: 0 0;
            background-color:red;
        }

        /*左边边框一像素*/
        .border-left-1px::after {
            content:"";
            position: absolute;
            left: 0;
            top: 0;
            width: 1px;
            height: 100%;
            transform-origin: 0 0;
            background-color:red;
        }
        /*右边边框1像素*/
        .border-right-1px::after {
            content: "";
            box-sizing: border-box;
            position: absolute;
            right: 0;
            top: 0;
            width: 1px;
            height: 100%;
            transform-origin: 0 0;
            border: 1px solid red;
        }
        /*边框一像素*/
        .border-1px::after {
            content: "";
            box-sizing: border-box;
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            border: 1px solid red;
        }

        /*设备像素比*/
        @media only screen and (-webkit-min-device-pixel-ratio: 2.0), only screen and (min-resolution: 2dppx) {
            .border-bottom-1px::after, .border-top-1px::after {
                transform: scaleY(0.5);
            }
            .border-left-1px::after, .border-right-1px::after {
                transform: scaleX(0.5);
            }
            .border-1px::after {
                width: 200%;
                height: 200%;
                transform: scale(0.5);
                transform-origin: 0 0;
            }
        }

        /*设备像素比*/
        @media only screen and (-webkit-min-device-pixel-ratio: 3.0), only screen and (min-resolution: 3dppx) {
            .border-bottom-1px::after, .border-top-1px::after {
                transform: scaleY(0.333);
            }
            .border-left-1px::after, .border-right-1px::after {
                transform: scaleX(0.333);
            }
            .border-1px::after {
                width: 300%;
                height: 300%;
                transform: scale(0.333);
                transform-origin: 0 0;
            }
        }
    </style>
    <style>
        .test1{
            margin: 0.5rem auto;
            width: 2rem;
            height: 2rem;
            /*background:green;*/
        }
    </style>
</head>
<body>
    <div class="test1 border-1px">13231</div>

    <div class="test1" style="border: 1px solid red;">13231</div>
    
    <div class="test1 border-top-1px">13231</div>

    <div class="test1" style="border-top: 1px solid red;">13231</div>
</body>
</html>
View Code

 

 代码实现的效果图是下面这个图,看下,在移动端里,边框有什么不一样(按我来说,感觉颜色不一样,但是我眼睛差,跟设计师的眼睛比不了。)可以自己复制上面代码,跑跑看(不放less的原因,是因为在这里配置麻烦,且不好让你们复制,上面这个html,复制下,自己参透原理i,可以自己写一个方便的less)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!