[CSS]A Tale of CSS and Sass Precision(译)_html/css_WEB-ITnose
关于 CSS 和 Sass 布局的精确度
原文地址:http://www.sitepoint.com/a-tale-of-css-and-sass-precision/
在 Edenspiekermann,我们通过严格的代码审查来确保我们提交的代码足够完善。而关于数字的模糊性是我经常遇到的一个问题,特别是有小数点的数字。因此,在这里我会用一篇简单的文章阐明这个问题。
初始设置
为了使文章更容易理解,在进一步深入之前我们先用一个小小的代码块作为例子。
.list-item { float: left; width: 33%;}
有什么问题呢?
或许你会问,这个代码块有什么问题吗?表面上看来,确实没什么问题,这不就是一个典型的三列网格布局吗?
虽然 33% + 33% +33% 并不等于 100% 而是99 %。且在大多数情况下这个小小的差距并不会造成任何影响,但是当它作用在直线布局时,1% 的差距可能会造成很大的影响。要知道在 1400px及以上的容器中, 1% 的差距至少就是 14px了,这可是一个很大的间隙。
为什么我们不尝试移动一下小数点使它更加精确呢?我们可以把间隙减小到 1.4px甚至是 0.14px,这个距离可不会使我们烦恼了。那我们应该这样写:
.list-item { float: left; width: 33.33%;}
效果好了一些,但仍然不完美。这个问题已经在 John Albin Wilkins 发布的文章“ Responsive Design’s Dirty Little Secret”中被深入研究过了。如果你没读过这篇精彩的文章,你应该去读一下。
浏览器不能处理么?
这时候你可能会想,为什么浏览器就不能完美的解决这个问题呢?事实上,CSS 规范中并没有指定浏览器应该保留多少位精度的小数点。当 CSS 规范没有指定一项细则的时候,可以肯定的是每个浏览器都会有它自己的一套标准。
接下来引用一下上述文章中的段落:
在6列网格布局中,每列的宽度都是 100% ÷ 6 = 16.666667%。那么在 1000px 的视图中(只是为了使我们的计算更加容易),计算结果就是每列的宽度为 166.66667px。因为并没有明确的文档规定,所以浏览器厂商可以制定自己的规则。如果浏览器精确到最近的整数,在这个例子中,也即是 167px。但是因为 167 * 6 =1022px,因此在视图中我们无法给这 6 列提供足够的空间。相反的,如果浏览器把每列精确到 166px,那么就会在我们的视图中造成 4px 的间隙。
– John Albin Wilkins
这就是事实。旧版本的 IE 浏览器(主要是 IE6 和 IE7)会把数值转换为最接近的整数,从而导致布局缺陷。Webkit 浏览器会向下取整,这样防止布局的错位但会留下额外的空间。Opera(至少在以前的渲染引擎中)则会做一些奇怪的让人不解的东西。话说回来,关于这方面的规则并没有制定出来,所以又能责怪谁呢?不能怪浏览器使用的是像素来 渲染页面,这是肯定的,因此目前看来这是最好的结果。
无论如何,它几乎一团糟,我们会在文章结论部分再讨论这个问题。
那么 Sass 呢?
Sass 支持数字运算。这并不是新的领域并且实际上也用于 Sass 的新项目 (用于构建数字基础网格系统)。而我们能够做的就是告诉 Sass 我们希望把容器平分为三个部分。
.list-item { float: left; width: (100% / 3);}
我们也可以通过百分比函数 percentage(..)求得相同的结果。
.list-item { float: left; width: percentage(1 / 3);}
无论使用 Ruby 还是 LibSass,都可以保留五位 小数。这实际上是一个 问题,因为精度太低了。如果保留 10 位小数会更好,可惜这不是默认设置(尽管可以更改设置,但这并不是一个容易的方法)。
上面的代码产生的 CSS 效果如下:
.list-item { float: left; width: 33.33333%;}
这并不能解决我们的浏览器问题,但这简化了我们的样式表。通过所见即所得的计算模式,不仅使得我们不需要自己计算精度值,同时使得代码更加易读和维护。
不得不说这是一件好事。
两全其美
目前为止,我们已经了解到让 Sass 处理这些计算比我们自己手动算出来的数值精确多了。现在,最好的方法是让浏览器自己用最好的方法去处理这个运算。因此,我们可以使用 CSS 的 calc(..)函数。
.list-item { float: left; width: calc(100% / 3);}
这个代码块并不会被编译成其他东西,它由浏览器编译,然后由浏览器选择最佳方案。我可以坦诚的告诉你,我并不了解浏览器处理 calc(..)函数是否是和其他函数一样的流程。我推测它先执行运算,然后取整。有些浏览器似乎会把像素也带入计算。如果您有这方面的见解,欢迎在评论中分享。
对于那些 不支持 calc(..)表达式的浏览器 (主要是 IE8 和 Opera Mini),我们可以在 Sass 操作前放入一个静态表达式,通过这种方式达到平衡。
.list-item { float: left; width: (100% / 3); width: calc(100% / 3);}
结论
让我们回顾一下。首先,因为浏览器之前的差异性和缺乏统一的标准,所以基于百分比的布局很难处理。
其次,通过一些复杂运算而导致的硬编码值通常也不是一个好主意。我们可以通过 Sass 计算出近似值(浮点后五位数)。
更好的方法是,我们让浏览器自己计算近似值。在理想的情况下,浏览器可以同时掌控算数和渲染,那么它能生成最好的方案。朝这个方向前进,我们需要依赖 calc(..)函数的使用。
目前为止就讲这么多了。没有新的内容,但我想一个快速的回顾会对你有帮助的!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.
