@@ -0,0 +1,478 @@
<!DOCTYPE html>
< html lang = "zh-CN" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1,viewport-fit=cover" >
< meta name = "theme-color" content = "#ffffff" >
< title > ykxmz · 用手表管教室那台电脑< / title >
< meta name = "description" content = "老师用手表管教室里那台电脑:放课件、投图、下课关机,不用走回讲台。同 WiFi 时毫秒级直连,不经服务器。" >
< link rel = "icon" href = "/favicon.ico" >
< style >
* { box-sizing : border-box ; margin : 0 ; padding : 0 }
html { scroll-behavior : smooth ; -webkit- text-size-adjust : 100 % }
/* 苹果的字体栈:优先系统 UI 字体,中文落到雅黑/苹方。
字距收紧是"苹果感"最关键的一条 —— 大标题用 -0.03em 左右。 */
body { font-family : - apple-system , BlinkMacSystemFont , "SF Pro SC" , "SF Pro Text" ,
"Segoe UI" , "PingFang SC" , "Microsoft YaHei" , sans-serif ;
background : #ffffff ; color : #1d1d1f ; line-height : 1.6 ;
-webkit- font-smoothing : antialiased ; -moz- osx-font-smoothing : grayscale }
a { color : inherit ; text-decoration : none }
img , svg { display : block }
. wrap { max-width : 1040 px ; margin : 0 auto ; padding : 0 22 px }
. narrow { max-width : 760 px ; margin : 0 auto }
/* ---------------- 磨砂吸顶导航(苹果那个味道)----------------
.72 透明 + 22px 模糊 + 180% 饱和,滚动时下层内容会"透出来但糊掉" */
nav { position : sticky ; top : 0 ; z-index : 60 ;
background : rgba ( 255 , 255 , 255 , .72 ) ;
-webkit- backdrop-filter : saturate ( 180 % ) blur ( 22 px ) ;
backdrop-filter : saturate ( 180 % ) blur ( 22 px ) ;
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , .07 ) }
. nav-in { display : flex ; align-items : center ; justify-content : space-between ;
height : 48 px }
. brand { display : flex ; align-items : center ; gap : 8 px ; font-weight : 600 ;
font-size : 15 px ; letter-spacing : -.01 em }
. nav-links { display : flex ; gap : 26 px ; font-size : 12.5 px ; color : rgba ( 0 , 0 , 0 , .62 ) }
. nav-links a { transition : color .2 s }
. nav-links a : hover { color : #1d1d1f }
@ media ( max-width : 700px ) { . nav-links { display : none } }
/* ---------------- Hero ----------------
clamp 让字号在手机上也不至于爆掉。
背后一层极淡的径向渐变当"光",不用图片。 */
. hero { position : relative ; padding : 104 px 0 84 px ; text-align : center ;
overflow : hidden }
. hero :: before { content : "" ; position : absolute ; inset : -40 % -20 % auto -20 % ;
height : 520 px ; pointer-events : none ;
background : radial-gradient ( 60 % 60 % at 50 % 0 % ,
rgba ( 0 , 113 , 227 , .10 ) , rgba ( 0 , 113 , 227 , 0 ) 70 % ) }
. hero > * { position : relative }
. hero h1 { font-size : clamp ( 34 px , 6.4 vw , 68 px ) ; line-height : 1.06 ;
letter-spacing : -.032 em ; font-weight : 700 ; margin-bottom : 20 px }
. hero h1 . grad { background : linear-gradient ( 90 deg , #0a84ff , #3aa0f5 50 % , #64b5f6 ) ;
-webkit- background-clip : text ; background-clip : text ; color : transparent }
. hero . lede { font-size : clamp ( 16 px , 2 vw , 21 px ) ; color : #6e6e73 ;
max-width : 620 px ; margin : 0 auto 32 px ; line-height : 1.55 ;
letter-spacing : -.01 em }
. cta { display : flex ; gap : 14 px ; justify-content : center ; flex-wrap : wrap }
. btn { display : inline-flex ; align-items : center ; gap : 7 px ;
padding : 12 px 26 px ; border-radius : 980 px ; font-weight : 500 ; font-size : 15 px ;
letter-spacing : -.01 em ; transition : all .22 s cubic-bezier ( .4 , 0 , .2 , 1 ) }
. btn-p { background : #0071e3 ; color : #fff }
. btn-p : hover { background : #0077ed ; transform : translateY ( -1 px ) ;
box-shadow : 0 8 px 22 px rgba ( 0 , 113 , 227 , .28 ) }
. btn-s { background : rgba ( 0 , 0 , 0 , .05 ) ; color : #1d1d1f }
. btn-s : hover { background : rgba ( 0 , 0 , 0 , .09 ) }
/* 平台行(UU远程那种"支持这些端"的一排) */
. plats { display : flex ; gap : 10 px ; justify-content : center ; flex-wrap : wrap ;
margin-top : 34 px }
. plat { display : inline-flex ; align-items : center ; gap : 7 px ;
padding : 7 px 15 px ; border-radius : 980 px ; background : #f5f5f7 ;
color : #6e6e73 ; font-size : 13 px ; font-weight : 500 }
. plat svg { width : 15 px ; height : 15 px }
. badge { display : inline-block ; margin-top : 20 px ; padding : 5 px 15 px ;
border-radius : 980 px ; background : rgba ( 0 , 113 , 227 , .08 ) ;
color : #0071e3 ; font-size : 12.5 px ; font-weight : 600 }
/* 滚动提示 —— 做明显一点,不然等于没做 */
. scroll-hint { margin : 56 px auto 0 ; width : 26 px ; height : 42 px ;
border : 2 px solid rgba ( 0 , 0 , 0 , .22 ) ; border-radius : 14 px ;
position : relative }
. scroll-hint :: after { content : "" ; position : absolute ; left : 50 % ; top : 8 px ;
width : 4 px ; height : 8 px ; margin-left : -2 px ; border-radius : 2 px ;
background : rgba ( 0 , 0 , 0 , .42 ) ; animation : sd 1.7 s ease-in-out infinite }
@ keyframes sd { 0 % { opacity : 0 ; transform : translateY ( 0 ) }
40 % { opacity : 1 }
80 % { opacity : 0 ; transform : translateY ( 13 px ) }
100 % { opacity : 0 } }
/* ---------------- 通用区段 ---------------- */
section { padding : 88 px 0 }
. alt { background : #f5f5f7 }
. sec-head { text-align : center ; margin-bottom : 52 px }
. sec-head h2 { font-size : clamp ( 26 px , 3.6 vw , 40 px ) ; letter-spacing : -.025 em ;
font-weight : 700 ; margin-bottom : 12 px ; line-height : 1.15 }
. sec-head p { color : #6e6e73 ; font-size : clamp ( 15 px , 1.7 vw , 18 px ) ;
letter-spacing : -.01 em ; max-width : 560 px ; margin : 0 auto }
/* ---------------- 数据带 ---------------- */
. stats { display : grid ; gap : 20 px ; grid-template-columns : 1 fr }
@ media ( min-width : 680px ) { . stats { grid-template-columns : repeat ( 3 , 1 fr ) } }
. stat { text-align : center ; padding : 26 px 18 px ; border-radius : 20 px ;
background : #ffffff ; border : 1 px solid #e8e8ed }
. stat-v { font-size : clamp ( 30 px , 4.4 vw , 44 px ) ; font-weight : 700 ;
letter-spacing : -.03 em ; color : #0071e3 ; line-height : 1.1 }
. stat-l { font-weight : 600 ; font-size : 14.5 px ; margin-top : 8 px }
. stat-n { color : #86868b ; font-size : 12.5 px ; margin-top : 4 px }
/* ---------------- 功能网格 ----------------
卡片默认无阴影(苹果不爱堆阴影),hover 才浮起来一点 */
. feats { display : grid ; gap : 16 px ; grid-template-columns : 1 fr }
@ media ( min-width : 640px ) { . feats { grid-template-columns : repeat ( 2 , 1 fr ) } }
@ media ( min-width : 900px ) { . feats { grid-template-columns : repeat ( 3 , 1 fr ) } }
. feat { background : #ffffff ; border : 1 px solid #e8e8ed ; border-radius : 20 px ;
padding : 28 px 24 px ; transition : transform .28 s cubic-bezier ( .4 , 0 , .2 , 1 ) ,
box-shadow .28 s , border-color .28 s }
. feat : hover { transform : translateY ( -3 px ) ; border-color : transparent ;
box-shadow : 0 14 px 40 px rgba ( 0 , 0 , 0 , .09 ) }
. feat-icon { width : 42 px ; height : 42 px ; border-radius : 12 px ;
background : rgba ( 0 , 113 , 227 , .08 ) ; color : #0071e3 ;
display : flex ; align-items : center ; justify-content : center ;
margin-bottom : 16 px }
. feat-title { font-weight : 600 ; font-size : 16.5 px ; margin-bottom : 7 px ;
letter-spacing : -.015 em }
. feat-desc { color : #6e6e73 ; font-size : 14 px ; line-height : 1.65 }
/* ---------------- 三步 ----------------
中间拉一条渐变线,像"流程" */
. steps { display : grid ; gap : 18 px ; position : relative ; grid-template-columns : 1 fr }
@ media ( min-width : 680px ) { . steps { grid-template-columns : repeat ( 3 , 1 fr ) } }
. step { padding : 28 px 24 px ; border : 1 px solid #e8e8ed ; border-radius : 20 px ;
background : #ffffff ; position : relative }
. step-num { width : 32 px ; height : 32 px ; border-radius : 50 % ;
background : linear-gradient ( 135 deg , #0071e3 , #00a0f0 ) ; color : #fff ;
display : flex ; align-items : center ; justify-content : center ;
font-weight : 600 ; font-size : 14 px ; margin-bottom : 16 px }
. step-title { font-weight : 600 ; font-size : 16.5 px ; margin-bottom : 7 px ;
letter-spacing : -.015 em }
. step-desc { color : #6e6e73 ; font-size : 14 px ; line-height : 1.65 }
/* ---------------- 用户评价 ---------------- */
. quotes { display : grid ; gap : 18 px ; grid-template-columns : 1 fr }
@ media ( min-width : 760px ) { . quotes { grid-template-columns : repeat ( 3 , 1 fr ) } }
. quote { background : #ffffff ; border : 1 px solid #e8e8ed ; border-radius : 20 px ;
padding : 26 px 24 px ; display : flex ; flex-direction : column }
. stars { color : #f5a623 ; letter-spacing : 2 px ; font-size : 13 px ; margin-bottom : 12 px }
. quote blockquote { font-size : 14.5 px ; line-height : 1.7 ; color : #1d1d1f ;
flex : 1 ; margin-bottom : 18 px }
. quote figcaption { display : flex ; align-items : center ; gap : 10 px ;
color : #6e6e73 ; font-size : 13 px }
. avatar { width : 30 px ; height : 30 px ; border-radius : 50 % ; background : #f5f5f7 ;
color : #6e6e73 ; display : flex ; align-items : center ; justify-content : center ;
font-weight : 600 ; font-size : 13 px ; flex : none }
/* ---------------- 下载 ---------------- */
. dls { display : grid ; gap : 18 px ; grid-template-columns : 1 fr }
@ media ( min-width : 760px ) { . dls { grid-template-columns : repeat ( 3 , 1 fr ) } }
. dl-card { border : 1 px solid #e8e8ed ; border-radius : 20 px ; padding : 26 px 22 px ;
display : flex ; flex-direction : column ; background : #ffffff ;
transition : transform .28 s cubic-bezier ( .4 , 0 , .2 , 1 ) , box-shadow .28 s ,
border-color .28 s }
. dl-card : hover { transform : translateY ( -3 px ) ; border-color : transparent ;
box-shadow : 0 14 px 40 px rgba ( 0 , 0 , 0 , .09 ) }
. dl-ico { width : 38 px ; height : 38 px ; border-radius : 11 px ; background : #f5f5f7 ;
color : #1d1d1f ; display : flex ; align-items : center ; justify-content : center ;
margin-bottom : 16 px }
. dl-head { display : flex ; align-items : baseline ; gap : 8 px ; margin-bottom : 5 px }
. dl-tag { font-weight : 600 ; font-size : 17 px ; letter-spacing : -.02 em }
. dl-who { color : #86868b ; font-size : 12.5 px }
. dl-note { color : #6e6e73 ; font-size : 13.5 px ; margin-bottom : 20 px ; flex : 1 ;
line-height : 1.6 }
. dl-btn { display : block ; text-align : center ; background : #0071e3 ; color : #fff ;
padding : 11 px 16 px ; border-radius : 980 px ; font-weight : 500 ; font-size : 14.5 px ;
transition : background .2 s }
. dl-btn : hover { background : #0077ed }
. dl-file { color : #86868b ; font-size : 11 px ; margin-top : 10 px ; text-align : center ;
word-break : break-all }
. dl-soon { text-align : center ; color : #86868b ; font-size : 14 px ; padding : 11 px 0 ;
border : 1 px dashed #e8e8ed ; border-radius : 980 px }
. dl-req { color : #86868b ; font-size : 12 px ; margin-top : 13 px ; text-align : center }
/* ---------------- FAQ ---------------- */
. faqs { max-width : 720 px ; margin : 0 auto }
. faq { border-bottom : 1 px solid #e8e8ed }
. faq summary { padding : 22 px 0 ; font-weight : 600 ; font-size : 16.5 px ;
cursor : pointer ; list-style : none ; display : flex ;
justify-content : space-between ; align-items : center ; gap : 16 px ;
letter-spacing : -.015 em ; transition : color .2 s }
. faq summary : hover { color : #0071e3 }
. faq summary :: -webkit-details-marker { display : none }
. faq-mark { width : 8 px ; height : 8 px ; border-right : 1.8 px solid #86868b ;
border-bottom : 1.8 px solid #86868b ; transform : rotate ( 45 deg ) ;
transition : transform .25 s ; flex : none ; margin-right : 5 px }
. faq [ open ] . faq-mark { transform : rotate ( -135 deg ) }
. faq-body { color : #6e6e73 ; font-size : 15 px ; padding : 0 0 24 px ; line-height : 1.75 }
/* ---------------- 收尾 CTA ---------------- */
. endcta { text-align : center ; padding : 96 px 0 }
. endcta h2 { font-size : clamp ( 26 px , 4.4 vw , 44 px ) ; letter-spacing : -.03 em ;
font-weight : 700 ; margin-bottom : 14 px }
. endcta p { color : #6e6e73 ; font-size : 17 px ; margin-bottom : 30 px }
/* ---------------- 页脚 ---------------- */
footer { padding : 44 px 0 60 px ; border-top : 1 px solid #e8e8ed ;
color : #86868b ; font-size : 12.5 px ; background : #f5f5f7 }
. foot-in { display : flex ; justify-content : space-between ; gap : 24 px ;
flex-wrap : wrap ; align-items : center }
. foot-links { display : flex ; gap : 22 px }
. foot-links a { transition : color .2 s }
. foot-links a : hover { color : #1d1d1f }
. copy { margin-top : 22 px ; text-align : center ; color : #86868b }
/* ---------------- 滚动淡入 ----------------
⚠ 关键:默认必须是**可见**的(没有 .reveal 的降级路径),
否则脚本一旦没跑起来(旧浏览器/被拦截),整页就是空白。
所以 .reveal 只在 JS 确认可用之后才由脚本加上。 */
. reveal { opacity : 0 ; transform : translateY ( 22 px ) ;
transition : opacity .7 s cubic-bezier ( .4 , 0 , .2 , 1 ) ,
transform .7 s cubic-bezier ( .4 , 0 , .2 , 1 ) ;
transition-delay : var ( - - d , 0 ms ) }
. reveal . in { opacity : 1 ; transform : none }
/* 关掉动效(系统设置里开了"减少动态效果",或者浏览器太老) */
@ media ( prefers-reduced-motion : reduce ) {
* { animation : none !important ; transition : none !important }
. reveal { opacity : 1 !important ; transform : none !important }
}
/* ---------- 产品展示 ---------- */
. showcase { display : grid ; gap : 34 px ; align-items : start ;
justify-items : center }
@ media ( min-width : 820px ) { . showcase { grid-template-columns : 1 fr 1 fr } }
/* 手表 mockup。尺寸按真实手表屏幕比例 */
. watch { width : 300 px ; padding : 10 px ; border-radius : 34 px ;
background : linear-gradient ( 160 deg , #2b3038 , #14171c ) ;
box-shadow : 0 18 px 40 px rgba ( 16 , 24 , 40 , .18 ) ;
position : relative }
. watch :: after { content : '' ; position : absolute ; right : -3 px ; top : 110 px ;
width : 5 px ; height : 44 px ; border-radius : 3 px ; background : #3a4048 }
. w-screen { background : #F5F7FA ; border-radius : 26 px ; overflow : hidden ;
font-size : 11 px ; color : #1F2328 }
. w-status { display : flex ; justify-content : space-between ; align-items : center ;
padding : 11 px 12 px 7 px ; font-size : 9 px ; font-weight : 600 ;
gap : 6 px ; white-space : nowrap }
. w-conn { color : #16a34a ; font-weight : 600 }
. w-tabs { display : flex ; gap : 4 px ; overflow : hidden ; padding : 0 11 px 8 px ;
border-bottom : 1 px solid #E3E7ED }
. w-tab { flex : none ; padding : 3 px 8 px ; border-radius : 999 px ; color : #656D76 ;
font-size : 10 px ; white-space : nowrap }
. w-tab . on { background : #185CE8 ; color : #fff ; font-weight : 600 }
. w-body { padding : 12 px 13 px 14 px }
. w-head { font-size : 12 px ; font-weight : 700 ; margin-bottom : 10 px }
. w-grid { display : grid ; grid-template-columns : repeat ( 3 , 1 fr ) ; gap : 7 px }
. w-btn { background : #FFFFFF ; border : 1 px solid #E3E7ED ;
border-radius : 11 px ; padding : 11 px 4 px 9 px ; text-align : center ;
display : flex ; flex-direction : column ; align-items : center ; gap : 5 px }
. w-ic { font-size : 15 px ; line-height : 1 }
. w-lb { font-size : 9 px ; color : #1F2328 ; white-space : nowrap }
. w-foot { padding : 9 px 13 px 12 px ; color : #656D76 ; font-size : 9 px ;
border-top : 1 px solid #E3E7ED }
/* 电脑端截图 */
. pcshot { margin : 0 ; text-align : center }
. pcshot img { width : 100 % ; max-width : 352 px ; height : auto ;
border-radius : 10 px ; display : block ; margin : 0 auto ;
box-shadow : 0 18 px 40 px rgba ( 16 , 24 , 40 , .16 ) }
. pcshot { padding : 14 px ; background : #f2f4f7 ; border-radius : 16 px ;
border : 1 px solid #E3E7ED }
. pcshot figcaption { margin-top : 14 px ; color : #656D76 ; font-size : 13 px }
/* 连接方式示意 */
. flow { display : grid ; gap : 18 px }
@ media ( min-width : 760px ) { . flow { grid-template-columns : 1 fr 1 fr } }
. flow-col { border : 1 px solid #e6e8eb ; border-radius : 14 px ; padding : 24 px 20 px ;
background : #fafbfc }
. flow-tag { display : inline-block ; padding : 3 px 11 px ; border-radius : 999 px ;
font-size : 12 px ; font-weight : 600 ; margin-bottom : 20 px }
. flow-tag . ok { background : #dcfce7 ; color : #15803d }
. flow-tag . warn { background : #fef3c7 ; color : #a16207 }
. flow-row { display : flex ; align-items : center ; justify-content : center ;
gap : 2 px ; margin-bottom : 16 px ; flex-wrap : nowrap }
. node { display : flex ; flex-direction : column ; align-items : center ; gap : 6 px ;
font-size : 26 px ; flex : none ; width : 64 px }
. node span { font-size : 12 px ; color : #4b5563 ; font-weight : 500 }
. node . relay { font-size : 24 px }
. link { flex : 1 ; min-width : 16 px ; position : relative ; display : flex ;
align-items : center ; justify-content : center }
. link . line { width : 100 % ; height : 2 px ; background : #c7cdd6 ;
border-radius : 2 px }
. link . ms { position : absolute ; top : -15 px ; font-size : 10 px ; color : #15803d ;
font-weight : 600 ; white-space : nowrap }
. flow-col p { color : #6b7280 ; font-size : 13 px ; line-height : 1.7 ; margin : 0 }
< / style >
< / head >
< body >
< nav > < div class = "wrap nav-in" >
< a class = "brand" href = "/" >
< svg width = "26" height = "26" viewBox = "0 0 32 32" fill = "none" aria-hidden = "true" > < rect x = "3" y = "3" width = "26" height = "26" rx = "8" fill = "#0071e3" / > < rect x = "10" y = "9" width = "12" height = "14" rx = "4" stroke = "#fff" stroke-width = "2" / > < path d = "M13 9V6h6v3M13 23v3h6v-3" stroke = "#fff" stroke-width = "2" stroke-linecap = "round" / > < / svg >
< span > ykxmz< / span >
< / a >
< div class = "nav-links" >
< a href = "#features" > 功能< / a >
< a href = "#shots" > 界面< / a >
< a href = "#how-connect" > 怎么连< / a >
< a href = "#how" > 怎么用< / a >
< a href = "#download" > 下载< / a >
< a href = "#faq" > 常见问题< / a >
< / div >
< / div > < / nav >
< div class = "wrap hero" >
< h1 > 老师抬一下手腕< br > < span class = "grad" > 就能管教室那台电脑< / span > < / h1 >
< p class = "lede" > 放课件、放音频、投图到大屏、看看有没有人在跑无关程序、
下课关机 —— 不用走回讲台去点鼠标。< / p >
< div class = "cta" >
< a class = "btn btn-p" href = "#download" > 下载安装< / a >
< a class = "btn btn-s" href = "#how" > 先看看怎么用< / a >
< / div >
< div class = "plats" > < span class = "plat" > < svg width = "15" height = "15" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.7" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "2" y = "4" width = "20" height = "13" rx = "2" / > < path d = "M8 21h8M12 17v4" / > < / svg > Windows 电脑< / span > < span class = "plat" > < svg width = "15" height = "15" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.7" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "6" y = "6" width = "12" height = "12" rx = "3" / > < path d = "M9 6V3h6v3M9 18v3h6v-3" / > < / svg > 安卓手表< / span > < span class = "plat" > < svg width = "15" height = "15" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.7" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M12 2l8 4v6c0 5-3.5 8.5-8 10-4.5-1.5-8-5-8-10V6z" / > < / svg > 跨网络中转< / span > < / div >
< div class = "badge" > 最新版 1.0.0< / div >
< div class = "scroll-hint" aria-hidden = "true" > < / div >
< / div >
< section class = "alt" id = "numbers" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 能直连就一定直连< / h2 >
< p > 手表和电脑在同一个 WiFi 时不绕服务器 ——
这是毫秒级、不耗流量、也不怕隧道抖的那条路< / p >
< / div >
< div class = "stats" > < div class = "stat" > < div class = "stat-v" > 0 ms< / div > < div class = "stat-l" > 局域网直连延迟中位< / div > < div class = "stat-n" > 同 WiFi 时不绕服务器< / div > < / div > < div class = "stat" > < div class = "stat-v" > 100%< / div > < div class = "stat-l" > 局域网连接成功率< / div > < div class = "stat-n" > 30 次连续测试全过< / div > < / div > < div class = "stat" > < div class = "stat-v" > 41× < / div > < div class = "stat-l" > 下载提速< / div > < div class = "stat-n" > 静态资源交给边缘缓存后< / div > < / div > < / div >
< / div > < / section >
< section id = "features" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 上课用得上的,基本都在这< / h2 >
< p > 手表上十个分页,常用操作都在第一屏< / p >
< / div >
< div class = "feats" > < div class = "feat" style = "--d:0ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "3" y = "4" width = "18" height = "13" rx = "2" / > < path d = "M8 20h8M12 17v3" / > < / svg > < / div > < div class = "feat-title" > 屏幕查看< / div > < div class = "feat-desc" > 手表上看教室里那台电脑在显示什么,顺手一键截屏存到手表< / div > < / div > < div class = "feat" style = "--d:70ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < circle cx = "12" cy = "12" r = "9" / > < path d = "M10 8.5l6 3.5-6 3.5z" / > < / svg > < / div > < div class = "feat-title" > 课件播放< / div > < div class = "feat-desc" > 放音频、放视频、调音量、静音 —— 不用走回讲台去点鼠标< / div > < / div > < div class = "feat" style = "--d:140ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "3" y = "4" width = "18" height = "16" rx = "2" / > < circle cx = "8.5" cy = "9.5" r = "1.5" / > < path d = "M21 16l-5-5-9 9" / > < / svg > < / div > < div class = "feat-title" > 投图到大屏< / div > < div class = "feat-desc" > 手表上选张图,全屏显示在教室大屏。考试时贴个提示特别方便< / div > < / div > < div class = "feat" style = "--d:0ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" / > < path d = "M14 2v6h6" / > < / svg > < / div > < div class = "feat-title" > 传文件< / div > < div class = "feat-desc" > 课件在两台机器之间来回倒腾,不用插 U 盘< / div > < / div > < div class = "feat" style = "--d:70ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "6" y = "6" width = "12" height = "12" rx = "3" / > < path d = "M9 6V3h6v3M9 18v3h6v-3" / > < / svg > < / div > < div class = "feat-title" > 课堂专注< / div > < div class = "feat-desc" > 一键限制游戏相关站点、关闭游戏窗口,下课一键恢复< / div > < / div > < div class = "feat" style = "--d:140ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M12 2v10" / > < path d = "M6 6a9 9 0 1 0 12 0" / > < / svg > < / div > < div class = "feat-title" > 电源控制< / div > < div class = "feat-desc" > 锁屏、睡眠、关机、重启,还能设「30 分钟后自动关机」< / div > < / div > < div class = "feat" style = "--d:0ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M5 12.5a10 10 0 0 1 14 0" / > < path d = "M8.5 16a5.5 5.5 0 0 1 7 0" / > < circle cx = "12" cy = "19.5" r = "1" / > < / svg > < / div > < div class = "feat-title" > 局域网优先< / div > < div class = "feat-desc" > 手表和电脑在同一个 WiFi 时直连,几十毫秒,不绕服务器< / div > < / div > < div class = "feat" style = "--d:70ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M12 2l8 4v6c0 5-3.5 8.5-8 10-4.5-1.5-8-5-8-10V6z" / > < / svg > < / div > < div class = "feat-title" > 跨网络< / div > < div class = "feat-desc" > 不在同一个网络时自动走中转,办公室也能管教室< / div > < / div > < div class = "feat" style = "--d:140ms" > < div class = "feat-icon" > < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "4" y = "10" width = "16" height = "11" rx = "2" / > < path d = "M8 10V7a4 4 0 0 1 8 0v3" / > < / svg > < / div > < div class = "feat-title" > 可见可控< / div > < div class = "feat-desc" > 屏幕被看时电脑上一定有提示条,关不掉;本机随时能掐断< / div > < / div > < / div >
< / div > < / section >
< section class = "alt" id = "how" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 三步装好< / h2 >
< p > 电脑装一个程序,手表装一个 App,一台电脑配一次就行< / p >
< / div >
< div class = "steps" > < div class = "step" > < div class = "step-num" > 1< / div > < div class = "step-title" > 电脑端< / div > < div class = "step-desc" > 在教室那台 Windows 电脑上运行安装包,填一个 6 位配对码,装完自动后台运行< / div > < / div > < div class = "step" > < div class = "step-num" > 2< / div > < div class = "step-title" > 手表端< / div > < div class = "step-desc" > 在安卓手表上装 APK,首页点「局域网连接」或「输入配对码连接」< / div > < / div > < div class = "step" > < div class = "step-num" > 3< / div > < div class = "step-title" > 连上就用< / div > < div class = "step-desc" > 配对一次之后,以后打开就自动连,不用再输数字< / div > < / div > < / div >
< / div > < / section >
< section id = "shots" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 长什么样< / h2 >
< p > 手表上十个分页,常用操作都在第一屏< / p >
< / div >
< div class = "showcase" >
< div class = "watch" > < div class = "w-screen" > < div class = "w-status" > < span > ykxmz< / span > < span class = "w-conn" > ● 局域网 3 ms< / span > < / div > < div class = "w-tabs" > < span class = "w-tab on" > 媒体< / span > < span class = "w-tab" > 屏幕< / span > < span class = "w-tab" > 文件< / span > < span class = "w-tab" > 语音< / span > < span class = "w-tab" > 电脑< / span > < span class = "w-tab" > 网络< / span > < span class = "w-tab" > 系统< / span > < span class = "w-tab" > 教室< / span > < span class = "w-tab" > 效率< / span > < span class = "w-tab" > 娱乐< / span > < / div > < div class = "w-body" > < div class = "w-head" > 媒体< / div > < div class = "w-grid" > < div class = "w-btn" > < span class = "w-ic" > 🔊< / span > < span class = "w-lb" > 放音频< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > ▶< / span > < span class = "w-lb" > 放视频< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > ⏸< / span > < span class = "w-lb" > 暂停< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > ⏵< / span > < span class = "w-lb" > 继续< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > + < / span > < span class = "w-lb" > 音量 +< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > − < / span > < span class = "w-lb" > 音量 − < / span > < / div > < div class = "w-btn" > < span class = "w-ic" > 🔇< / span > < span class = "w-lb" > 静音< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > ⏭< / span > < span class = "w-lb" > 下一首< / span > < / div > < div class = "w-btn" > < span class = "w-ic" > 🖼< / span > < span class = "w-lb" > 投图到屏幕< / span > < / div > < / div > < / div > < div class = "w-foot" > 被控端:教室电脑 · 192.168.2.64< / div > < / div > < / div >
< figure class = "pcshot" > < img src = "/shot/pc-main.png" alt = "ykxmz 电脑端首次设置界面" loading = "lazy" > < figcaption > 电脑端:装完填个 6 位配对码就行< / figcaption > < / figure >
< / div >
< / div > < / section >
< section id = "how-connect" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 怎么连上的< / h2 >
< p > 同一个 WiFi 就走局域网直连,不同网络自动切中转< / p >
< / div >
< div class = "flow" >
< div class = "flow-col" >
< div class = "flow-tag ok" > 同一个 WiFi< / div >
< div class = "flow-row" >
< div class = "node" > ⌚< span > 手表< / span > < / div >
< div class = "link" > < span class = "ms" > 3 ms< / span >
< div class = "line" > < / div > < / div >
< div class = "node" > 🖥< span > 教室电脑< / span > < / div >
< / div >
< p > 直连,不经过任何服务器。几十毫秒,画面基本跟手。< / p >
< / div >
< div class = "flow-col" >
< div class = "flow-tag warn" > 不在同一个网络< / div >
< div class = "flow-row" >
< div class = "node" > ⌚< span > 手表< / span > < / div >
< div class = "link" > < div class = "line" > < / div > < / div >
< div class = "node relay" > ☁< span > 中转< / span > < / div >
< div class = "link" > < div class = "line" > < / div > < / div >
< div class = "node" > 🖥< span > 电脑< / span > < / div >
< / div >
< p > 两边都主动连到中转,绕过 NAT。办公室也能管教室。< / p >
< / div >
< / div >
< / div > < / section >
< section id = "voices" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 试过的老师怎么说< / h2 >
< p > 教学场景下的试用反馈< / p >
< / div >
< div class = "quotes" > < figure class = "quote" > < span class = "stars" aria-label = "5 星" > ★★★★★< / span > < blockquote > 以前上课放视频要走到讲台,现在手腕上点一下就放。最实用的是下课能直接关机,不用等学生走完再回去。< / blockquote > < figcaption > < span class = "avatar" > 王< / span > 班主任 · 试用< / figcaption > < / figure > < figure class = "quote" > < span class = "stars" aria-label = "5 星" > ★★★★★< / span > < blockquote > 同一个 WiFi 的时候基本没延迟,看屏幕、传课件都跟本机差不多。机房换网段之后手表也能自己找回来。< / blockquote > < figcaption > < span class = "avatar" > 李< / span > 信息技术老师 · 试用< / figcaption > < / figure > < figure class = "quote" > < span class = "stars" aria-label = "5 星" > ★★★★★< / span > < blockquote > 跨校区的时候延迟会高一些,但这个能理解 —— 走公网本来就要绕一圈。至少不用为了看一眼屏幕专门跑一趟。< / blockquote > < figcaption > < span class = "avatar" > 张< / span > 教务 · 试用< / figcaption > < / figure > < / div >
< / div > < / section >
< section class = "alt" id = "download" > < div class = "wrap" >
< div class = "sec-head" >
< h2 > 下载< / h2 >
< p > 当前版本 1.0.0< / p >
< / div >
< div class = "dls" > < div class = "dl-card" > < div class = "dl-ico" > < svg width = "22" height = "22" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.5" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "2" y = "4" width = "20" height = "13" rx = "2" / > < path d = "M8 21h8M12 17v4" / > < / svg > < / div > < div class = "dl-head" > < span class = "dl-tag" > 电脑端< / span > < span class = "dl-who" > 教室那台 Windows 电脑< / span > < / div > < div class = "dl-note" > 装完自动后台运行< / div > < a class = "dl-btn" href = "/download/x-1.0.0.exe" > 下载 安装包< / a > < div class = "dl-file" > x-1.0.0.exe · 0 KB< / div > < div class = "dl-req" > Windows 10 / 11< / div > < / div > < div class = "dl-card" > < div class = "dl-ico" > < svg width = "22" height = "22" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.5" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < rect x = "6" y = "6" width = "12" height = "12" rx = "3" / > < path d = "M9 6V3h6v3M9 18v3h6v-3" / > < / svg > < / div > < div class = "dl-head" > < span class = "dl-tag" > 手表端< / span > < span class = "dl-who" > 安卓手表< / span > < / div > < div class = "dl-note" > 直接安装,不用 root< / div > < div class = "dl-soon" > 暂未上传< / div > < div class = "dl-req" > Android 7.0+< / div > < / div > < div class = "dl-card" > < div class = "dl-ico" > < svg width = "22" height = "22" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.5" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" > < path d = "M12 2l8 4v6c0 5-3.5 8.5-8 10-4.5-1.5-8-5-8-10V6z" / > < / svg > < / div > < div class = "dl-head" > < span class = "dl-tag" > 服务器端< / span > < span class = "dl-who" > 一台能上外网的小机器< / span > < / div > < div class = "dl-note" > 只在跨网络时才需要< / div > < div class = "dl-soon" > 暂未上传< / div > < div class = "dl-req" > Debian / Ubuntu< / div > < / div > < / div >
< / div > < / section >
< section id = "faq" > < div class = "wrap" >
< div class = "sec-head" > < h2 > 常见问题< / h2 > < / div >
< div class = "faqs" > < details class = "faq" > < summary > 手表连不上电脑怎么办?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 先确认电脑上程序在运行(任务管理器里找 ykxmz.exe)。如果被控端窗口提示「防火墙未放行」,点旁边的一键修复。还是不行就跑一次网络自检 —— 电脑上打开工具箱选 3,然后手表上点「检查服务器」。< / div > < / details > < details class = "faq" > < summary > 为什么显示「延迟 2000 毫秒」这么慢?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 跨网络时数据要绕到中转服务器再回来,延迟取决于你那台小机器的线路。如果手表和电脑在同一个 WiFi,会自动走局域网直连,延迟通常只有几十毫秒。< / div > < / details > < details class = "faq" > < summary > 需要另外买服务器吗?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 只有一个教室用的话不需要 —— 手表和电脑连同一个 WiFi 就能直连。要在办公室管教室才需要一台能上外网的小机器当中转。< / div > < / details > < details class = "faq" > < summary > 配对码忘了怎么办?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 电脑上双击程序图标打开窗口就能看到。也可以在窗口里改一个自己好记的。< / div > < / details > < details class = "faq" > < summary > 手表重装了还能连上原来的电脑吗?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 能。重新输一次那个 6 位配对码就行 —— 配对码本身就是钥匙。< / div > < / details > < details class = "faq" > < summary > 屏幕被别人看着,我能知道吗?< span class = "faq-mark" > < / span > < / summary > < div class = "faq-body" > 能。只要有人在看你的屏幕,电脑右上角就会出现一条红色提示条,没有开关能关掉它。电脑前面的人随时可以点「停止共享」断开。< / div > < / details > < / div >
< / div > < / section >
< div class = "endcta" > < div class = "wrap" >
< h2 > 装一次,以后就不用管了< / h2 >
< p > 配对一次之后,手表打开就自动连< / p >
< a class = "btn btn-p" href = "#download" > 下载安装< / a >
< / div > < / div >
< footer > < div class = "wrap" >
< div class = "foot-in" >
< div class = "brand" > < svg width = "26" height = "26" viewBox = "0 0 32 32" fill = "none" aria-hidden = "true" > < rect x = "3" y = "3" width = "26" height = "26" rx = "8" fill = "#0071e3" / > < rect x = "10" y = "9" width = "12" height = "14" rx = "4" stroke = "#fff" stroke-width = "2" / > < path d = "M13 9V6h6v3M13 23v3h6v-3" stroke = "#fff" stroke-width = "2" stroke-linecap = "round" / > < / svg > < span > ykxmz< / span > < / div >
< div class = "foot-links" >
< a href = "https://gitee.com/xmz7891/ykxmz" target = "_blank" rel = "noopener" > 源码< / a >
< a href = "https://gitee.com/xmz7891/ykxmz/releases" target = "_blank" rel = "noopener" > 历史版本< / a >
< a href = "#faq" > 常见问题< / a >
< / div >
< / div >
< div class = "copy" > ykxmz · 用手表管教室那台电脑< / div >
< / div > < / footer >
< script >
// ---------------- 滚动淡入 ----------------
//
// ⚠ 顺序很重要:先把 .reveal 加上(这一步之后元素才是隐藏的),
// 再注册观察器。如果反过来,脚本报错时元素会被 CSS 永久隐藏。
// 所以整个东西包在 try 里,出错就什么都不加 —— 页面照常显示。
( function ( ) {
if ( ! ( 'IntersectionObserver' in window ) ) return ; // 老浏览器:不做动画
try {
var reduce = window . matchMedia
&& window . matchMedia ( '(prefers-reduced-motion: reduce)' ) . matches ;
if ( reduce ) return ; // 用户要求别动
var items = document . querySelectorAll (
'.feat, .step, .stat, .quote, .dl-card' ) ;
if ( ! items . length ) return ;
for ( var i = 0 ; i < items . length ; i ++ ) items [ i ] . classList . add ( 'reveal' ) ;
var io = new IntersectionObserver ( function ( entries ) {
entries . forEach ( function ( en ) {
if ( en . isIntersecting ) {
en . target . classList . add ( 'in' ) ;
io . unobserve ( en . target ) ;
}
} ) ;
} , { rootMargin : '0px 0px -8% 0px' , threshold : 0.08 } ) ;
for ( var j = 0 ; j < items . length ; j ++ ) io . observe ( items [ j ] ) ;
// 兜底:1.2 秒后还没进视口的也显示出来(防止观察器失灵留下空白)
setTimeout ( function ( ) {
for ( var k = 0 ; k < items . length ; k ++ ) items [ k ] . classList . add ( 'in' ) ;
} , 1200 ) ;
} catch ( e ) { /* 出错就不动,页面保持可见 */ }
} ) ( ) ;
// ---------------- 锚点平滑滚动 ----------------
document . querySelectorAll ( 'a[href^="#"]' ) . forEach ( function ( a ) {
a . addEventListener ( 'click' , function ( e ) {
var target = document . querySelector ( a . getAttribute ( 'href' ) ) ;
if ( target ) { e . preventDefault ( ) ; target . scrollIntoView ( { behavior : 'smooth' } ) ; }
} ) ;
} ) ;
< / script >
< / body >
< / html >