如何构建一个响应式网站
zhezhongyun 2024-12-13 17:11 42 浏览
什么是响应式web网站
以前我写网的网页习惯的网页都是定宽的,比如最外层设置一个宽度为980px的盒子,这是因为那时候的网页主要显示在pc端上,而pc端显示器的大小差异不会特别大。于是固定宽度的样式写法成为了流行趋势。但是随着移动互联网的到来,设备类型的增多,如智能手机,平板。那么屏幕大小的差异也就凸显出来了,如果每一个屏幕设备宽度写一个样式的话,会发现存在大量重复的样式代码,且工作量会很大,于是我们需要一种减少重复样式,让样式能够自动适应屏幕的解决方案就出来了:"响应式"。我们知道不同的设备拥有不同屏幕大小即视口(viewport),那么我们不可能一个样式适应所有的屏幕大小,那么响应式解决的就是网站自动去识别不同屏幕,然后去使用对应的样式去适应屏幕。
注:“视口”(viewport),指显示网页的区域
响应式的核心技术
1.viewport属性
为了能够让我们的网页去适应屏幕的大小,我们需要添加一个meta属性
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
2.媒体查询
至此我们解决了让网页自动适应不同的视口大小,但是不同的视口大小要显示不同的样式,我们还需要借助媒体查询来完成。CSS3规范分成很多模块,媒体查询(3级)只是其中一个模块。利用媒体查询,可以根据设备的能力应用特定的CSS样式。比如,可以根据视口宽度、屏幕宽高比和朝向(水平还是垂直)等,只用几行CSS代码就改变内容的显示方式。媒体查询得到了广泛实现。除了古老的IE(8及以下版本),几乎所有浏览器都支持它。
媒体查询的语法
说了这么多媒体查询长什么样子呢,我们来看一点示例代码。
div {
background:green
}
@media screen and (min-width:350px){
div {
background:red
}
}
@media表示媒体查询代码,上面的内容含义是,如果是屏幕设备,并且视口宽度大于等于350px那么就会把div的背景颜色设置为红色,由于代码是由上向下循序解析的,所以,背景色红色会覆盖上面的背景色绿色的代码。
注:因为我们接触的设备都是有屏幕的所以screen可以省略
- 在 link 标签中使用媒体查询
<link rel="style sheet" type="text/css" media="(min-width:350px)" href="index.css">
这里会告诉浏览器,视口宽度大于等于350px时才加载index.css样式文件。
- @import 中使用媒体查询
@import url("base.css") screen and (max-width:350px);
css中可以通过import来导入其他的样式文件,这里告诉浏览器视口宽度大于等于350px时才加载base.css样式文件。
- 在css中使用媒体查询
@media screen and (min-width:350px){
div {
background:red
}
}
这里告诉浏览器视口宽度大于等于350px时把div的背景色设置为红色。
媒体查询中支持的属性
其他媒体查询最常用的属性就是min-width和max-width,其他的属性你可能一辈子都用不上
- width:视口宽度。
- height:视口高度。
- max-width:最大视口宽度
- min-width:最小视口宽度
- device-width:渲染表面的宽度(可以认为是设备屏幕的宽度)。
- device-height:渲染表面的高度(可以认为是设备屏幕的高度)。
- orientation:设备方向是水平还是垂直。
- aspect-ratio:视口的宽高比。16∶9的宽屏显示器可以写成aspect-ratio:16/9。 ? color:颜色组分的位深。比如min-color:16表示设备至少支持16位深。
- color-index:设备颜色查找表中的条目数,值必须是数值,且不能为负。
- monochrome:单色帧缓冲中表示每个像素的位数,值必须是数值(整数),比如
monochrome: 2,且不能为负。 - resolution:屏幕或打印分辨率,比如min-resolution: 300dpi。也可以接受每厘
米多少点,比如min-resolution: 118dpcm。 ? scan:针对电视的逐行扫描(progressive)和隔行扫描(interlace)。例如720p HD TV(720p
中的p表示progressive,即逐行)可以使用scan: progressive来判断; 而1080i HD TV
(1080i中的i表示interlace,即隔行)可以使用scan: interlace来判断。 - grid:设备基于栅格还是位图。
3.响应式图片
开发者不可能知道或预见浏览网站的所有设备,只有浏览器在打开和渲染内容时才会知道使用它的设备的具体情况(屏幕大小、设备能力等)。另一方面,只有开发者(你和我)知道自己手里有几种大小的图片。比如,我们有同一图片的三个版本,分别是小、中、大,分别对应于相应的屏幕大小和分辨率。浏览器不知道这些,我们得想办法让它知道。简言之,难点在于我们知道自己有什么图片,浏览器知道用户使用什么设备访问网站以及最合适的图片大小和分辨率是多少,两个关键因素无法融合。
使用picture元素
<picture>
<source media="(min-width: 750px)" srcset="source-medium.jpg">
<source media="(min-width: 350px)" srcset="source-small.jpg">
<img src="source.jpg">
</picture>
以上代码会根据视口宽度来适应使用不同的图片,如果视口宽度大于等于750px那么使用source-medium.js图片,否则,如果视口宽度大于等于350px使用source-small.jpg图片,否则都不满足条件使用source.jpg图片。这里source的顺序很重要,根据min-width大小按顺序进行编写,相反如果使用max-width就需要倒序编写。这样就可以根据不同大小视口使用不同大小的图片。
虽然<picture>很好用,但浏览器支持并不是全面。幸运的是,您可以在不支持此元素的浏览器中使用,方法就是使用Picturefill.js,下载地址: https://scottjehl.github.io/picturefill。
<script>document.createElement("picture");</script>
<script src="js/picturefill.min.js" async></script>
第一个<script>块用于无法识别<picture>元素的浏览器,如果浏览器在Picturefill完成加载之前用HTML解析它们,就可以防止出现问题。然后第二个块加载Picturefill库。
max-width
img {
max-width: 100%;
}
这里声明max-width,就是要保证所有图片最大显示为其自身的100%(即最大只可以显示为自身那么大)。此时,如果包含图片的元素(比如包含图片的body或div)比图片固有宽度小,图片会缩放占满最大可用空间。
为什么不用width:100%?
如果使用width:100%的话那么,图片的宽度就会是父容器的宽度,如果父容器的宽度大于图片的真实宽度,那么图片就会被拉伸变形。而max-width:100%则不会,因为宽度默认是auto那么会显示真实宽度,如果宽度大于父容器宽度,也会等比例缩放到父容器宽度
4.弹性布局
在很早很早之前,网站的宽度大都以百分比形式定义。百分比布局使得网页宽度能够随着查看它们的屏幕窗口大小变化,因而得名弹性布局。后来出现了固定宽度的布局方式,现如今,我们要做响应式设计了,又得回头捡起弹性布局设计。相信前端人员都用过flexbox,使用起来也非常的爽,之前垂直居中,瀑布流等写起来非常痛苦,但flexbox就很方便的解决了这些问题。
前缀
flexbox是css3中的属性,所以为了兼容各种浏览器需要添加各种浏览器对应的前缀,一下提供自动加前缀的方法:
- 1.使用智能的IDE,如:webstorm,它能够自动添加前缀
- 2.使用compass
- 3.使用Autoprefixer (https://github.com/postcss/autoprefixer)
主要属性
- display:flex
声明你的盒子是一个flexbox - flex-direction
声明主轴的方向
flex中没有水平和垂直的说法,只有主轴和侧轴的说法,比如,flex-direction:row,那么你的主轴方向为水平方向,侧轴方向为垂直方向,于是,justify-content: center以主轴方向对齐即当前为水平方向对齐,align-content: center以侧轴方向对齐即当前为垂直方向对齐,flex-direction:clunm反之亦然
主轴方向是否支持换行
主轴方向对齐方式
侧轴方向对齐方式
子盒子在父盒子中占的比例
举例:
垂直居中
<style>
div{
width: 400px;
height: 300px;
margin: 200px auto;
display: flex;
flex-direction: row; //默认主轴方向是row即水平方向
flex-wrap: wrap; //允许换行
align-content: center; //设置侧轴方向居中
background-color: paleturquoise;
}
p{
width: 100px;
height: 100px;
line-height: 100px;
background-color: rebeccapurple;
text-align: center;
}
</style>
<div>
<p>hello world</p>
</div>
水平偏移
<style>
ul{
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: nowrap;
/*flex-direction: row-reverse;*/
align-content:center;
background-color: deeppink;
}
li{
width: 100px;
height: 50px;
text-align: center;
line-height: 50px;
margin-right: 1px;
}
li:last-child{
margin-left: auto;
}
</style>
<ul>
<li>首页</li>
<li>动画</li>
<li>电视剧</li>
<li>电影</li>
<li>联系我们</li>
</ul>
相关推荐
- JPA实体类注解,看这篇就全会了
-
基本注解@Entity标注于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表。name(可选):实体名称。缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与@Tab...
- Dify教程02 - Dify+Deepseek零代码赋能,普通人也能开发AI应用
-
开始今天的教程之前,先解决昨天遇到的一个问题,docker安装Dify的时候有个报错,进入Dify面板的时候会出现“InternalServerError”的提示,log日志报错:S3_USE_A...
- 用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码
-
在人体姿态估计领域,传统方法通常将关键点作为基本处理单元,这些关键点在人体骨架结构上代表关节位置(如肘部、膝盖和头部)的空间坐标。现有模型对这些关键点的预测主要采用两种范式:直接通过坐标回归或间接通过...
- B 客户端流RPC (clientstream Client Stream)
-
客户端编写一系列消息并将其发送到服务器,同样使用提供的流。一旦客户端写完消息,它就等待服务器读取消息并返回响应gRPC再次保证了单个RPC调用中的消息排序在客户端流RPC模式中,客户端会发送多个请...
- 我的模型我做主02——训练自己的大模型:简易入门指南
-
模型训练往往需要较高的配置,为了满足友友们的好奇心,这里我们不要内存,不要gpu,用最简单的方式,让大家感受一下什么是模型训练。基于你的硬件配置,我们可以设计一个完全在CPU上运行的简易模型训练方案。...
- 开源项目MessageNest打造个性化消息推送平台多种通知方式
-
今天介绍一个开源项目,MessageNest-可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。开源地址:https://github.c...
- 使用投机规则API加快页面加载速度
-
当今的网络用户要求快速导航,从一个页面移动到另一个页面时应尽量减少延迟。投机规则应用程序接口(SpeculationRulesAPI)的出现改变了网络应用程序接口(WebAPI)领域的游戏规则。...
- JSONP安全攻防技术
-
关于JSONPJSONP全称是JSONwithPadding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。它的基本原理是利用HTML的元素标签,远程调用JSON文件来实现数据传递。如果...
- 大数据Doris(六):编译 Doris遇到的问题
-
编译Doris遇到的问题一、js_generator.cc:(.text+0xfc3c):undefinedreferenceto`well_known_types_js’查找Doris...
- 网页内嵌PDF获取的办法
-
最近女王大人为了通过某认证考试,交了2000RMB,官方居然没有给线下教材资料,直接给的是在线教材,教材是PDF的但是是内嵌在网页内,可惜却没有给具体的PDF地址,无法下载,看到女王大人一点点的截图保...
- 印度女孩被邻居家客人性骚扰,父亲上门警告,反被围殴致死
-
微信的规则进行了调整希望大家看完故事多点“在看”,喜欢的话也点个分享和赞这样事儿君的推送才能继续出现在你的订阅列表里才能继续跟大家分享每个开怀大笑或拍案惊奇的好故事啦~话说只要稍微关注新闻的人,应该...
- 下周重要财经数据日程一览 (1229-0103)
-
下周焦点全球制造业PMI美国消费者信心指数美国首申失业救济人数值得注意的是,下周一希腊还将举行第三轮总统选举需要谷歌日历同步及部分智能手机(安卓,iPhone)同步日历功能的朋友请点击此链接,数据公布...
- PyTorch 深度学习实战(38):注意力机制全面解析
-
在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变...
- 聊聊Spring AI的EmbeddingModel
-
序本文主要研究一下SpringAI的EmbeddingModelEmbeddingModelspring-ai-core/src/main/java/org/springframework/ai/e...
- 前端分享-少年了解过iframe么
-
iframe就像是HTML的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:独立上下文:每个iframe都拥有独立的DOM/CSS/JS环境(类似浏...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- HTML 参考手册 (28)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML中如何键入空格 (27)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)