响应式简述

@media
Media Queries(媒体查询),他的作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表。
其实就是,允许我们在不改变内容的情况下,改变页面的布局以精确适应不同的设备。
 
screen(屏幕)是媒体类型里的一种,css2.1定义了10种媒体类型。
and被称为关键字,其他关键字还包括not(排除某种设备),only(限定某种设备)。
(min-width:400px) 就是媒体特性,被防止在一堆圆括号内。
 
写法:
 
<link rel="stylesheet" type="text/css" href="style.css" media="screen and (min-width:600px) and (max-width:800px)">
 
<link rel="stylesheet" type="text/css" href="styleA.css" media="screen and (min-width:400px)">
 
@media screen and (max-width:600px){
     .classname{
         background:#ccc; 
     }
}
 
 
/*设备物理像素与设备独立像素比例,(一般用于判断横屏显示还是竖屏显示)*/
<link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio:2)" type="text/css" href="iphone4.css"/>
/**横屏显示**/
/*(orientation:portrait) 横向 (landscape)*/
 
写的时候必须要有空格,否则不生效
@media all and (orientation : landscape) {
     h2{color:red;}/*横屏时字体红色*/
}
/**竖屏显示**/
@media all and (orientation : portrait){
     h2{color:green;}/*竖屏时字体绿色*/
}
 
ie9以下的浏览器不支持css3的@media属性,我们的解决方法是加载一个兼容的js库
 
<!--[if lt IE 9]>
     <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->
 
 
响应式布局时的注意事项:
1.字体使用rem
html{
     font-size:62.5%;
}
font-size:2rem==font-size:20px;
 
2.设置最小宽度和最大宽度
min-width   和 max-width
 
3.宽度设置成百分比,不固定宽度
4.使用边框盒模型
box-sizing:border-box;
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/baixuemin/p/6492550.html

### Vue 响应式原理详解 Vue 的响应式机制是其核心功能之一,它通过数据绑定实现了视图与数据之间的同步更新。以下是关于 Vue 响应式原理的详细解析: #### 1. 数据劫持的核心技术 在 Vue 2 中,主要依靠 `Object.defineProperty` 方法来实现对对象属性的拦截和追踪。每当一个属性被访问或者修改时,都会触发 getter 和 setter 函数[^1]。 ```javascript function defineReactive(obj, key, val) { const dep = new Dep(); observe(val); // 对嵌套对象也进行观察 Object.defineProperty(obj, key, { enumerable: true, configurable: true, get() { if (Dep.target) { // 如果有 watcher 存在,则添加依赖关系 dep.addSub(Dep.target); } return val; }, set(newVal) { if (newVal === val) return; val = newVal; dep.notify(); // 通知所有订阅者更新视图 } }); } ``` 然而,在 Vue 3 中引入了更强大的 `Proxy` 技术替代了 `Object.defineProperty`[^3]。相比于后者,`Proxy` 提供了一个全局代理的能力,可以捕获更多类型的变更操作(如新增/删除属性),从而解决了许多局限性。 #### 2. Watcher 订阅者的角色 除了定义可观察的数据外,还需要有一个机制去监控这些变化并作出反应——这就是所谓的 **Watcher** 或称为 “观察者”。每一个组件实例都有自己的渲染函数作为初始 Wathcer ,当模板编译完成后会产生多个子级 watchers 负责具体 DOM 更新任务[^2]。 #### 3. 发布-订阅模式的应用 整个过程实际上是一种经典的发布-订阅设计模式体现: - 当某个属性被读取时 (`getter`) , 它会被加入到当前活动 watcher 列表中形成关联; - 若该属性随后发生改变(`setter`) ,则会触发之前注册过的回调逻辑 —— 即重新计算对应的虚拟节点树,并最终反映至真实页面上显示出来。 #### 4. 数组特殊处理 由于 JavaScript 原生方法不会触发 setters (比如 push(), splice() 等),因此 Vue 特意重写了部分常用数组原型上的方法以便能正常工作于响应体系之中[^4] 。 同样地,在升级版即 Vue3.x版本里借助 Proxy 解决方案简化了很多繁琐步骤的同时还增强了兼容性和性能表现。 --- ### 示例代码展示如何创建基本响应系统 以下是一段模拟简易版 Vue 响应系统的例子: ```javascript class Dep { constructor(){ this.subs = []; } addSub(sub){ this.subs.push(sub); } notify(){ this.subs.forEach(sub => sub.update()); } } class Watcher{ update(){} } let activeWatcher; function defineReactive(target,key,value){ let dep = new Dep(); Object.defineProperty(target,key,{ get:function reactiveGetter(){ if(activeWatcher){ dep.addSub(activeWatcher); } return value; }, set:function reactiveSetter(newValue){ if(value===newValue)return ; value=newValue; dep.notify();//通知所有的watchers执行update() } }) } //测试用例 const obj={}; defineReactive(obj,'foo','bar'); activeWatcher= new Watcher(); console.log('before:',obj.foo); obj.foo='baz';//触发setter console.log('after:',obj.foo); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值