首页
留言
友情链接
标签页
Search
1
那些顶级不落俗套的“美好祝福”
2,055 阅读
2
如何使用JavaScript获取和设置CSS root变量值
1,378 阅读
3
中国历史朝代顺序图
1,360 阅读
4
春和 《江海共余生》
999 阅读
5
唐诗三百首1-5
785 阅读
分享
Web前端
html&css
javascript
Vue
shopify
shoplazza
后端
ThinkPHP
YII2
服务器端
软件安装
问题合集
故事
诗词
生活
学习
学科
语文
数学
英语
物理
化学
生物
政治
历史
地理
自然
其他
抖音
快手
小视频
随笔
易经
书摘
今日话题
登录
/
注册
Search
标签搜索
一年级语文
sunshine
累计撰写
175
篇文章
累计收到
15
条评论
首页
栏目
分享
Web前端
html&css
javascript
Vue
shopify
shoplazza
后端
ThinkPHP
YII2
服务器端
软件安装
问题合集
故事
诗词
生活
学习
学科
语文
数学
英语
物理
化学
生物
政治
历史
地理
自然
其他
抖音
快手
小视频
随笔
易经
书摘
今日话题
页面
留言
友情链接
标签页
搜索到
51
篇与
的结果
2025-10-29
css 背景渐变色用法案例
下面给你一份「纯 CSS 渐变色背景」速查手册 + 10 个可直接复制的小案例,涵盖最常用场景:线性、径向、锥形、多色、动画、文字遮罩、边框、按钮、卡片、星空。所有代码均「零依赖」,粘进 <style> 就能玩。0. 语法 5 秒速记/* 线性 */ background: linear-gradient(角度或方向, 颜色1 停点1, 颜色2 停点2, ...); /* 径向 */ background: radial-gradient(形状 大小 at 位置, 颜色1 停点1, ...); /* 锥形(IE 不支持) */ background: conic-gradient(颜色1 停点1, ...);1. 清爽对角线(卡片常用).diagonal-soft { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }2. 双色分割 Banner(上下 50%).split-banner { background: linear-gradient(to bottom, #ff9a9e 50%, #fecfef 50%); }3. 径向聚光灯(按钮 hover).radial-btn { background: radial-gradient(circle at 50% 50%, #f6d365 0%, #fda085 100%); transition: .4s; } .radial-btn:hover { background-size: 150% 150%; /* 放大制造动感 */ }4. 多色条纹(进度条 or 彩蛋).rainbow-stripe { background: repeating-linear-gradient( 45deg, #ff006e 0px 10px, #8338ec 10px 20px, #3a86ff 20px 30px, #06ffa5 30px 40px ); }5. 锥形渐变仪表盘(IE 不支持).conic-wheel { width: 200px; height: 200px; border-radius: 50%; background: conic-gradient( red 0deg 60deg, orange 60deg 120deg, yellow 120deg 180deg, green 180deg 240deg, blue 240deg 300deg, purple 300deg 360deg ); }6. 文字渐变填充(mask 法).gradient-text { background: linear-gradient(90deg, #f093fb 0%, #f5576c 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-fill-color: transparent; }<h1 class="gradient-text">Hello Gradient</h1>7. 渐变边框(border-image).gradient-border { border: 4px solid transparent; border-image: linear-gradient(45deg, #12c2e9, #c471ed, #f64f59) 1; }8. 悬浮光晕按钮(伪元素 + 动画).glow-btn { position: relative; z-index: 1; background: linear-gradient(45deg, #2193b0, #6dd5ed); border: none; color: #fff; padding: 12px 28px; overflow: hidden; } .glow-btn::before { content: ""; position: absolute; inset: 0; background: linear-gradient(45deg, #ff006e, #8338ec, #3a86ff, #06ffa5); z-index: -1; opacity: 0; transition: opacity .4s; } .glow-btn:hover::before { opacity: 1; }9. 动态流动背景(纯 CSS 动画).animated-flow { background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); background-size: 400% 400%; animation: flow 8s ease infinite; } @keyframes flow { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }10. 星空粒子(径向随机小圆).starry-night { background: radial-gradient(ellipse at top, #1b2735 0%, #090a0f 100%), radial-gradient(2px 2px at 20px 30px, #eee, transparent), radial-gradient(2px 2px at 40px 70px, #fff, transparent), radial-gradient(1px 1px at 90px 40px, #fff, transparent), radial-gradient(1px 1px at 130px 80px, #fff, transparent), radial-gradient(2px 2px at 160px 30px, #ddd, transparent); background-size: 200px 100px; background-repeat: repeat; }11. 一行代码「超柔光」背景(Shopify 卡片最爱).soft-light { background: linear-gradient(120deg, #fdfbfb 0%, #ebedee 100%); }12. 小技巧合集需求写法让渐变「固定」不随滚动background-attachment: fixed;渐变加透明度rgba(255,0,0,0.6) 或 #ff000099重复渐变repeating-linear-gradient(...)控制色标位置linear-gradient(90deg, red 20%, blue 80%)多层叠加用逗号分隔:background: url(img.png), linear-gradient(...);把上面 class 直接贴到元素就能看效果,改颜色、角度、停点即可快速拼出你自己的品牌渐变。祝玩得开心!
2025年10月29日
9 阅读
0 评论
0 点赞
2025-10-28
在shopify站点上,每个section里,代码复用实例,该怎么优化?
在 Shopify 里,一个 .liquid Section 就是一块「彼此独立、可重复、可排序」的积木。 核心限制是:每个 Section 的代码最终会被 碎片式地 拼到同一个页面上;你 不能保证 两个 Section 谁在前谁在后,也 不能保证 只出现一次;Shopify 没有「公共 JS 打包器」——不能 在 Section 里直接写 import 然后让主题统一去 type="module" 合并;浏览器仍然 重复下载 同一个 CDN 地址,除非你用 nomodule/defer 做全局去重。因此,「单模块复用」那一套在 Section 级别 是行不通的;必须把 Vue 3 当全局库来用,并且保证:只加载一次;每个 Section 只负责「自己挂载自己」;即使两个相同 Section 被拖到同一页面,也能各自独立运行。下面给出 Shopify 官方推荐 的「Section-内自闭环 + 全局单例脚本」方案。一、theme.liquid(或 head 标签里)统一引入 Vue 3{%- comment -%} 仅当页面至少有一个需要 Vue 的 Section 时才加载 {%- endcomment -%} {%- if request.page_type contains 'index' or section_blocks_contains_vendor 'vue' -%} <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js" defer></script> {%- endif -%}说明vue.global.prod.js 是 IIFE 版本,会把 Vue 暴露成全局 Vue;defer 保证执行顺序在 DOM 解析之后,且 只下载一次;用 section_blocks_contains_vendor 是 Shopify 2.0 的过滤器,可自己换成任意条件。二、写一个通用 Section:sections/vue-counter.liquid<div class="vue-counter-section" data-vue-counter> <h1>{{ section.settings.heading }}</h1> <p>Counter 1: {{ count }}</p> <p>Counter 2: {{ count2 }}</p> <button @click="count++">+ Counter 1</button> <button @click="count2++">+ Counter 2</button> </div> <script> {% comment %} 把 Liquid 输出变成 JS 变量,避免全局污染 {% endcomment %} (function(){ const mountEl = document.currentScript.previousElementSibling; // 上面的 div const appName = 'vueCounterApp_{{ section.id }}'; // 唯一实例名 {% comment %} 等 Vue 全局对象就绪再初始化 {% endcomment %} function init(){ if (typeof Vue === 'undefined') { setTimeout(init, 50); return; } const { ref, createApp } = Vue; createApp({ setup(){ const count = ref(0); const count2 = ref(0); return { count, count2 }; } }).mount(mountEl); } init(); })(); </script> {% schema %} { "name": "Vue Counter", "settings": [ { "type": "text", "id": "heading", "label": "Heading", "default": "Counter Block" } ], "presets": [{ "name": "Vue Counter" }] } {% endschema %}三、同一个页面拖 N 个「Vue Counter」Section每个 Section 输出 独立 DOM + 独立脚本;由于 section.id 不同,变量名、挂载点互不影响;Vue 全局库只加载 一次;即使后续用「主题编辑器」再拖一个进来,也能立刻工作(document.currentScript 永远指向当前脚本块)。四、如果「多个不同 Section」都要用 Vue统一在 theme.liquid 里加一次 <script src="vue.global.prod.js" defer>;每个 Section 照抄上面「自闭环」模板即可;想再省 2 KB,可把 createApp 逻辑抽成 全局函数:<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js" defer></script> <script> window.mountVueCounter = function(el){ const { ref, createApp } = Vue; createApp({ setup(){ const count=ref(0), count2=ref(0); return {count,count2}; } }).mount(el); }; </script>然后在每个 Section 里只写:<div class="vue-counter" data-vue-counter></div> <script> (function(){ const el = document.currentScript.previousElementSibling; function run(){ if(typeof Vue==='undefined'){setTimeout(run,50);return;} window.mountVueCounter(el); } run(); })(); </script>五、小结目标Shopify Section 内的正确姿势只加载一次 Vue在 theme.liquid 用 <script src="vue.global.prod.js" defer>不重复下载浏览器缓存 + 全局变量每个 Section 独立用 section.id 做命名空间,自闭环脚本可重复拖放document.currentScript 保证永远拿到当前块不依赖打包器直接用 IIFE 版本,不写 type="module"按上面模板,无论多少个 Section、多少个实例,都能做到「零重复下载、零全局污染、零冲突」。
2025年10月28日
27 阅读
0 评论
0 点赞
2025-06-30
import 语句用于导入模块中,是否需要使用花括号
在 JavaScript 和 TypeScript 中,import 语句用于导入模块中的导出内容。是否需要使用花括号取决于导入的内容是默认导出还是命名导出。默认导出 (Default Export)如果你导入的是模块的默认导出内容,则不需要使用花括号。每个模块只能有一个默认导出。示例// 导出 export default function myDefaultFunction() { console.log("This is a default function"); } // 导入 import myFunction from "./myModule"; myFunction(); // 调用默认导出的函数命名导出 (Named Export)如果你导入的是模块的命名导出内容,则需要使用花括号来指定要导入的命名导出项。模块可以有多个命名导出。示例// 导出 export function namedFunction1() { console.log("This is named function 1"); } export function namedFunction2() { console.log("This is named function 2"); } // 导入 import { namedFunction1, namedFunction2 } from "./myModule"; namedFunction1(); // 调用命名导出的函数 1 namedFunction2(); // 调用命名导出的函数 2重命名导入内容你可以在导入时使用 as 关键字对导入的内容进行重命名。示例import { namedFunction1 as func1, namedFunction2 as func2 } from "./myModule"; func1(); func2();导入所有导出内容你可以使用通配符 * 导入模块中的所有导出内容,并将其作为对象处理。这种方式导入的是一个模块对象,所有命名导出的内容都作为该对象的属性。示例import * as myModule from "./myModule"; myModule.namedFunction1(); myModule.namedFunction2();导入模块对象如果你想要导入整个模块作为一个对象,可以使用 import 关键字后跟模块名。这种方式不常用,但有时会用于特定场景(如动态导入)。示例import myModule from "./myModule"; // 注意:这种方式导入的是模块的默认导出内容 // 如果没有默认导出,可能会得到一个包含命名导出的对象TypeScript 中的类型声明文件如果你在 TypeScript 中导入一个模块,而该模块没有类型声明文件,你可能需要创建一个类型声明文件来定义模块的接口。这有助于类型检查和代码补全。示例// myModule.d.ts export default function myDefaultFunction(): void; export function namedFunction1(): void; export function namedFunction2(): void;导入模块的特殊情况在某些情况下,你可能想要导入模块的类型定义而不需要实际使用其运行时值。这时,你可以使用 import type 语法(TypeScript 特定)来导入类型定义。示例import type { MyType } from "./types";总结来说,是否需要在 import 语句中使用花括号取决于你要导入的内容是默认导出还是命名导出。默认导出不需要花括号,而命名导出需要使用花括号来指定具体的导出项。
2025年06月30日
46 阅读
0 评论
0 点赞
2025-06-06
css 强制显示滚动条
/* 强制显示滚动条 */ .element::-webkit-scrollbar { -webkit-appearance: none; /* 去除默认样式 */ } .element::-webkit-scrollbar-thumb { /* 设置滚动条滑块 */ background-color: rgba(0,0,0,0.5); /* 设置滑块颜色 */ border-radius: 10px; /* 设置滑块圆角 */ border: 5px solid white; /* 设置滑块边框 */ }
2025年06月06日
43 阅读
0 评论
1 点赞
2025-02-11
npm login为什么一直跳到要注册cnpm,就是要登录npm,怎么登不了?
当使用 npm login 时一直跳到要注册 cnpm ,并且无法正常登录 npm,可能由以下几种原因导致,下面为你详细分析并给出解决办法。1. npm 源被设置为 cnpm 源cnpm 是淘宝镜像源的命令行工具,若你的 npm 源被设置成了 cnpm 源,执行 npm login 时就可能出现异常跳转。解决办法你可以通过以下命令查看当前 npm 源:npm config get registry若输出为类似 https://registry.npmmirror.com 或其他淘宝镜像源地址,就需要将其切换回 npm 官方源:npm config set registry https://registry.npmjs.org2. 全局配置文件被修改有时候,全局的 .npmrc 文件可能被修改,从而影响了 npm 的正常使用。解决办法你可以编辑全局 .npmrc 文件,移除可能存在的非官方源配置。Windows 系统:该文件通常位于 C:\Users\你的用户名\.npmrc 。Linux 或 macOS 系统:该文件一般在 ~/.npmrc 。使用文本编辑器打开该文件,删除其中所有内容或者只保留以下内容:registry=https://registry.npmjs.org3. 网络问题网络问题也可能导致无法正常登录 npm 。比如,你的网络环境可能限制了对 npm 官方源的访问。解决办法检查网络连接:确保你的网络连接正常,并且没有被防火墙或代理限制。使用代理:若你处于受限制的网络环境,可以配置代理来访问 npm 官方源。例如,使用以下命令配置代理:npm config set proxy http://proxy.example.com:8080 npm config set https-proxy http://proxy.example.com:8080请将 http://proxy.example.com:8080 替换为你实际的代理地址和端口。若不需要代理,可以使用以下命令移除代理配置:npm config delete proxy npm config delete https-proxy4. 尝试重新登录在完成上述操作后,再次尝试登录 npm :npm login按照提示输入你的 npm 用户名、密码和邮箱,若一切正常,就能成功登录。
2025年02月11日
293 阅读
0 评论
1 点赞
2024-08-16
如何理解 JS 的异步?
参考:JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。而渲染主线程承担着诸多的工作,渲染页面、执行 JS 都在其中运行。如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的主线程白白的消耗时间,另一方面导致页面无法及时更新,给用户造成卡死现象。所以浏览器采用异步的方式来避免。具体做法是当某些任务发生时,比如计时器、网络、事件监听,主线程将任务交给其他线程去处理,自身立即结束任务的执行,转而执行后续代码。当其他线程完成时,将事先传递的回调函数包装成任务,加入到消息队列的末尾排队,等待主线程调度执行。在这种异步模式下,浏览器永不阻塞,从而最大限度的保证了单线程的流畅运行。
2024年08月16日
213 阅读
0 评论
0 点赞
2024-08-15
shopify recently viewed products
// Save product ID to localStorage, for use in the 'Recently viewed products' section. {%- if request.page_type == 'product' %} try { const items = JSON.parse(localStorage.getItem('cc-recently-viewed') || '[]'); // If product ID is not already in the recently viewed list, add it to the beginning. if (!items.includes({{ product.id | json }})) { items.unshift({{ product.id | json }}); } // Set recently viewed list and limit to 12 products. localStorage.setItem('cc-recently-viewed', JSON.stringify(items.slice(0, 12))); } catch (e) {} {%- endif %}
2024年08月15日
201 阅读
0 评论
0 点赞
2024-08-02
javascript 返回顶部实例
平滑滚动到顶部示例
2024年08月02日
222 阅读
0 评论
1 点赞
2024-07-09
javascript 动态加载脚本
使用Promise 动态加载
2024年07月09日
253 阅读
0 评论
1 点赞
2024-07-03
防抖与节流
防抖与节流的区别:虽然防抖和节流都是优化高频率事件的方法,但它们有不同的侧重点:防抖(Debouncing):在特定时间内只执行一次函数,时间段内的重复调用会重新计时。适用于搜索输入、窗口调整大小等事件。节流(Throttling):限制函数在特定时间内执行的次数。适用于滚动事件、鼠标移动等。<script> function debounce(func, wait) { let timeout; return function (...args) { const context = this; clearTimeout(timeout); timeout = setTimeout(() => { func.apply(context, args); }, wait); }; } // 定义需要防抖的函数 function handleResize() { console.log('Window resized'); } // 创建防抖函数,设置等待时间为 300 毫秒 const debouncedResize = debounce(handleResize, 300); // 添加事件监听器 window.addEventListener('resize', debouncedResize); // 定义需要防抖的函数 function handleInput(event) { console.log('Input value:', event.target.value); } // 创建防抖函数,设置等待时间为 500 毫秒 const debouncedInput = debounce(handleInput, 500); // 添加事件监听器 // const inputElement = document.querySelector('input'); // inputElement.addEventListener('input', debouncedInput); // 节流函数实现 function throttle(func, wait) { let timeout; let lastRun = 0; return function (...args) { const context = this; const now = Date.now(); if (now - lastRun >= wait) { lastRun = now; func.apply(context, args); } else { clearTimeout(timeout); timeout = setTimeout(() => { lastRun = Date.now(); func.apply(context, args); }, wait - (now - lastRun)); } }; } // 节流函数使用示例 // 定义需要节流的函数 function handleScroll() { console.log('Scrolled'); } // 创建节流函数,设置等待时间为 200 毫秒 const throttledScroll = throttle(handleScroll, 200); // 添加事件监听器 window.addEventListener('scroll', throttledScroll); </script>
2024年07月03日
223 阅读
0 评论
1 点赞
1
2
...
6