当前位置: 首页 > 科技观察

CSSViewport单元,很多人不知道怎么用它来快速布局!

时间:2023-03-16 10:29:22 科技观察

**CSSViewport单元**在过去几年中一直存在,随着时间的推移,越来越多的开发人员开始使用它们。它们的好处是它们为我们提供了一种无需使用JavaScript即可动态调整大小的方法。而且,如果它失败了,还有大量的备份。在本文中,我们将了解CSSViewport单元及其使用方法,并列出一些常见问题及其解决方案和用例,让我们开始吧。简介根据CSS规范,视口百分比单位是相对于初始包含块的大小而言的,初始包含块是网页的根元素。视口单位是:vw、vh、vmin和vmax。vw单位表示根元素宽度的百分比。1vw等于视口宽度的1%。视口宽度vw单位代表根元素宽度的百分比,1vw等于视口宽度的1%。假设我们有一个元素,CSS如下:.element{width:50vw;}当视口宽度为500px时,50vw的计算方式如下width=500*50%=250px视口高度vh单位代表根元素高度的百分比,avh等于视口高度的1%。我们有一个元素,CSS如下:.element{height:50vh;}当视口高度为290px时,70vh计算如下:height=290*70%=202px大家都说简历里没项目可写,所以我给你找了一个项目,还自带【搭建教程】。Vmin单位vmin表示视口宽和高的较小值,即vw和vh的较小值。如果视口宽度大于其高度,则该值将从高度计算。我们以下面的例子为例。我们有一个带有vmin单元元素的横向手机。在这种情况下,该值将根据视口高度计算,因为它小于宽度。.element{padding-top:10vmin;padding-bottom:10vmin;}这就是vmin的计算方式:如您所料,结果看起来像padding-top=(10%ofheight)=10%*164=16.4pxpadding-bottom=(10%ofheight)=10%*164=16.4pxVmax单位vmax与vmin相反,是vw和vh的较大值。我们以下面的例子为例。.element{padding-top:10vmax;padding-bottom:10vmax;}计算结果如下:padding-top=(10%ofwidth)=10%*350=35pxpadding-bottom=(10%ofwidth)=10%*350=35px视口单位与百分比有何不同?视口单位基于页面的根元素,而百分比基于它们所在的容器。因此,它们彼此不同,但各有各的用处。视口单位字体大小的用例CSS视口单位非常适合响应式排版。例如,我们可以为文章标题使用以下内容:.title{font-size:5vw;}标题的字体大小将根据视口宽度增大或缩小。就像提供的字体大小是视口宽度的5%。但是,未经适当测试就使用它可能会有点混乱。让我们看下面的视频:Bodysize变得非常小,这不利于可访问性和用户体验。据我所知,手机上的最小字体大小不应小于14px。在GIF中,不小于10px。为了解决这个问题,我们需要为标题提供最小字体大小,我们可以使用calc().title{font-size:calc(14px+2vw);}calc()CSS函数的最小值为14px,并且在的基础上加上2vw的值,有了这些,字号值就不会变得太小了。另一个需要考虑的重要事项是字体大小在大屏幕(例如27英寸iMac)上的表现。会发生什么?你猜对了,字体大小在95px左右,这是一个很大的值。为了防止这种情况,我们应该在一些断点上使用媒体查询并更改字体大小。@media(min-width:1800px){.title{font-size:40px;}}通过重新设置字体大小,我们可以保证大小不会太大。您可能还需要添加多个媒体查询,但这取决于您和项目的上下文。示例地址:https://codepen.io/shadeed/pen/fa989837c6379770cce49f0be6daa3e3Fullscreen有时,我们需要一个部分来获得100%的视口高度,为此,我们可以使用视口高度单位。.section{height:100vh;display:flex;flex-direction:column;justify-content:center;align-items:center;}通过添加height:100vh我们可以确保部分高度将占据视口的100%。此外,我们添加了一些flexbox来处理水平和垂直居中的内容。示例源代码:https://codepen.io/shadeed/pen/dc4e82f3c873cc64ae5c5bc4a3f4ef9f?editors=1100Stickylayout(footer)在大屏幕上,有时网站内容很少,footer没有粘在底部。这是正常的,不被认为是不好的做法。然而,还有改进的余地。考虑下图表示问题:为了解决这个问题,我们需要给内容一个等于视口高度-(header+footer)的高度。动态地执行此操作很困难,但使用CSS视口,这很容易。第一种解决方案:calc和viewportunits如果页眉和页脚的高度是固定的,那么可以将calc()函数与viewportunit结合起来,如下所示:header,footer{height:70px;}main{height:calc(100vh-70px-70px);}无法保证此解决方案始终有效,尤其是对于页脚。在我的职业生涯中,我没有使用固定高度的页脚,因为这种页脚在例如不同的屏幕尺寸。2.方案二:Flexbox和viewportunits(推荐)通过设置body元素的高度为100vh,然后可以使用flexbox让main元素占据剩余的空间。body{min-height:100vh;display:flexflex-direction:column;{main{/*Thiswillmakethemainelementtaketheremainingspacedynamically*/flex-grow:1;}这样,问题就解决了,无论内容长度如何,我们都有一个粘性页脚。示例源代码:https://codepen.io/shadeed/pen/c735b26b8fa97ee685b38084448b3f85?editors=1100响应式元素假设我们有一个作品集来展示我们的响应式设计作品,并且我们有三种设备(手机、平板电脑和笔记本电脑)。每个设备都包含一个图像。Target使用CSS响应式地调整这些页面。通过使用CSS网格和视口单元,我们可以使它完全动态和响应。

也可以使用视口单位用于grid-*属性,也用于border、border-radius和其他属性。.wrapper{display:grid;grid-template-columns:repeat(20,5vw);grid-auto-rows:6vw;}.mobile{position:relative;z-index:1;grid-column:2/span3;网格行:3/span5;}.tablet{position:relative;z-index:1;grid-column:13/span7;grid-row:4/span4;border-bottom:1vwsolid#a9B9dd;border-right:solid3vw#a9B9dd;}.laptop{position:relative;grid-column:3/span13;grid-row:2/span8;}/*Viewportunitsareusedforthebottom,left,right,height,andborder-radius.是不是很酷?*/。laptop:after{content:"";position:absolute;bottom:-3vw;left:-5.5vw;right:-5.5vw;height:3vw;background-color:#a9B9dd;border-radius:001vw1vw;}案例来源代码:https://codepen.io/shadeed/pen/2da0f2b70699769f8de3220ff4465bc6?editors=1100打破容器我注意到一个最适合编辑布局的用例。占据视口宽度100%的子元素,即使父元素的宽度受到限制。考虑以下内容:.break-out{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;}让我们分解一下,以便我们Bit一点点你就能理解所有这些属性是如何工作的。1.Addwidth:100vw最重要的一步,设置图片的宽度为视口的100%。2.添加margin-left:-50vw为了使图像居中,我们需要给它一个负边距,即视口宽度的一半。3.Addleft:50%最后,我们需要将图像向右推,值为父级宽度的50%。示例地址:https://codepen.io/shadeed/pen/828f12b1ef7fa7211584ff5c7b82d2fa?editors=1100垂直和水平间距想到的另一个有趣的用例是使用视口单位来表示元素之间的间距。这可以与margin、top、bottom和grid-gap等值一起使用。使用时,间距将基于视口宽度或高度,这对于使布局更具动态性很有用。模态框对于模态,我们需要将它们从视口的顶部推入。通常,为此使用top属性,并使用百分比或像素值。然而,对于视口单位,我们可以添加一个可以根据视口高度改变的间距。.modal-body{top:20vh;}示例地址:https://codepen.io/shadeed/pen/f77a0d58947c64c2b3dadbd887700db5?editors=1100页眉是作为页面介绍的部分。它通常有一个标题和一个描述,顶部和底部边距的高度是固定的或填充的。例如有如下CSS样式:.page-header{padding-top:10vh;padding-bottom:10vh;}.page-headerh2{margin-bottom:1.5vh;}页面的padding使用vh单位标题和标题下方的边距。注意间距是如何变化的!示例源代码:https://codepen.io/shadeed/pen/43024fa031519e316e95bb3ce47f2b22?editors=1100Vmin和Vmax用例此用例是关于页面标题元素的顶部和底部填充。当视口很小(移动)时,填充通常会减少。通过使用vmin,我们可以根据视口的较小尺寸(宽度或高度)获得适当的顶部和底部填充。.page-header{padding:10vmin1rem;}示例源代码:https://codepen.io/shadeed/pen/f335c2f43b960a2c70ea057228ddc5b9?editors=0100宽高比我们可以使用vw单位创建响应式元素以保持其宽高比,而不管视口如何嘴很大。首先,您需要确定所需的纵横比,对于本例,使用9/16。section{/*9/16*100*/height:56.25vw;}示例源代码:https://codepen.io/shadeed/pen/dc4e82f3c873cc64ae5c5bc4a3f4ef9f?editors=0100流行的顶部边框你知道大多数网站使用的顶部边框吗?通常,它与品牌颜色相同,从而赋予一些个性。我们支持初始值为3px的边框。如何将固定值转换为视口对象?以下是计算其等效vw的方法。vw=(PixelValue/Viewportwidth)*100视口宽度用于估计像素值与所需vw单位之间的比率。对于我们的示例,我们将以下样式添加到标题中:.header{border-top:4pxsolid#8f7ebc;}在我的例子中,视口宽度为1440(这不是固定数字,请替换为您自己的)vw=(4/1440)*100=0.277.header{border-top:0.277vwsolid#8f7ebc;}更好的是,我们可以使用一个基本像素值,视口单元可以是一个额外的。.header{border-top:calc(2px+0.138vw)solid$color-main;}移动设备滚动问题移动设备有一个通病,即使是100vh,也会因为地址栏的高度可见而滚动。LouisHoebregts写了一篇关于这个问题的文章和一个简单的解决方案。.my-element{height:100vh;/*不支持自定义属性的浏览器的回退*/height:calc(var(--vh,1vh)*100);}//首先获取视口高度,我们乘以1%得到一个vh单元的值letvh=window.innerHeight*0.01;//然后,将`--vh`自定义属性中的值设置为文档的根目录属性document.documentElement。风格。setProperty('--vh',`${vh}px`);示例源码:https://codepen.io/shadeed/pen/1d18ca2d23ec0038c759dc62dc3fd8c3?editors=0110作者:Ahmadshaded译者:前端小智来源:sitepoint原文:https://ishadeed.com/viewport-units/这个文章转载自微信公众号“伟大的走向世界”,您可以通过以下二维码关注。转载本文请联系大千世界公众号。