VPS 流量为什么会差一倍?深入解析 DMIT、搬瓦工与 3X-UI 的流量统计机制
<div class="ce-block" data-id="q6KajeepGh" ><div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">先上图,再详细解说!</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="e4XXoFnSyw" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_e4XXoFnSyw" class="image-tool__image-picture _zoom" src="https://idceve.com/data/attachment/forum/202610/18/211056nnddteetu1t6565a.png" title="" alt="" data-aid="200"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="F4rkE1DcBT" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><span class="filename">VPS流量统计机制详解 infographic</span><span class="informations">1536×1024 539 KB</span></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vNLZpZHFM9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">在选购 VPS、搭建戴丽节点时,很多人都会遇到一个疑问:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qQ6HAhF63_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">为什么 3X-UI 面板显示使用了 100GB 流量,VPS 服务商后台却可能显示消耗了 200GB,甚至更多?</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="QkQTTuPnoR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">尤其是在使用 DMIT、搬瓦工(BandwagonHost)等海外 VPS 时,这种差异往往会直接影响套餐选择、流量预算以及实际使用成本。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5GbvpEU6yl" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">究竟是服务商多算了流量,还是 3X-UI 少算了流量?要回答这个问题,需要从流量计费规则、戴丽转发原理以及统计位置三个方面进行分析。</div>
</div>
</div><div class="ce-block" data-id="egcMptE3PH" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">一、VPS 服务商的流量是如何计算的?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="kJ3u9isAui" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">不同 VPS 服务商、不同套餐,采用的流量计费方式可能并不相同。常见的有两种。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cZGB9mzugf" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">1. 双向流量统计</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="pRraVmaus-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">双向计费通常将服务器的入站流量(Inbound)与出站流量(Outbound)相加。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="jKqa-POdVb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">计算公式:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="FD1FDLB2Vy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">总流量 = 入站流量 + 出站流量</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Lm_m8xCdPj" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">例如,一台 VPS 在一个统计周期内接收了 100GB 数据,同时向外发送了 100GB 数据,那么按照双向统计口径,累计消耗就是约 200GB。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3yVjE3EOL3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">2. 单向最大值统计</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="k3N6034JgI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">部分套餐采用单向最大值计费,即分别统计入站和出站流量,再取其中较大的数值。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="f0OHuj-G0R" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">计算公式:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Q1sDia7REQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">计费流量 = max(入站流量,出站流量)</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="typgOEWeHd" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">同样是入站 100GB、出站 100GB,如果套餐采用这种规则,计费流量就是 100GB,而不是 200GB。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="8yGx3rU4j2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">需要强调的是,不能仅凭服务商品牌判断所有套餐的计费规则,具体应以对应产品的官方说明为准。</div>
</div>
</div><div class="ce-block" data-id="5c1NJNHhjt" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">二、DMIT 与搬瓦工,应该怎样理解流量口径?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="Zw6dp3Rc0Y" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">DMIT 的官方文档涉及双向计费和单向最大值计费等不同模式,因此选购时应首先确认具体套餐的流量政策。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="m-lxYHoMFF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">搬瓦工的常见套餐则采用入站、出站流量相加的统计方式,上传和下载都可能消耗套餐额度。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="94iFDc_gF3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这意味着,即使两台 VPS 的配置相近、网络性能相似,如果套餐的流量计费方式不同,实际可使用的戴丽流量也可能有明显差别。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dHnS-KOAoB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">对于主要用于戴丽、下载、跨境访问的用户来说,不能只比较套餐标注的流量总量,还应结合计费口径判断实际使用成本。</div>
</div>
</div><div class="ce-block" data-id="gVZYl9kuXP" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">三、3X-UI 为什么会与服务商后台出现流量差异?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="CVm0-ousnt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">要理解这个问题,首先需要明确:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="auLSmIbpUQ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3X-UI 统计的是戴丽用户的流量,而服务商通常统计的是 VPS 网络接口上的流量。两者的统计边界并不相同。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7PiAs-s71-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3X-UI 基于 Xray-core 提供的流量统计能力,可以记录戴丽用户的上行(Up)和下行(Down)流量,并将相应的流量增量保存到面板中。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="TrnjZI55zY" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">通常情况下,用户总流量可以理解为:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YH6pY4Vj0v" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">用户总流量 = 用户上行流量 + 用户下行流量</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-ihoPiElm-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">因此,严格来说,不能笼统地认为 3X-UI 只统计单向流量。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9yiT7uJJRr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">真正值得关注的是:同一份业务数据,在戴丽转发链路上可能产生多次网络传输,但在用户级统计中,并不会按照 VPS 网卡的每一次收发都重复累计。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="KupeKYS2GK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这才是理解流量差异的关键。</div>
</div>
</div><div class="ce-block" data-id="D8ZVNpJLBv" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">四、一个例子:下载 100GB 文件,究竟消耗多少流量?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="1r3ItQDCBi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">假设用户通过一台 VPS 上的 VLESS 节点下载一个 100GB 的文件。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oFotfOEGe_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">数据传输过程大致如下:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="cF9QybmTxm" >
<div class="ce-block__content">
<ol class="cdx-list-ordered" style="list-style-type:none; margin-left: -15px;"><li class="cdx-list__item">1. 目标网站将文件数据发送到 VPS。</li><li class="cdx-list__item">2. VPS 上的 Xray 接收数据。</li><li class="cdx-list__item">3. Xray 将数据通过戴丽连接发送给用户。</li><li class="cdx-list__item">4. 用户最终接收到约 100GB 的文件数据。</li></ol>
</div>
</div><div class="ce-block ce-block--focused" data-id="sq6Rs-a8Pt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">在忽略协议开销、重传和其他流量的理想情况下:</div>
</div>
</div><div class="ce-block" data-id="FHkMctwjH7" >
<div class="ce-block__content">
<div class="cdx-block">
<div class="tc-wrap">
<div class="tc-table">
<div class="tc-row">
<div class="tc-cell">统计项目</div>
<div class="tc-cell">理论流量</div>
</div>
<div class="tc-row">
<div class="tc-cell">目标网站到 VPS 的数据传输</div>
<div class="tc-cell">约 100GB 入站</div>
</div>
<div class="tc-row">
<div class="tc-cell">VPS 到戴丽用户的数据传输</div>
<div class="tc-cell">约 100GB 出站</div>
</div>
<div class="tc-row">
<div class="tc-cell">服务商双向统计</div>
<div class="tc-cell">约 200GB</div>
</div>
<div class="tc-row">
<div class="tc-cell">3X-UI 用户下行统计</div>
<div class="tc-cell">约 100GB</div>
</div>
</div>
</div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kFcPQrR5_X" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">可以看到,同一份 100GB 的文件,在 VPS 的网络接口上经历了两段传输。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="tbkOhcV-uo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">服务商如果按入站与出站相加的方式计费,就可能累计约 200GB;而 3X-UI 的用户下行统计通常接近 100GB。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eMR83t2EU1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这并不意味着任何一方一定统计错误,而是两者统计的是不同层面的数据。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="mTBWgydcaq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">同样的道理也适用于上传场景:当用户向戴丽上传文件时,目标数据通常需要从用户传到 VPS,再由 VPS 发送给目标服务器。在简化的模型下,双向计费的服务商也可能累计约两倍于文件大小的流量。</div>
</div>
</div><div class="ce-block" data-id="HUeALTqNaH" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">五、3X-UI 的统计原理:为什么不能简单乘以二?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="lT88ynYdXH" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3X-UI 并不是直接读取 VPS 服务商的账单数据,而是通过 Xray 的统计接口获取流量计数器。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ah7wkEo2up" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">其基本过程可以概括为:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6Q0oxP0MzF" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item">Xray 按用户记录上行和下行字节数。</li><li class="cdx-list__item">3X-UI 定期读取累计计数器,计算新增流量。</li><li class="cdx-list__item">面板将流量增量保存到数据库,并用于用户流量统计和展示。</li></ul>
</div>
</div><div class="ce-block ce-block--focused" data-id="EIMu_65nwo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这意味着,3X-UI 的统计结果主要反映戴丽用户的业务使用情况,而不是整个 VPS 的所有网络活动。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3HYTt0NmKk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">此外,VPS 上可能还运行着网站、Docker 容器、下载程序、监控服务或其他戴丽服务。这些流量可能计入服务商账单,却不会全部出现在某个 3X-UI 用户的流量统计中。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="facbQayNfF" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">反过来,戴丽协议开销、系统网络活动、重传,以及不同软件版本中的统计差异,也会导致实际结果与理想模型不完全一致。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="fCVXIEKzEo" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">因此,将服务商流量简单设定为 3X-UI 流量的两倍,只能作为特定场景下的初步估算,不能作为所有 VPS、所有协议的固定换算公式。</div>
</div>
</div><div class="ce-block" data-id="JA4IYgXwoi" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">六、购买 VPS 时,应该关注什么?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="LmaNLJYWpV" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">对于戴丽用途而言,VPS 的实际价值不能只看标注的流量数字,还应综合考虑以下几个因素。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="c_YNLlOBjB" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">第一,确认流量计费口径。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1EEATDtTm2" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">弄清楚套餐采用双向流量相加,还是单向最大值计费。这直接影响戴丽业务下的实际流量消耗。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ysBF6LRZ9D" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">第二,区分用户流量和整机流量。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dHwcx9rUpz" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">3X-UI 用户流量适合用于管理各个节点、用户的业务使用量;服务商后台流量则更适合用于判断整台 VPS 的套餐消耗。两者不一致并不一定意味着出现了故障。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="we6bHHeRW6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">第三,关注线路和实际使用体验。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="_cTowx1-xZ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">对于戴丽、跨境访问、流媒体和远程办公等用途,线路质量、晚高峰表现、丢包率、路由稳定性与可用带宽,同样是影响使用体验的重要因素。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="GPWCTJ3moS" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">第四,按照真实需求计算成本。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="bbLJ6Qz89h" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">不要只比较谁的套餐流量更多。还应考虑流量计费口径、套餐价格、线路质量、服务稳定性和自身的月度使用量。</div>
</div>
</div><div class="ce-block" data-id="2-GDNRTX2x" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">七、如何验证自己的 VPS 有没有出现异常计费?</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="3rbWwGQMMD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">如果希望进行更严谨的判断,可以在低业务负载的情况下进行一次定量测试。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Ujy27dhKRR" >
<div class="ce-block__content">
<ol class="cdx-list-ordered" style="list-style-type:none; margin-left: -15px;"><li class="cdx-list__item">1. 记录 3X-UI 中指定用户的 Up、Down 数值。</li><li class="cdx-list__item">2. 记录 VPS 公网网卡的接收和发送字节数。</li><li class="cdx-list__item">3. 通过指定节点下载一个已知大小的文件。</li><li class="cdx-list__item">4. 再次记录上述数据,比较测试前后的增量。</li><li class="cdx-list__item">5. 最后结合服务商控制台的统计周期和计费规则进行核对。</li></ol>
</div>
</div><div class="ce-block ce-block--focused" data-id="Np3gAhbbAb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">需要注意,Linux 网卡的累计收发字节数包含整台服务器的网络活动,而不是只包含 3X-UI 的戴丽流量。测试期间应尽量减少其他业务流量,并考虑协议开销。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9eKWh7qs2c" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">通过这种方法,可以判断差异是否符合预期,而不是仅凭某个面板的数字就断定服务商多扣了流量。</div>
</div>
</div><div class="ce-block" data-id="ONEEeYBiEM" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">结语:看懂流量统计,比单纯追求大流量更重要</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="09guIHZGLA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">VPS 流量统计看似简单,实际上涉及服务商的计费规则、操作系统的网络接口计数、戴丽软件的用户级统计等多个层面。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PQNxPgH5He" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">DMIT、搬瓦工等服务商的不同套餐可能采用不同的流量政策;3X-UI 则主要依据 Xray 的上、下行统计数据管理戴丽用户流量。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="YAf6vw6HwI" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">在典型的戴丽转发场景下,100GB 的用户下载流量可能对应约 200GB 的服务器双向网络流量。但这个结果来自数据传输路径,而不是某条适用于所有情况的固定规则。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SdEupZivk3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">选 VPS,既要看流量有多少,也要看流量怎么算。只有弄清统计口径,才能更准确地比较套餐、评估成本,并选择真正适合自己的产品。</div>
</div>
</div><style type="text/css">
.ce-block {
margin-top: 20px;
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
/**
* Plugin styles
*/
.ce-header {
position: relative;
padding: 1px 0px 1px 15px;
margin: 0;
line-height: 1.25em;
outline: none;
margin-bottom: 10px;
}
.ce-header p,
.ce-header div {
padding: 0 !important;
margin: 0 !important;
}
.ce-header::before {
content: "";
background-color: #3e8fe3;
width: 6px;
height: 100%;
position: absolute;
left: 0;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
/**
* Styles for Plugin icon in Toolbar
*/
.ce-header__icon {
}
.ce-header::before {
position: absolute;
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
display: none;
cursor: text;
}
.ce-header:empty::before {
display: block;
}
.ce-header:empty:focus::before {
display: none;
}
/* FontSize */
h1.ce-header {
font-size: 2.0em;
}
h2.ce-header {
font-size: 1.7em;
}
h3.ce-header {
font-size: 1.4em;
}
h4.ce-header {
font-size: 1.15em;
}
h5.ce-header {
font-size: 0.95em;
}
h6.ce-header {
font-size: 0.8em;
}
/* Alignment*/
.ce-header--right {
text-align: right;
}
.ce-header--center {
text-align: center;
}
.ce-header--left {
text-align: left;
}
.ce-header--justify {
text-align: justify;
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.image-tool {
--bg-color: #cdd1e0;
--front-color: #388ae5;
--border-color: #e8e8eb;
}
.image-tool__image {
border-radius: 3px;
overflow: hidden;
margin-bottom: 10px;
}
.image-tool__image-picture {
max-width: 100%;
vertical-align: bottom;
display: block;
margin-left: auto;
margin-right: auto;
}
.image-tool__image-preloader {
width: 50px;
height: 50px;
border-radius: 50%;
background-size: cover;
margin: auto;
position: relative;
background-color: #cdd1e0;
background-position: center center;
}
.image-tool__image-preloader::after {
content: "";
position: absolute;
z-index: 3;
width: 60px;
height: 60px;
border-radius: 50%;
border: 2px solid #cdd1e0;
border-top-color: #388ae5;
left: 50%;
top: 50%;
margin-top: -30px;
margin-left: -30px;
animation: image-preloader-spin 2s infinite linear;
box-sizing: border-box;
}
.image-tool__caption::before {
position: absolute !important;
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
display: none;
}
.image-tool__caption:empty::before {
display: block;
}
.image-tool__caption:empty:focus::before {
display: none;
}
.image-tool--empty .image-tool__image {
display: none;
}
.image-tool--empty .image-tool__caption, .image-tool--loading .image-tool__caption {
display: none;
}
.image-tool .cdx-button {
display: flex;
align-items: center;
justify-content: center;
}
.image-tool .cdx-button svg {
height: auto;
margin: 0 6px 0 0;
}
.image-tool--filled .cdx-button {
display: none;
}
.image-tool--filled .image-tool__image-preloader {
display: none;
}
.image-tool--loading .image-tool__image {
min-height: 200px;
display: flex;
border: 1px solid #e8e8eb;
background-color: #fff;
}
.image-tool--loading .image-tool__image-picture {
display: none;
}
.image-tool--loading .cdx-button {
display: none;
}
/**
* Tunes
* ----------------
*/
.image-tool--withBorder .image-tool__image {
border: 1px solid #e8e8eb;
}
.image-tool--withBackground .image-tool__image {
padding: 15px;
background: #cdd1e0;
}
.image-tool--withBackground .image-tool__image-picture {
max-width: 60%;
margin: 0 auto;
}
.image-tool--stretched .image-tool__image-picture {
width: 100%;
}
.image-tool__caption {
text-align: center;
font-size: 14px;
color: #a3a3a3;
}
@keyframes image-preloader-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.ce-paragraph {
line-height: 1.6em;
outline: none;
text-indent: 2em;
font-size: 16px;
}
.ce-paragraph--right {
text-align: right;
}
.ce-paragraph--center {
text-align: center;
}
.ce-paragraph--left {
text-align: left;
}
.ce-paragraph--justify {
text-align: justify;
}
.ce-paragraph-text-indent {
text-align: justify;
}
.ce-paragraph:empty::before{
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
opacity: 0;
}
/** Show placeholder at the first paragraph if Editor is empty */
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty::before {
opacity: 1;
}
.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph:empty::before,
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty:focus::before {
opacity: 0;
}
.ce-paragraph p:first-of-type{
margin-top: 0;
}
.ce-paragraph p:last-of-type{
margin-bottom: 0;
}
.svg-icon {
width: 1em;
height: 1em;
}
.svg-icon path,
.svg-icon polygon,
.svg-icon rect {
fill: #4691f6;
}
.svg-icon circle {
stroke: #4691f6;
stroke-width: 1;
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.cdx-list {
margin:0;
outline:none;
display:block;
counter-reset:item;
padding:6px;
}
.cdx-list__item {
line-height:1.45em;
display:block;
padding-top:8px;
margin-left: 2em;
}
.cdx-list__item-children {
display:block;
}
.cdx-list__item {
outline:none
}
.cdx-list__item-content {
word-break:break-word;
white-space:pre-wrap;
grid-area:content;
padding-left:8px
}
.cdx-list__item:before {
counter-increment:item;
white-space:nowrap
}
.cdx-list-li-container {
display: flex;
}
.cdx-list-ordered .cdx-list__item:before {
/* content:counters(item,".",numeric) "." */
}
.cdx-list-ordered {
list-style-type: none;
margin-left: -15px;
counter-reset:item;
font-size: 16px;
}
.cdx-list-unordered {
font-size: 16px;
}
.cdx-list-unordered .cdx-list__item:before {
content:"•"
}
.cdx-list-checklist .cdx-list__item:before {
content:""
}
.cdx-list__settings .cdx-settings-button {
width:50%
}
.cdx-list__checkbox {
padding-top:calc((1.45em - 1.2em) / 2);
grid-area:checkbox;
width:1.2em;
height:1.2em;
display:flex;
cursor:pointer;
font-size: 16px;
}
.cdx-list__checkbox svg {
opacity:0;
height:1.2em;
width:1.2em;
left:-1px;
top:-1px;
position:absolute
}
@media (hover:hover) {
.cdx-list__checkbox:not(.cdx-list__checkbox--no-hover):hover .cdx-list__checkbox-check svg {
opacity:1
}
}.cdx-list__checkbox--checked-1 {
line-height:1.45em
}
@media (hover:hover) {
.cdx-list__checkbox--checked-1:not(.cdx-list__checkbox--checked-1--no-hover):hover .cdx-checklist__checkbox-check {
background:#0059AB;
border-color:#0059AB
}
}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check {
background:#369FFF;
border-color:#369FFF
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg {
opacity:1
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg path {
stroke:#fff
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check:before {
opacity:0;
visibility:visible;
transform:scale(2.5)
}
.cdx-list__checkbox-check {
cursor:pointer;
display:inline-block;
position:relative;
margin:0 auto;
width:1.2em;
height:1.2em;
box-sizing:border-box;
border-radius:5px;
border:1px solid #C9C9C9;
background:#fff
}
.cdx-list__checkbox-check:before {
content:"";
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
border-radius:100%;
background-color:#369FFF;
visibility:hidden;
pointer-events:none;
transform:scale(1);
transition:transform .4s ease-out,opacity .4s
}
.cdx-list__checkbox-check--disabled {
pointer-events:none
}
.cdx-list-start-with-field {
background:#F8F8F8;
border:1px solid rgba(226,226,229,.2);
border-radius:6px;
padding:2px;
display:grid;
grid-template-columns:auto auto 1fr;
grid-template-rows:auto
}
.cdx-list-start-with-field--invalid {
background:#FFECED;
border:1px solid #E13F3F
}
.cdx-list-start-with-field--invalid .cdx-list-start-with-field__input {
color:#e13f3f
}
.cdx-list-start-with-field__input {
font-size:16px;
outline:none;
font-weight:500;
font-family:inherit;
border:0;
background:transparent;
margin:0;
padding:0;
line-height:22px;
min-width:calc(100% - 10px)
}
.cdx-list-start-with-field__input::placeholder {
color:#797979;
font-weight:500
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.tc-wrap {
--color-background:#f9f9fb;
--color-text-secondary:#7b7e89;
--color-border:#e8e8eb;
--cell-size:0px;
--toolbox-icon-size:18px;
--toolbox-padding:6px;
--toolbox-aiming-field-size:calc(var(--toolbox-icon-size) + var(--toolbox-padding)*2);
border:1px solid var(--color-border);
position:relative;
height:100%;
width:100%;
margin-top:var(--toolbox-icon-size);
box-sizing:border-box;
display:grid;
grid-template-columns:calc(100% - var(--cell-size)) var(--cell-size);
}
.tc-wrap--readonly {
grid-template-columns:100% var(--cell-size)
}
.tc-wrap svg {
vertical-align:top
}
@media print {
.tc-wrap {
border-left-color:var(--color-border);
border-left-style:solid;
border-left-width:1px;
grid-template-columns:100% var(--cell-size)
}
}@media print {
.tc-wrap .tc-row:after {
display:none
}
}.tc-table {
position:relative;
width:100%;
height:100%;
display:grid;
font-size:14px;
line-height:1.4;
}
.tc-table:after {
width:calc(var(--cell-size));
height:100%;
left:calc(var(--cell-size)*-1);
top:0
}
.tc-table:after,.tc-table:before {
position:absolute;
content:""
}
.tc-table:before {
width:100%;
height:var(--toolbox-aiming-field-size);
top:calc(var(--toolbox-aiming-field-size)*-1);
left:0
}
.tc-table--heading .tc-row:first-child {
font-weight:600;
border-bottom:2px solid var(--color-border);
}
.tc-table--heading .tc-row:first-child :empty:before {
content:attr(heading);
color:var(--color-text-secondary)
}
.tc-table--heading .tc-row:first-child:after {
bottom:-2px;
border-bottom:2px solid var(--color-border)
}
.tc-add-column,.tc-add-row {
display:flex;
color:var(--color-text-secondary)
}
@media print {
.tc-add {
display:none
}
}.tc-add-column {
padding:4px 0;
justify-content:center;
border-top:1px solid var(--color-border);
}
@media print {
.tc-add-column {
display:none
}
}.tc-add-row {
height:var(--cell-size);
align-items:center;
padding-left:4px;
position:relative;
}
.tc-add-row:before {
content:"";
position:absolute;
right:calc(var(--cell-size)*-1);
width:var(--cell-size);
height:100%
}
@media print {
.tc-add-row {
display:none
}
}.tc-add-column,.tc-add-row {
transition:0s;
cursor:pointer;
will-change:background-color;
}
.tc-add-column:hover,.tc-add-row:hover {
transition:background-color .1s ease;
background-color:var(--color-background)
}
.tc-add-row {
margin-top:1px;
}
.tc-add-row:hover:before {
transition:.1s;
background-color:var(--color-background)
}
.tc-row {
display:grid;
grid-template-columns:repeat(auto-fit,minmax(10px,1fr));
position:relative;
border-bottom:1px solid var(--color-border);
}
.tc-row:after {
content:"";
pointer-events:none;
position:absolute;
width:var(--cell-size);
height:100%;
bottom:-1px;
right:calc(var(--cell-size)*-1);
border-bottom:1px solid var(--color-border)
}
.tc-row--selected {
background:var(--color-background)
}
.tc-row--selected:after {
background:var(--color-background)
}
.tc-cell {
border-right:1px solid var(--color-border);
padding:6px 12px;
overflow:hidden;
outline:none;
line-break:normal;
}
.tc-cell--selected {
background:var(--color-background)
}
.tc-wrap--readonly .tc-row:after {
display:none
}
.tc-toolbox {
--toolbox-padding:6px;
--popover-margin:30px;
--toggler-click-zone-size:30px;
--toggler-dots-color:#7b7e89;
--toggler-dots-color-hovered:#1d202b;
position:absolute;
cursor:pointer;
z-index:1;
opacity:0;
transition:opacity .1s;
will-change:left,opacity;
}
.tc-toolbox--column {
top:calc(var(--toggler-click-zone-size)*-1);
transform:translateX(calc(var(--toggler-click-zone-size)*-1/2));
will-change:left,opacity
}
.tc-toolbox--row {
left:calc(var(--popover-margin)*-1);
transform:translateY(calc(var(--toggler-click-zone-size)*-1/2));
margin-top:-1px;
will-change:top,opacity
}
.tc-toolbox--showed {
opacity:1
}
.tc-toolbox .tc-popover {
position:absolute;
top:0;
left:var(--popover-margin)
}
.tc-toolbox__toggler {
display:flex;
align-items:center;
justify-content:center;
width:var(--toggler-click-zone-size);
height:var(--toggler-click-zone-size);
color:var(--toggler-dots-color);
opacity:0;
transition:opacity .15s ease;
will-change:opacity;
}
.tc-toolbox__toggler:hover {
color:var(--toggler-dots-color-hovered)
}
.tc-toolbox__toggler svg {
fill:currentColor
}
.tc-wrap:hover .tc-toolbox__toggler {
opacity:1
}
.tc-settings .cdx-settings-button {
width:50%;
margin:0
}
.tc-popover {
--color-border:#eaeaea;
--color-background:#fff;
--color-background-hover:rgba(232,232,235,0.49);
--color-background-confirm:#e24a4a;
--color-background-confirm-hover:#d54040;
--color-text-confirm:#fff;
background:var(--color-background);
border:1px solid var(--color-border);
box-shadow:0 3px 15px -3px rgba(13,20,33,.13);
border-radius:6px;
padding:6px;
display:none;
will-change:opacity,transform;
}
.tc-popover--opened {
display:block;
animation:menuShowing .1s cubic-bezier(.215,.61,.355,1) forwards
}
.tc-popover__item {
display:flex;
align-items:center;
padding:2px 14px 2px 2px;
border-radius:5px;
cursor:pointer;
white-space:nowrap;
-webkit-user-select:none;
-moz-user-select:none;
user-select:none;
}
.tc-popover__item:hover {
background:var(--color-background-hover)
}
.tc-popover__item:not(:last-of-type) {
margin-bottom:2px
}
.tc-popover__item-icon {
display:inline-flex;
width:26px;
height:26px;
align-items:center;
justify-content:center;
background:var(--color-background);
border-radius:5px;
border:1px solid var(--color-border);
margin-right:8px
}
.tc-popover__item-label {
line-height:22px;
font-size:14px;
font-weight:500
}
.tc-popover__item--confirm {
background:var(--color-background-confirm);
color:var(--color-text-confirm);
}
.tc-popover__item--confirm:hover {
background-color:var(--color-background-confirm-hover)
}
.tc-popover__item--confirm .tc-popover__item-icon {
background:var(--color-background-confirm);
border-color:rgba(0,0,0,.1);
}
.tc-popover__item--confirm .tc-popover__item-icon svg {
transition:transform .2s ease-in;
transform:rotate(90deg) scale(1.2)
}
.tc-popover__item--hidden {
display:none
}
@keyframes menuShowing {
0% {
opacity:0;
transform:translateY(-8px) scale(.9)
}
70% {
opacity:1;
transform:translateY(2px)
}
to {
transform:translateY(0)
}
}
</style><style type="text/css">
.inline-code {
background: rgba(250, 239, 240, 0.78);
color: #b44437;
padding: 3px 4px;
border-radius: 5px;
margin: 0 1px;
font-family: inherit;
font-size: 0.86em;
font-weight: 500;
letter-spacing: 0.3px;
}
</style>
页:
[1]