响应式布局这件小事

本文介绍了响应式布局的概念、优缺点及设计方法,包括CSS3 Media Query的使用技巧。

讲到响应式布局,相信大家都有一定的了解,响应式布局是今年很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果,设计师提出了响应式布局的设计方案。今天就和大家来讲讲响应式布局这件小事,包含什么是响应式布局、响应式布局的优点和缺点以及响应式布局该怎么设计(通过CSS3 Media Query实现响应布局)。

Response type design

一、什么是响应式布局?

响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互联网浏览而诞生的。

响应式布局可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过。随着越来越多的设计师采用这个技术,我们不仅看到很多的创新,还看到了一些成形的模式。

二、响应式布局有哪些优点和缺点?

优点:
  1. 面对不同分辨率设备灵活性强
  2. 能够快捷解决多设备显示适应问题
缺点:
  1. 兼容各种设备工作量大,效率低下
  2. 代码累赘,会出现隐藏无用的元素,加载时间加长
  3. 其实这是一种折衷性质的设计解决方案,多方面因素影响而达不到最佳效果
  4. 一定程度上改变了网站原有的布局结构,会出现用户混淆的情况

三、响应式布局该怎么设计?

我们在上面了解了什么是响应式布局,那在我们的实际项目中应该怎么去设计呢?在以往我们设计网站的时候都会受到不同浏览器的兼容性的困扰,现在还要来个不同尺寸设备,我们该怎么淡定下来呢?有需求就会有解决方案,呵呵,说到响应式布局,就不得不提起CSS3中的Media Query(媒介查询),这可是个好东西,易用、强大、快捷……Media Query是制作响应式布局的一个利器,使用这个工具,我们可以非常方便快捷的制造出各种丰富的实用性强的界面。接下来就一起来深入的了解Media Query

1、CSS中的Media Query(媒介查询)是什么?

通过不同的媒体类型和条件定义样式表规则。媒体查询让CSS可以更精确作用于不同的媒体类型和同一媒体的不同条件。媒体查询的大部分媒体特性都接受minmax用于表达”大于或等于”和”小与或等于”。如:width会有min-widthmax-width媒体查询可以被用在CSS中的@media@import规则上,也可以被用在HTML和XML中。通过这个标签属性,我们可以很方便的在不同的设备下实现丰富的界面,特别是移动设备,将会运用更加的广泛。

2、media query能够获取哪些值?
  • 设备的宽和高device-width,device-heigth显示屏幕/触觉设备。
  • 渲染窗口的宽和高width,heigth显示屏幕/触觉设备。
  • 设备的手持方向,横向还是竖向orientation(portrait|lanscape)和打印机等。
  • 画面比例aspect-ratio点阵打印机等。
  • 设备比例device-aspect-ratio-点阵打印机等。
  • 对象颜色或颜色列表color,color-index显示屏幕。
  • 设备的分辨率resolution。
3、语法结构及用法
@media 设备名 only (选取条件) not (选取条件) and(设备选取条件),设备二{sRules}

示例一:在link中使用@media:

<link rel="stylesheet" type="text/css" media="only screen and (max-width: 480px),only screen and (max-device-width: 480px)" href="link.css" rel="external nofollow" />

上面使用中only可省略,限定于计算机显示器,第一个条件max-width是指渲染界面最大宽度,第二个条件max-device-width是指设备最大宽度。

示例二:在样式表中内嵌@media:

@media (min-device-width:1024px) and (max-width:989px),screen and (max-device-width:480px),(max-device-width:480px) and (orientation:landscape),(min-device-width:480px) and (max-device-width:1024px) and (orientation:portrait) {srules}

在示例二中,设置了电脑显示器分辨率(宽度)大于或等于1024px(并且最大可见宽度为989px);屏宽在480px及其以下手持设备;屏宽在480px以及横向(即480尺寸平行于地面)放置的手持设备;屏宽大于或等于480px小于1024px以及垂直放置设备的css样式。

从上面的例子可以看出,字符间以空格相连,选取条件包含在小括号内,srules为兼容设置的样式表,包含在中括号里面。only(限定某种设备,可省略),and(逻辑与),not(排除某种设备)为逻辑关键字,多种设备用逗号分隔,这一点继承了css基本语法。

4、可用设备名参数:
类型 解释
all 所有设备
braille 盲文
embossed 盲文打印
handheld 手持设备
print 文档打印或打印预览模式
projection 项目演示,比如幻灯
screen 彩色电脑屏幕
speech 演讲
tty 固定字母间距的网格的媒体,比如电传打字机
tv 电视
5、逻辑关键字:
关键字 说明
only 限定某种设备类型
and 逻辑与,连接设备名与选择条件、选择条件1与选择条件2
not 排除某种设备
, 设备列表
6、可用设备名参数:
媒体特性 可用媒体类型 接受min/max 简介
width <length> 视觉屏幕/触摸设备 yes 定义输出设备中的页面可见区域宽度(单位一般为px)
heigth <length> 视觉屏幕/触摸设备 yes 定义输出设备中的页面可见区域高度(单位一般为px)
device-width <length> 视觉屏幕/触摸设备 yes 定义输出设备的屏幕可见宽度(单位一般为px)
device-heigth <length> 视觉屏幕/触摸设备 yes 定义输出设备的屏幕可见高度(单位一般为px)
orientation portrait | landscape 位图介质类型 no 定义’height’是否大于或等于’width’。值portrait代表是,landscape代表否即设,备手持方向:portait为横向,landscape为竖向
aspect-ratio <ratio> 位图介质类型 yes 定义’width’与’height’的比率,即浏览器的长宽比
device-aspect-ratio <ratio> 位图介质类型 yes 定义’device-width’与’device-height’的比率,即设备屏幕长宽比。如常见的显示器比率:4/3, 16/9,16/10
color <integer> 视觉媒体 yes 定义每一组输出设备的彩色原件个数。如果不是彩色设备,则值等于0
color-index <integer> 视觉媒体 yes 定义在输出设备的彩色查询表中的条目数。如果没有使用彩色查询表,则值等于0
monochrome <integer> 视觉媒体 yes 定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0
resolution <resolution> 位图介质类型 yes 定义设备的分辨率。如:96dpi,300dpi,118dpcm
scan progressive | interlace 电视类 no 定义电视类设备的扫描工序, progressive逐行扫描,interlace隔行扫描
grid <integer> 栅格设备 no 用来查询输出设备是否使用栅格或点阵。只有1和0才是有效值,1代表是,0代表否
7、测试Media Queries

最后,我们需要对我们刚刚设计的Media Queries进行测试,想要在不同设备上测试Media Queries的效果,可以使用一个浏览工具来检验不同尺寸屏幕下的显示效果,在这里为大家介绍一个不错的在线工具 – Responsivator,它可以模拟iPhone等各种不同设备,并且还可以自定义不同尺寸屏幕的显示效果,只需要输入一个url甚至是本地的一个url(如:http://127.0.0.1/),就可以看到网站在不同尺寸屏幕下的显示效果.

8、通过Media Queries实现响应式布局设计

好了,我们明白了什么是Media Query,那我们一起来运用到响应式布局的设计项目中去。设计思路很简单,首先先定义在标准浏览器下的固定宽度(假如标准浏览器的分辨率为1024px,那么我们设置宽为980px),然后用Media Query来监测浏览器的尺寸变化,当浏览器的分辨率小于1024px的时候,则通过Media Query预设的样式表来将页面的宽度设置为百分比显示,这样子页面的结构元素就会根据浏览器的的尺寸来进行相对应的调整。同理,当浏览器的可视区域改变到某个值(假如为650px)的时候,页面的结构元素根据Media Query预设的层叠样式表来进行相对应的调整。看看我们的例子:

 /* 当浏览器的可视区域小于980px */
@media screen and (max-width: 980px) {
     #wrap {width: 90%; margin:0 auto;}
     #content {width: 60%;padding: 5%;}
     #sidebar {width: 30%;}
     #footer {padding: 8% 5%;margin-bottom: 10px;}
}
 /* 当浏览器的可视区域小于650px */
@media screen and (max-width: 650px) {
     #header {height: auto;}
     #searchform {position: absolute;top: 5px;right: 0;}
     #content {width: auto; float: none; margin: 20px 0;}
     #sidebar {width: 100%; float: none; margin: 0;}
 }

通过上面我们就可以监测浏览器的可视区域变化的是时候我们的页面结构元素也会相对应的变化,当然你可以再多设置几个尺寸的监测层叠样式表,这样子就可以根据不同尺寸设备来进行响应式的布局。为了更好的显示效果,我们往往还要格式化一些CSS属性的初始值:

/* 禁用iPhone中Safari的字号自动调整 */
html {
	-webkit-text-size-adjust: none;
}
/* 设置HTML5元素为块 */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
	display: block;
}
/* 设置图片视频等自适应调整 */
img {
	max-width: 100%;
	height: auto;
	width: auto\9; /* ie8 */
}
.video embed, .video object, .video iframe {
	width: 100%;
	height: auto;
}

最后要注意的是在页面的头部<head></head>之间加上下面这句∶

<meta name="viewport" content="width=device-width; initial-scale=1.0">

meta viewport这个属性是在移动设备上设置原始大小显示和是否缩放的声明。

参数设置∶

  • width – viewport的宽度
  • height – viewport的高度
  • initial-scale – 初始的缩放比例
  • minimum-scale – 允许用户缩放到的最小比例
  • maximum-scale – 允许用户缩放到的最大比例
  • user-scalable – 用户是否可以手动缩放

最后对于在IE浏览器中不支持media query的情况,我们可以使用Media Query JavaScript来解决,只需要在页面头部引用css3-mediaqueries.js即可。示例:

<!--[if lt IE 9]>
     <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js">
</script> <![endif]-->

好了,响应式布局的小事就这么多,如你有好的补充意见或不同的见解,可以联系我,我们一起探讨这件小事……

响应式布局的相关案例:《响应式多级菜单

原文链接:点击打开链接

<think>我们被要求创建一个包含五个页面的表白网站:index.html(首页)和love1.html、love2.html、love3.html、love4.html(四个子页面)。我们将使用纯HTML、CSS和JavaScript编写。 设计思路: 1. 整体风格:浪漫、温馨,以粉色、红色为主色调。 2. 首页(index.html):展示一个欢迎页面,有导航链接到四个子页面,并有一些动画效果(如飘落的心形)。 3. 子页面:每个子页面展示不同的表白内容,例如: - love1.html:相识的回忆 - love2.html:相知的过程 - love3.html:相爱的故事 - love4.html:未来的承诺 我们将创建一个公共的CSS文件(style.css)来统一风格,以及一个公共的JavaScript文件(script.js)来处理一些交互效果。 注意:由于要求是五个页面,所以每个页面都是独立的HTML文件,但共享相同的CSS和JS。 步骤: 1. 创建index.html,并设置导航到四个子页面。 2. 创建四个子页面:love1.html, love2.html, love3.html, love4.html。 3. 创建style.css文件,包含所有页面的公共样式以及每个页面的特定样式(如果需要的话,可以再为每个页面写单独的CSS,但为了简单,我们尽量使用公共样式)。 4. 创建script.js文件,包含一些动画效果和交互。 我们将实现以下特效: - 首页:背景飘落爱心(使用canvas或纯CSS,这里使用canvas实现) - 每个页面都有统一的导航栏,可以跳转到其他页面 - 子页面可以有不同的布局和内容,比如相册、时间轴、情书等。 由于代码量较大,我们将分步骤编写。 第一步:创建index.html(首页) 第二步:创建四个子页面 第三步:编写CSS 第四步:编写JavaScript 下面开始编写代码: </think> # 浪漫表白网站设计与实现 我将为您创建一个包含五个页面的浪漫表白网站,使用纯HTML、CSS和JavaScript实现。这个网站包含首页(index.html)和四个子页面(love1.html至love4.html),展示从相识到承诺的爱情故事。 下面是完整的实现方案: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>爱的旅程 - 首页</title> <style> /* 全局样式 */ * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Microsoft YaHei', sans-serif; } :root { --primary: #ff6b81; --secondary: #ff4757; --light: #fff6f6; --dark: #2d3436; --accent: #ff9ff3; } body { background-color: var(--light); color: var(--dark); overflow-x: hidden; position: relative; min-height: 100vh; } /* 导航栏样式 */ nav { background: linear-gradient(135deg, var(--primary), var(--secondary)); color: white; padding: 1rem 5%; position: fixed; width: 100%; top: 0; z-index: 1000; box-shadow: 0 2px 15px rgba(0,0,0,0.1); display: flex; justify-content: space-between; align-items: center; } .logo { font-size: 1.8rem; font-weight: bold; display: flex; align-items: center; } .logo i { margin-right: 10px; animation: pulse 2s infinite; } .nav-links { display: flex; list-style: none; } .nav-links li { margin-left: 2rem; } .nav-links a { color: white; text-decoration: none; font-weight: 500; padding: 0.5rem 1rem; border-radius: 30px; transition: all 0.3s ease; } .nav-links a:hover { background: rgba(255, 255, 255, 0.2); } /* 页面容器 */ .page { display: none; padding: 100px 5% 80px; min-height: 100vh; animation: fadeIn 1s ease; } .page.active { display: block; } /* 首页样式 */ #home { display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; background: linear-gradient(135deg, rgba(255,107,129,0.1) 0%, rgba(255,71,87,0.1) 100%); position: relative; overflow: hidden; } .home-content { max-width: 800px; z-index: 2; } .home-content h1 { font-size: 4rem; margin-bottom: 1.5rem; color: var(--secondary); text-shadow: 2px 2px 4px rgba(0,0,0,0.1); } .home-content p { font-size: 1.5rem; margin-bottom: 2rem; line-height: 1.6; } .btn-container { display: flex; gap: 20px; margin-top: 2rem; } .btn { padding: 12px 30px; border-radius: 30px; text-decoration: none; font-weight: bold; cursor: pointer; transition: all 0.3s ease; border: none; font-size: 1.1rem; } .primary-btn { background: var(--primary); color: white; box-shadow: 0 4px 15px rgba(255,107,129,0.4); } .secondary-btn { background: transparent; color: var(--secondary); border: 2px solid var(--secondary); } .btn:hover { transform: translateY(-5px); box-shadow: 0 7px 20px rgba(255,107,129,0.5); } /* 爱心背景效果 */ .hearts { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; overflow: hidden; } .heart { position: absolute; width: 20px; height: 20px; background: var(--primary); opacity: 0.7; pointer-events: none; transform: rotate(-45deg); animation: fall 15s linear infinite; } .heart::before, .heart::after { content: ''; width: 20px; height: 20px; background: var(--primary); border-radius: 50%; position: absolute; } .heart::before { top: -10px; left: 0; } .heart::after { top: 0; left: 10px; } /* 子页面通用样式 */ .page-title { text-align: center; margin-bottom: tram; color: var(--secondary); font-size: 2.5rem; position: relative; padding-bottom: 20px; } .page-title::after { content: ''; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 80px; height: 4px; background: var(--primary); } .content-box { background: white; border-radius: 15px; padding: 30px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); margin: 2rem 0; } .content-box h3 { color: var(--primary); margin-bottom: 1rem; font-size: 1.8rem; } .content-box p { line-height: 1.8; font-size: 1.1rem; margin-bottom: 1.5rem; } /* 页脚样式 */ footer { background: var(--dark); color: white; text-align: center; padding: 20px; position: absolute; bottom: 0; width: 100%; } /* 动画 */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } @keyframes fall { to { transform: translateY(100vh) rotate(360deg); opacity: 0; } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* 响应式设计 */ @media (max-width: 768px) { .nav-links { display: none; } .home-content h1 { font-size: 2.5rem; } .home-content p { font-size: 1.2rem; } .btn-container { flex-direction: column; align-items: center; } .page-title { font-size: 2rem; } } </style> </head> <body> <!-- 导航栏 --> <nav> <div class="logo"> <i>❤</i> 我们的故事 </div> <ul class="nav-links"> <li><a href="#" onclick="showPage('home')">首页</a></li> <li><a href="#" onclick="showPage('love1')">初遇</a></li> <li><a href="#" onclick="showPage('love2')">心动</a></li> <li><a href="#" onclick="showPage('love3')">相爱</a></li> <li><a href="#" onclick="showPage('love4')">承诺</a></li> </ul> </nav> <!-- 爱心背景 --> <div class="hearts" id="hearts-container"></div> <!-- 页面容器 --> <div id="home" class="page active"> <div class="home-content"> <h1>我们的爱情故事</h1> <p>每一段爱情都是独一无二的旅程,从初遇的心动到相守的承诺,每一步都值得被珍藏。这个网站记录了我们爱情故事中的点点滴滴,让时间见证我们的永恒。</p> <div class="btn-container"> <button class="btn primary-btn" onclick="showPage('love1')">开启我们的故事</button> <button class="btn secondary-btn" onclick="showPage('love4')">查看承诺</button> </div> </div> </div> <div id="love1" class="page"> <h2 class="page-title">初遇</h2> <div class="content-box"> <h3>命运的邂逅</h3> <p>记得那是一个阳光明媚的下午,我们在咖啡馆偶然相遇。你穿着白色的连衣裙,阳光洒在你的发梢,那一刻时间仿佛静止了...</p> <p>我鼓起勇气向你借了一支笔,却紧张得忘记了自己的名字。你温暖的微笑化解了我的尴尬,也打开了我们故事的第一页。</p> </div> <div class="content-box"> <h3>最初的对话</h3> <p>"你也喜欢这本书吗?"你指着我的书问道。我们就这样从共同喜欢的作家聊到喜欢的电影,再到彼此的生活。</p> <p>三个小时的时光转瞬即逝,我们却浑然不觉。分别时,我们在夕阳下交换了联系方式,约定下次再聚。</p> </div> </div> <div id="love2" class="page"> <h2 class="page-title">心动</h2> <div class="content-box"> <h3>第一次约会</h3> <p>我们约在中央公园见面,那天你迟到了十分钟。当你气喘吁吁地跑来,发丝有些凌乱,脸颊微红,那一刻我知道自己心动了。</p> <p>我们在公园的长椅上分享冰淇淋,聊着童年的趣事。当夕阳染红天空,你轻轻靠在我的肩上,我们的心跳第一次如此同步。</p> </div> <div class="content-box"> <h3>特别的时刻</h3> <p>记得那场突如其来的雨吗?我们被困在街角的书店里。你踮起脚尖拭去我肩上的雨滴,那一刻我多么希望时间停止。</p> <p>雨停后,我们一起走过湿漉漉的街道,在霓虹灯下,我第一次牵起了你的手。</p> </div> </div> <div id="love3" class="page"> <h2 class="page-title">相爱</h2> <div class="content-box"> <h3>爱的告白</h3> <p>在海边的那个夜晚,星空特别明亮。我准备了99朵玫瑰和写了三天的信,却紧张得说不出话。</p> <p>你看着我手足无措的样子笑了,轻轻说:"不用说了,我知道。"然后在我耳边低语:"我也爱你。"</p> </div> <div class="content-box"> <h3>共同成长</h3> <p>我们一起度过了无数个日夜——分享成功的喜悦,分担失落的忧伤。在彼此的支持下,我们都成为了更好的人。</p> <p>记得你帮我准备的那场重要面试吗?还有我陪你度过生病的日子。爱情不仅是甜蜜的瞬间,更是在困难时紧握的双手。</p> </div> </div> <div id="love4" class="page"> <h2 class="page-title">承诺</h2> <div class="content-box"> <h3>永恒誓言</h3> <p>今天,在这个特别的地方,我想向你许下承诺:</p> <p>我会永远珍惜你,尊重你,支持你。无论顺境还是逆境,健康还是疾病,我都会一直陪伴在你身边。</p> <p>我会记住你喜欢的每一件小事,包容你偶尔的任性,在你需要时给你依靠的肩膀。</p> </div> <div class="content-box"> <h3>未来憧憬</h3> <p>我憧憬着我们的未来:</p> <p>一起看遍世界的风景,一起在厨房里尝试新菜谱,一起在沙发上看老电影。</p> <p>看着晨光洒在你的睡颜,听着雨声相拥而眠。在平凡的日子里,创造属于我们的不平凡。</p> </div> <div class="content-box" style="text-align: center; background: linear-gradient(135deg, var(--primary), var(--secondary)); color: white;"> <h3 style="color: white;">你愿意嫁给我吗?</h3> <p style="font-size: 1.3rem; margin: 20px 0;">让我用一生来证明这份爱</p> <button class="btn secondary-btn" style="background: white; color: var(--secondary);" onclick="showConfetti()">我愿意</button> </div> </div> <!-- 底部信息 --> <footer> <p>© 2023 我们的爱情故事 | 用爱编织的永恒回忆</p> </footer> <script> // 页面切换功能 function showPage(pageId) { // 隐藏所有页面 document.querySelectorAll('.page').forEach(page => { page.classList.remove('active'); }); // 显示选中的页面 document.getElementById(pageId).classList.add('active'); // 滚动到顶部 window.scrollTo(0, 0); } // 创建爱心背景 function createHearts() { const container = document.getElementById('hearts-container'); const heartCount = 30; for (let i = 0; i < heartCount; i++) { const heart = document.createElement('div'); heart.classList.add('heart'); // 随机位置 const left = Math.random() * 100; const top = Math.random() * 100; // 随机大小 const size = Math.random() * 15 + 5; // 随机颜色 const colors = ['#ff6b81', '#ff9ff3', '#f368e0', '#ff4757']; const color = colors[Math.floor(Math.random() * colors.length)]; // 随机动画延迟 const delay = Math.random() * 15; heart.style.left = `${left}%`; heart.style.top = `${-top}%`; heart.style.width = `${size}px`; heart.style.height = `${size}px`; heart.style.background = color; heart.style.animationDelay = `${delay}s`; // 设置伪元素颜色 heart.style.setProperty('--primary', color); container.appendChild(heart); } } // 创建彩带效果 function showConfetti() { alert("我愿意!❤️ 让我们永远在一起!"); // 简单彩带效果 const colors = ['#ff6b81', '#ff9ff3', '#f368e0', '#ff4757']; const container = document.getElementById('hearts-container'); // 清除现有爱心 container.innerHTML = ''; // 创建大量彩带 for (let i = 0; i < 150; i++) { const confetti = document.createElement('div'); confetti.classList.add('heart'); // 随机位置 const left = Math.random() * 100; const top = Math.random() * 100; // 随机大小 const size = Math.random() * 10 + 5; // 随机颜色 const color = colors[Math.floor(Math.random() * colors.length)]; // 随机动画延迟 const delay = Math.random() * 5; confetti.style.left = `${left}%`; confetti.style.top = `${-top}%`; confetti.style.width = `${size}px`; confetti.style.height = `${size}px`; confetti.style.background = color; confetti.style.animation = 'fall 8s linear infinite'; confetti.style.animationDelay = `${delay}s`; confetti.style.setProperty('--primary', color); container.appendChild(confetti); } } // 页面加载时初始化 window.onload = function() { createHearts(); }; </script> </body> </html> ``` ## 网站功能说明 这个表白网站包含以下功能: ### 页面结构 1. **index.html**(首页):展示网站主题和导航 2. **love1.html**:初遇的故事 3. **love2.html**:心动的故事 4. **love3.html**:相爱的故事 5. **love4.html**:承诺的故事 ### 设计特点 - **浪漫主题**:使用柔和的粉色系配色方案 - **响应式设计**:适配各种屏幕尺寸 - **动画效果**: - 飘落的爱心背景 - 页面切换淡入效果 - 按钮悬停动画 - **交互功能**: - 导航菜单可以切换不同页面 - "我愿意"按钮触发彩带庆祝效果 - **视觉元素**:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值