zoukankan      html  css  js  c++  java
  • 移动端1px线适配问题-------适配各种编译CSS工具 stylus sass styled-componet实现方法

    其实在stylus与sass中实现移动端1像素线各个手机设备的适配问题的原理是一样的,

    首先我还是先介绍一下原理和所依赖的方法

    原理:其实他们都是通过css3的媒体查询来实现的

    步骤思路:

    1、给目标元素进行相对定位

    2、给目标元素添加伪元素 ::after/before  并进行绝对定位

    3、判断DPI   1DPI   100%   --------------使用媒体查询

                          2DPI   200%

                          3DPI   300%

    4、通过css3中的transform scale等比缩放

    下面是具体的代码,使用时只需引入代码  在style里直接写   border: 1px 0 0 0, #ccc   即可使用

    在stylus中

     
    border($border-width = 1px, $border-color = #ccc, $border-style = solid, $radius = 0)
      // 为边框位置提供定位参考
      position: relative;
    
      if $border-width == null
        $border- 0;
    
      border-radius: $radius;
    
      &::after
        // 用以解决边框layer遮盖内容
        pointer-events: none;
        position: absolute;
        z-index: 999;
        top: 0;
        left: 0;
        // fix当元素宽度出现小数时,边框可能显示不全的问题
        // overflow: hidden;
        content: "020";
        border-color: $border-color;
        border-style: $border-style;
        border- $border-width;
        
        // 适配dpr进行缩放
        @media (max--moz-device-pixel-ratio: 1.49), (-webkit-max-device-pixel-ratio: 1.49), (max-device-pixel-ratio: 1.49), (max-resolution: 143dpi), (max-resolution: 1.49dppx)
           100%;
          height: 100%;
          if $radius != null {
            border-radius: $radius;
          }
        
        @media (min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 2.49), (-webkit-min-device-pixel-ratio: 1.5) and (-webkit-max-device-pixel-ratio: 2.49),(min-device-pixel-ratio: 1.5) and (max-device-pixel-ratio: 2.49),(min-resolution: 144dpi) and (max-resolution: 239dpi),(min-resolution: 1.5dppx) and (max-resolution: 2.49dppx)
           200%;
          height: 200%;
          transform: scale(.5)
          if $radius != null {
            border-radius: $radius * 2;
          }
        
        @media (min--moz-device-pixel-ratio: 2.5), (-webkit-min-device-pixel-ratio: 2.5),(min-device-pixel-ratio: 2.5), (min-resolution: 240dpi),(min-resolution: 2.5dppx)
           300%;
          height: 300%;
          transform: scale(.33333)
          if $radius != null {
            border-radius: $radius * 3;
          }
    
        transform-origin: 0 0;

    在sass中

    @mixin border($border- 1px, $border-color: map-get($base, border-color), $border-style: solid, $radius: null) {
        // 为边框位置提供定位参考
        position: relative;
        @if $border-width == null {
            $border- 0;
        }
        border-radius: $radius;
        &::after {
            // 用以解决边框layer遮盖内容
            pointer-events: none;
            position: absolute;
            z-index: 999;
            top: 0;
            left: 0;
            // fix当元素宽度出现小数时,边框可能显示不全的问题
            // overflow: hidden;
            content: "020";
            border-color: $border-color;
            border-style: $border-style;
            border- $border-width;
            // 适配dpr进行缩放
            @include responsive(retina1x) {
                 100%;
                height: 100%;
                @if $radius != null {
                    border-radius: $radius;
                }
            }
            @include responsive(retina2x) {
                 200%;
                height: 200%;
                @include transform(scale(.5));
                @if $radius != null {
                    border-radius: $radius * 2;
                }
            }
            @include responsive(retina3x) {
                 300%;
                height: 300%;
                @include transform(scale(.33333));
                @if $radius != null {
                    border-radius: $radius * 3;
                }
            }
            @include transform-origin(0 0);
        }
    }

    在component中

    import styled from 'styled-components'
    
    const border = ({
        component = null,
        width = '1px',
        style = 'solid',
        color = '#ccc',
        radius = 0,
    }) => {
        return styled(component) `
        position: relative;
        border- ${ width};
        border-radius: ${ radius + 'px'};
        &::after {
          pointer-events: none;
          position: absolute;
          z-index: 999;
          top: 0;
          left: 0;
          content: "";
          border-color: ${ color};
          border-style: ${ style};
          border- ${ width};
    
          @media
            (max--moz-device-pixel-ratio: 1.49), 
            (-webkit-max-device-pixel-ratio: 1.49), 
            (max-device-pixel-ratio: 1.49), 
            (max-resolution: 143dpi), 
            (max-resolution: 1.49dppx) {
               100%;
              height: 100%;
              border-radius: ${ radius + 'px'};
            };
          
          @media 
            (min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 2.49), 
            (-webkit-min-device-pixel-ratio: 1.5) and (-webkit-max-device-pixel-ratio: 2.49),
            (min-device-pixel-ratio: 1.5) and (max-device-pixel-ratio: 2.49),
            (min-resolution: 144dpi) and (max-resolution: 239dpi),
            (min-resolution: 1.5dppx) and (max-resolution: 2.49dppx) {
               200%;
              height: 200%;
              transform: scale(.5);
              border-radius: ${ radius * 2 + 'px'};
            };
          
          @media 
            (min--moz-device-pixel-ratio: 2.5), 
            (-webkit-min-device-pixel-ratio: 2.5),
            (min-device-pixel-ratio: 2.5), 
            (min-resolution: 240dpi),
            (min-resolution: 2.5dppx) {
               300%;
              height: 300%;
              transform: scale(.33333);
              border-radius: ${ radius * 3 + 'px'}
            };
    
            transform-origin: 0 0;
        };
      `
    }
    
    export default border

    亲自使用过超级好使

    如果本文对您有帮助,请抬抬您的小手,点下右下角的推荐, ^-^,当然如果看了这篇博客对您有帮助是我最开心的事,毕竟赠人玫瑰,手有余香, ^-^,如果这篇博客没有帮助到您,那就只能说一声抱歉啦

      

  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/katydids/p/9948546.html
Copyright © 2011-2022 走看看