• 使用margin来做适应屏幕的定位


    	<div class="one"> </div>
    	<div class="two"> </div>
    
    	<div class='screem'>
    		<div class="demo">
    			<div class="test">
    				
    			</div>
    		</div>
    	</div>
    	<style>
    	
    		body {
    			margin:0;
    			padding:0;
    		}
    		
    		.screem {
    			position:relative;
    			100px;
    			height:100px;
    			z-index:10;
    		}
    		
    		.demo {
    			position:absolute;
    			 100%;
    			height: 100%;
    			background-color: #ccc;
    		}
    	
    		.test {
    			 100px;
    			height: 100px;
    			margin-top:50%;
    			background-color: red;
    		}
    		
    	</style>
    

      上面的html的代码,可以实现test相对于父节点demo的相对定位,记得这里的margin-top:50%,

    是相对于screem未分配剩余宽度的偏移量,这里未分配的宽度是100%。

    如果你想便宜500px,用500/100 = 500%。让margin-top:500%,就可以偏移500px了。如果遇到屏幕缩放的时候,如果是绝对定位,

    那么就写500px。这样,就出现问题了,而屏幕缩放,水平距离必定变短,导致,margin-top:500%,也一样变小,所以可以适应缩放。

    如果你写的是margin-left:50%。也是相对于水平宽度的50px,而不是垂直方向。

    		.screem {
    			position: relative;
    			100px;
    			height:100px;
    			z-index:10;
    		}
    		
    		.demo:hover {
    			200px;
    			height:200px;
    		}
    	
    		.demo {
    			position:absolute;
    			 100%;
    			height: 100%;
    			background-color: #ccc;
    		}
    	
    		.test {
    			position: absolute;
    			left: 100px;
    			top: 100px;
    			padding: 50%;
    			background-color: red;
    			z-index: 10;
    		}

      这里使用padding,撑开元素,虽然子元素什么都不包含,但是可以使用padding:50%。把他撑到和父元素一样的大小

    padding-left: 50%;
    padding-top: 50%;

    这样是元素,宽度的一半的平方。如果是10(宽)×20(高)的,最后就是5×5,记住,margin和padding的百分比,都是通过父元素的宽度设定的,

    但是,记得父元素要加入position:relative;

    当然,解决这种定位问题,为了保证移动端适配的问题,可以使用rem做绝对定位。

    通过设置html初始的html的字体大小,比如font-size:100px;这样,来视屏6,

    然后通过js计算,得到5的屏幕宽度,附一段调整viewport,初始化html中的font-size的js代码。仅供参考参看。

    (function(win, doc) {
        var docEl = doc.documentElement,
            ua = win.navigator.userAgent,
            metaEl = docEl.querySelector('meta[name="viewport"]'),
            dpr = 0,
            scale = 0;
        // 一物理像素在不同屏幕的显示效果不一样。要根据devicePixelRatio来修改meta标签的scale
        //设置dpr
        if (!dpr && !scale) {
            var isAndroid = ua.match(/android/gi),
                isIOS = ua.match(/iphone/gi),
                devicePixelRatio = win.devicePixelRatio;
            if (isIOS) {
                // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
                if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
                    dpr = 3;
                } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
                    dpr = 2;
                } else {
                    dpr = 1;
                }
            } else {
                // 其他设备下,仍旧使用1倍的方案
                dpr = 1;
            }
            scale = 1 / dpr;
        }
        // 设置data-dpr属性
        docEl.setAttribute('data-dpr', dpr);
        //将根据已有的meta标签来设置缩放比例
        if (metaEl) {
            var match = metaEl.getAttribute('content').match(/initial-scale=([d.]+)/);
            if (match) {
                scale = parseFloat(match[1]);
                dpr = parseInt(1 / scale);
            }
        }
        //无viewport则新增缩放的viewport,达到高清效果
        if (!metaEl) {
            metaEl = doc.createElement('meta');
            metaEl.setAttribute('name', 'viewport');
            metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaEl);
            } else {
                var wrap = doc.createElement('div');
                wrap.appendChild(metaEl);
                doc.write(wrap.innerHTML);
            }
        };
        //设置html的font-size
        refreshRem = function() {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            docEl.style.fontSize = 100 * (clientWidth / 320) + 'px';  //这里初始化的html的font-size是按照100px计算的。
        };
        //绑定事件
        win.addEventListener('resize', function() {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }, false);
        win.addEventListener('pageshow', function(e) {
            if (e.persisted) {
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 300);
            }
        }, false);
        refreshRem();
    })(window, document);
    

      

  • 相关阅读:
    修改滚动条样式,加粗滚动条
    Navigation(五) Move_base最最全解析(按执行逻辑梳理)
    解决element elform打开模态框时就进行表单验证的问题
    element级联选择器未触发校验的问题
    js 项目中数据的各种处理
    vue 中Class 与 Style 绑定
    修改elinput placeholder样式和内容
    css 多行文字垂直居中 水平向右对齐方式
    《popen和system的区别》
    3、【es6】之字符串扩展
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4970565.html
Copyright © 2020-2023  润新知