校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 吃透移動端 1px的具體用法

吃透移動端 1px的具體用法

熱門標簽:惡搞電話機器人 ok電銷機器人 地圖標注軟件打印出來 欣鼎電銷機器人 效果 如何查看地圖標注 電話機器人技術 高德地圖標注商戶怎么標 智能電銷機器人被禁用了么 黃石ai電銷機器人呼叫中心

最近在寫移動端 H5 應用,遇到一個值得記錄下來的點?,F在從它的由來到實現,我們來聊一下移動端 1px,說 1px 不夠準確,應該說成 1 物理像素 。

通過閱讀下面文章,你將會理解以下問題:

問題

  • 為什么有 1px 這個問題?
  • 實現 1px 有哪些方法?這些方法分別有哪些優缺點?
  • 開源項目中使用的哪些解決方案?
  • 如何在項目中處理 1px 的相關問題?

由來

 基本概念

首先,我們要了解兩個概念,一個是 像素(pixel) 可以簡寫為 px ,另外一個是 設備像素比(DPR)

像素 :指在由一個數字序列表示的圖像中的一個最小單元,單位是 px,不可再次分割了。

設備像素比(DPR): 設備像素比 = 設備像素 / 設備獨立像素。復制代碼

下面我來簡單解釋下幾個概念

  • CSS 像素 (虛擬像素):指的是 CSS 樣式代碼中使用的邏輯像素,在 CSS 規范中,長度單位可以分為兩類,絕對單位以及相對單位。px 是一個相對單位,相對的是設備像素。
  • 設備像素 (物理像素):指設備能控制顯示的最小物理單位,意指顯示器上一個個的點。從屏幕在工廠生產出的那天起,它上面設備像素點就固定不變了,和屏幕尺寸大小有關。
  • 設備獨立像素 (邏輯像素):可以認為是計算機坐標系統中得一個點,這個點代表一個可以由程序使用的虛擬像素(比如: CSS 像素),這個點是沒有固定大小的,越小越清晰,然后由相關系統轉換為物理像素。 也就是說,當邏輯像素是 1pt 時,在 DPR 為 2 的 設備上顯示為 2px 的物理像素

 參考數據

各種類型的 iphone 手機屏幕設備的參數

注:這里的縮放因子呢,就是 DRP 的值

設計稿對比數據

會有人好奇,為什么設計稿上顯示是 750x1334 呢,這是因為設計稿是顯示的 物理像素

而我們 css 中的像素是 邏輯像素 應該為 375x 667,在編寫代碼時要將自定義寬度設置成 375px

那么此時設計稿上的 1px 寬度實際代表的 css 參數應該是 0.5px 對應物理像素 1px,那么怎么實現這個物理像素為 1px 呢

實踐

歸根結底有兩種方案,一種是利用 css 中的 transfrom:scaleY(0.5) ,另一種是設置 媒體查詢根據不同 DPR 縮放

解決方案一

原理

利用 css 的 偽元素 ::after + transfrom 進行縮放

為什么用偽元素?因為偽元素 ::after::before 是獨立于當前元素,可以單獨對其縮放而不影響元素本身的縮放

偽元素大多數瀏覽器默認單引號也可以使用,和偽類一樣形式,而且單引號兼容性(ie)更好些

實現

<div class="cell border-1px"> cell <div>

<style>
.cell {
    width: 100px;
    height: 100px;
}
<!--全部邊框-->
.border-1px:after {
    content: '';
    position: absolute;
    box-sizing: border-box;
    top: 0;
    left: 0;
    width: 200%;
    height: 200%;
    border: 1px solid #000;
    border-radius: 4px;
    -webkit-transform: scale(0.5);
    transform: scale(0.5);
    -webkit-transform-origin: top left;
}

<!--單邊框,以上邊框為例-->
.border-1px-top:before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    border-top: 1px solid red;
    transform: scaleY(.5);
    transform-origin: left top;
}
</style>

解決方案二(升級方案一)

原理

使用 less 對公共代碼(方案一)封裝,同時增加媒體查詢分別對不同 DPR 的設備,進行不同的縮放

.border(
    @borderWidth: 1px; 
    @borderStyle: solid; 
    @borderColor: @lignt-gray-color; 
    @borderRadius: 0) {
    position: relative;
    &:before {
        content: '';
        position: absolute;
        width: 98%;
        height: 98%;
        top: 0;
        left: 0;
        transform-origin: left top;
        -webkit-transform-origin: left top;
        box-sizing: border-box;
        pointer-events: none;
    }
    @media (-webkit-min-device-pixel-ratio: 2) {
        &:before {
            width: 200%;
            height: 200%;
            -webkit-transform: scale(.5);
        }
    }
    @media (-webkit-min-device-pixel-ratio: 2.5) {
        &:before {
            width: 250%;
            height: 250%;
            -webkit-transform: scale(.4);
        }
    }
    @media (-webkit-min-device-pixel-ratio: 2.75) {
        &:before {
            width: 275%;
            height: 275%;
            -webkit-transform: scale(1 / 2.75);
        }
    }
    @media (-webkit-min-device-pixel-ratio: 3) {
        &:before {
            width: 300%;
            height: 300%;
            transform: scale(1 / 3);
            -webkit-transform: scale(1 / 3);
        }
    }
    .border-radius(@borderRadius);
    &:before {
        border-width: @borderWidth;
        border-style: @borderStyle;
        border-color: @borderColor;
    }
}

.border-all(
	@borderWidth: 1px; 
	@borderStyle: solid; 
	@borderColor: @lignt-gray-color; 
	@borderRadius: 0) {
    .border(@borderWidth; @borderStyle; @borderColor; @borderRadius);
}

其他方案:

使用圖片:兼容性最好,靈活行最差,不能改變顏色、長度

使用 viewportrem , js 動態改變 viewportscale 縮放,缺點在于不適用于已有的項目,例如:使用 vhvw 布局的

  <meta name="viewport" id="WebViewport" content="initial-scale=1,    maximum-scale=1, minimum-scale=1, user-scalable=no">

使用 css 漸變 linear-gradient 或者 box-shadow

上述 3 種方案均有致命缺陷暫不推薦使用

兼容性

最后看一下兼容性如何,主要是偽元素、 transform:scalemin-device-pixel-ratio 這幾個關鍵詞的兼容性

 

 

 

開源庫的解決方案

vant 組件庫

跳去 github 查看相關代碼

使用 less 寫的

.hairline-common() {
  position: absolute;
  box-sizing: border-box;
  content: ' ';
  pointer-events: none;
}

.hairline(@color: @border-color) {
  .hairline-common();

  top: -50%;
  right: -50%;
  bottom: -50%;
  left: -50%;
  border: 0 solid @color;
  transform: scale(0.5);
}

也是采用第一種解決方案

ant-design-mobile 組件庫

跳去 github 查看相關代碼

.scale-hairline-common(@color, @top, @right, @bottom, @left) {
  content: '';
  position: absolute;
  background-color: @color;
  display: block;
  z-index: 1;
  top: @top;
  right: @right;
  bottom: @bottom;
  left: @left;
}

.hairline(@direction, @color: @border-color-base) when (@direction = 'top') {
  border-top: 1PX solid @color;

  html:not([data-scale]) & {
    @media (min-resolution: 2dppx) {
      border-top: none;

      &::before {
        .scale-hairline-common(@color, 0, auto, auto, 0);
        width: 100%;
        height: 1PX;
        transform-origin: 50% 50%;
        transform: scaleY(0.5);

        @media (min-resolution: 3dppx) {
          transform: scaleY(0.33);
        }
      }
    }
  }
}

.hairline(@direction, @color: @border-color-base) when (@direction = 'right') {
  border-right: 1PX solid @color;

  html:not([data-scale]) & {
    @media (min-resolution: 2dppx) {
      border-right: none;

      &::after {
        .scale-hairline-common(@color, 0, 0, auto, auto);
        width: 1PX;
        height: 100%;
        background: @color;
        transform-origin: 100% 50%;
        transform: scaleX(0.5);

        @media (min-resolution: 3dppx) {
          transform: scaleX(0.33);
        }
      }
    }
  }
}
.hairline(@direction, @color: @border-color-base) when (@direction = 'bottom') {
  border-bottom: 1PX solid @color;
  html:not([data-scale]) & {
    @media (min-resolution: 2dppx) {
      border-bottom: none;
      &::after {
        .scale-hairline-common(@color, auto, auto, 0, 0);
        width: 100%;
        height: 1PX;
        transform-origin: 50% 100%;
        transform: scaleY(0.5);
        @media (min-resolution: 3dppx) {
          transform: scaleY(0.33);
        }
      }
    }
  }
}

.hairline(@direction, @color: @border-color-base) when (@direction = 'left') {
  border-left: 1PX solid @color;

  html:not([data-scale]) & {
    @media (min-resolution: 2dppx) {
      border-left: none;

      &::before {
        .scale-hairline-common(@color, 0, auto, auto, 0);
        width: 1PX;
        height: 100%;
        transform-origin: 100% 50%;
        transform: scaleX(0.5);

        @media (min-resolution: 3dppx) {
          transform: scaleX(0.33);
        }
      }
    }
  }
}

.hairline(@direction, @color: @border-color-base, @radius: 0) when (@direction = 'all') {
  border: 1PX solid @color;
  border-radius: @radius;

  html:not([data-scale]) & {
    @media (min-resolution: 2dppx) {
      position: relative;
      border: none;

      &::before {
        content: '';
        position: absolute;
        left: 0;
        top: 0;
        width: 200%;
        height: 200%;
        border: 1PX solid @color;
        border-radius: @radius * 2;
        transform-origin: 0 0;
        transform: scale(0.5);
        box-sizing: border-box;
        pointer-events: none;

        // @media (min-resolution: 3dppx) {
        //   width: 300%;
        //   height: 300%;
        //   border-radius: @radius * 3;
        //   transform: scale(0.33);
        // }
      }
    }
  }
}

這個值得研究下,比 vant 和 第一種解決方案有點不同,主要在于處理了 DPR 為 2 和為 3 的兩種情況,相比來說更加完善。

這里 PX 大寫,為了防止插件將 px 轉成 rem 等單位

總結

通過該文,你大概了解 1px 問題的來龍去脈了吧,也明白了如何解決相關問題,如果這票文章能解決你的疑問或者工作中問題,不妨點個贊收藏下。

由于技術水平有限,文章中如有錯誤地方,請在評論區指出,感謝!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:綏化 聊城 赤峰 中山 盤錦 阿壩 萍鄉 金昌

巨人網絡通訊聲明:本文標題《吃透移動端 1px的具體用法》,本文關鍵詞  吃透,移動,端,1px,的,具體,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《吃透移動端 1px的具體用法》相關的同類信息!
  • 本頁收集關于吃透移動端 1px的具體用法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美韩国一区二区| 日本一区二区三区dvd视频在线| 精品一区二区三区的国产在线播放 | 欧美日韩另类一区| 久久99热国产| 国产精品免费视频观看| 717成人午夜免费福利电影| 成人免费的视频| 蜜臀国产一区二区三区在线播放 | 欧美一区二区视频网站| 91丨九色丨尤物| 国产精品一二三四区| 亚洲成av人片在线观看无码| 国产精品私人自拍| 精品欧美黑人一区二区三区| 欧美日韩一区不卡| 91浏览器在线视频| 成人午夜av在线| 看片网站欧美日韩| 日韩极品在线观看| 亚洲精品伦理在线| 国产精品免费视频一区| 久久久蜜臀国产一区二区| 欧美精品乱码久久久久久按摩| 色综合久久88色综合天天6| 国产成人av一区二区三区在线观看| 日韩成人一级大片| 丝瓜av网站精品一区二区 | 2023国产精华国产精品| 91精品国产欧美一区二区18| 在线免费一区三区| 99精品国产热久久91蜜凸| 国产精品一区二区91| 九九精品一区二区| 蜜桃av噜噜一区| 日本色综合中文字幕| 青青草精品视频| 日韩电影一二三区| 蜜桃一区二区三区四区| 日韩二区在线观看| 午夜不卡在线视频| 日日摸夜夜添夜夜添国产精品| 亚洲成人午夜电影| 亚洲成人1区2区| 日韩精品电影在线| 日韩成人免费看| 免费人成在线不卡| 青青草97国产精品免费观看| 91香蕉视频mp4| eeuss鲁片一区二区三区在线观看| 国产成人综合亚洲网站| 国产a精品视频| 成人动漫一区二区| 99久久免费国产| 91久久久免费一区二区| 欧美视频在线一区| 欧美一区二区福利在线| 久久影院午夜论| 国产日韩欧美亚洲| 亚洲欧美中日韩| 亚洲另类中文字| 亚洲成人精品一区| 日本美女视频一区二区| 国产乱人伦精品一区二区在线观看| 国产精品一级片在线观看| 国产91精品在线观看| 91在线云播放| 欧美日韩亚洲综合在线| 欧美电影免费观看高清完整版| 久久综合久久综合久久| 国产精品久久久久久久久免费桃花| 亚洲免费观看高清完整版在线观看 | 国产成人av一区二区三区在线| 国产成人日日夜夜| 91激情在线视频| 欧美www视频| 国产精品不卡一区二区三区| 亚洲第一综合色| 国产传媒久久文化传媒| 欧美性猛交xxxx乱大交退制版| 日韩欧美国产麻豆| 中文字幕中文乱码欧美一区二区| 亚洲午夜精品网| 国产麻豆成人传媒免费观看| 色综合天天性综合| 欧美一区二区三区免费在线看| 欧美国产精品专区| 天天综合色天天| 国产一区二区三区香蕉| 91免费精品国自产拍在线不卡| 欧美高清www午色夜在线视频| 国产偷国产偷精品高清尤物| 亚洲在线观看免费视频| 麻豆91免费观看| 色哟哟欧美精品| 日韩久久精品一区| 亚洲精品一卡二卡| 国产一区二区网址| 欧美视频你懂的| 国产精品区一区二区三区| 天堂精品中文字幕在线| 成人午夜伦理影院| 制服丝袜在线91| 国产精品另类一区| 欧美区视频在线观看| 成人欧美一区二区三区在线播放| 免费高清在线视频一区·| 91色乱码一区二区三区| 日韩久久久久久| 婷婷六月综合亚洲| 色婷婷国产精品综合在线观看| wwww国产精品欧美| 麻豆精品一区二区| 欧美亚日韩国产aⅴ精品中极品| 国产日韩欧美高清| 日韩成人av影视| 99re在线视频这里只有精品| 26uuu欧美| 久久国产婷婷国产香蕉| 欧美剧情电影在线观看完整版免费励志电影 | 欧美性受极品xxxx喷水| 国产精品久久久久久久久免费桃花 | 欧美zozo另类异族| 日韩精品一二区| 欧美高清dvd| 亚洲妇女屁股眼交7| 色www精品视频在线观看| 日韩一区中文字幕| 99国产欧美另类久久久精品| 亚洲国产精品成人综合| 国产盗摄视频一区二区三区| 精品少妇一区二区三区| 美女爽到高潮91| 777久久久精品| 日韩精品91亚洲二区在线观看| 在线国产亚洲欧美| 亚洲综合在线观看视频| 欧洲精品一区二区| 一区二区在线免费| 91丨九色丨蝌蚪富婆spa| 亚洲久草在线视频| 欧洲精品一区二区| 首页亚洲欧美制服丝腿| 9191精品国产综合久久久久久| 日本中文字幕一区二区视频 | 91成人在线观看喷潮| 一区二区三区毛片| 欧美日韩国产综合一区二区三区 | 色综合一个色综合| 亚洲自拍偷拍欧美| 欧美日韩精品一区二区天天拍小说 | 成人一道本在线| 欧美国产综合色视频| www.亚洲色图.com| 一区二区三区精品视频| 欧美日韩国产系列| 蜜臀va亚洲va欧美va天堂| 久久女同性恋中文字幕| 成人精品一区二区三区中文字幕| 椎名由奈av一区二区三区| 欧美午夜电影一区| 蜜臀av亚洲一区中文字幕| 久久中文娱乐网| 精品少妇一区二区三区免费观看| 久久er99精品| 中文天堂在线一区| 欧洲在线/亚洲| 免费久久99精品国产| 久久亚洲精品国产精品紫薇| 成人sese在线| 亚洲h精品动漫在线观看| 日韩一级在线观看| 成人午夜av影视| 亚洲综合小说图片| 精品女同一区二区| 成人国产一区二区三区精品| 午夜伊人狠狠久久| 亚洲国产精品成人综合| 欧美日本一道本在线视频| 国产美女在线精品| 一区二区在线观看视频在线观看| 日韩一区二区精品| 色偷偷久久人人79超碰人人澡| 日本视频免费一区| 成人欧美一区二区三区黑人麻豆| 9191久久久久久久久久久| jiyouzz国产精品久久| 日本欧美大码aⅴ在线播放| 中文字幕国产一区二区| 91.xcao| 99久久99久久精品免费观看| 老汉av免费一区二区三区| 亚洲欧美aⅴ...| 久久亚洲二区三区| 欧美日韩一区不卡| av电影在线观看一区| 久久不见久久见中文字幕免费| 亚洲免费在线电影| 国产亚洲欧洲一区高清在线观看| 欧美日韩亚洲另类|