Skip to Content

HTML Document

URL: https://komodmsk.ru/cat/sale
HTTP Status: 200 OK
MIME Type: text/html
Last Modified: Mon, 01 Jan 1601 00:00:00 GMT
Download Time: Less than a second
Cookies: None
Size: 72 KB
Depth: 1 clicks from home page
Charset: windows-1251
Forms: 2 forms containing 8 controls
HTTP Headers:  7 headers
Links In:  0 pages
Links Out:  39 links
Images:  25 images
CSS:  11 files
JavaScript:  0 files
Issue Issues: 18 issue(s) found in 100 location(s)

1<!DOCTYPE html>

2<html lang="ru">

3<head>

4<link rel="preconnect" href="https://mc.yandex.ru">

5<link rel="preconnect" href="https://vk.com">

6<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

7<meta http-equiv="Content-Language" content="ru">

8<meta name="viewport" content="width=device-width, initial-scale=1.0">

9<meta name="theme-color" content="#ffffff">

10<link rel="preload" href="/assets/fonts/fontawesome-webfont.woff2?v=4.7.0" as="font" type="font/woff2" crossorigin="anonymous">

11<style>

12 @font-face { font-family: 'FontAwesome'; font-display: swap; }

13 body { font-display: swap; }

14 .prod .labels-block { z-index: 20 !important; }

15

16 body.modal-open {

17 overflow: auto !important;

18 overflow-y: scroll !important;

19 padding-right: 0 !important;

20 }

21

22 @keyframes shimmer {

23 0% { background-position: -1000px 0; }

24 100% { background-position: 1000px 0; }

25 }

26

27 .cat-item-card-cover {

28 /* Светло-серый фон с градиентным бликом */

29 background: #f6f7f8;

30 background-image: linear-gradient(to right, #f6f7f8 0%, #edeef1 20%, #f6f7f8 40%, #f6f7f8 100%);

31 background-repeat: no-repeat;

32 background-size: 1000px 100%;

33 animation: shimmer 1.5s infinite linear forwards;

34

35 overflow: hidden;

36 position: relative;

37 display: block;

38 }

39

40 .cat-item-cover-img {

41 opacity: 0;

42 transform: scale(1.03); /* Легкий зум */

43 filter: blur(5px); /* Легкое размытие в начале */

44 transition: opacity 0.5s ease-out, transform 0.7s ease-out, filter 0.5s ease-out;

45

46 width: 100%;

47 height: auto;

48 object-fit: contain;

49 display: block;

50 will-change: opacity, transform;

51 }

52

53 .cat-item-cover-img.loaded {

54 opacity: 1;

55 transform: scale(1);

56 filter: blur(0);

57 }

58

59 .cat-item-card-cover.img-loaded {

60 animation: none;

61 background: none;

62 }

63 .topm, .feedback-link br{

64 display:none;

65 }

66 @media all and (min-width:1340px){

67 body a[aria-label="Позвонить нам"]{

68 padding:0 !important;

69 padding-top:15px !important;

70 }

71 .nav .dropdown{

72 display:none;

73 }

74 .feedback-link br{

75 display:block;

76 }

77 .topm{

78 display: flex;

79 flex-flow: wrap;

80 list-style: unset;

81 gap: 5px;

82 margin: 0;

83 padding: 0 12px;

84 float: left;

85 }

86 .topm li {

87 list-style: none;

88 }

89 .topm a {

90 display: flex;

91 flex-flow: column;

92 font-size: 10px;

93 gap: 5px;

94 align-items: center;

95 }

96 .topm .menu-icon{

97 margin-right:0;

98 }

99 .navbar-form.navbar-left{

100 padding:0;

101 }

102 .navbar-form .form-control{

103 max-width:100px;

104 }

105 .navbar-default .navbar-nav>li>a.feedback-link{

106 padding: 0;

107 padding-top: 5px;

108 font-size:12px;

109 text-align:center;

110 }

111 }

112 @media all and (min-width:1510px){

113 .topm{

114 width: 50%;

115 gap:10px;

116 justify-content: space-between;

117 padding: 0 5px;

118 }

119 .topm a {

120 font-size: 10px;

121 }

122 }

123 @media all and (min-width:1610px){

124 .navbar-form .form-control{

125 max-width:none;

126 }

127 }

128 @media all and (min-width:1890px){

129 .topm{

130 width: 54%;

131 gap:10px;

132 justify-content: space-between;

133 }

134 .topm a {

135 font-size: 14px;

136 gap:0;

137 }

138 .topm .menu-icon {

139 width: 31px;

140 }

141 body .navbar-form .form-control {

142 width: 220px;

143 }

144 }

145 @media all and (min-width:1950px){

146 .topm{

147 width: 55%;

148 }

149 }

150 @media all and (min-width:2000px){

151 .topm{

152 width: 56%;

153 }

154 }

155 @media all and (min-width:2100px){

156 .topm{

157 width: 58%;

158 }

159 }

160 </style>

161<title>Распродажа мебели! Большой выбор, низкие цены, доставка, сборка, гарантия.</title>

162<meta name="description" content="У нас распродажа! Весь ассортимент стеллажей «Билли», комодов и тумб «Нордик» и «Йорк» мы продаём с хорошей скидкой! Стиль, добротность, качество, гарантия два года, а теперь ещё и самые низкие цены!">

163<meta name="keywords" content="мебель, кухни, комоды, тумбы, обувницы, прихожие, столы, стулья, шкафы, библиотеки, стенки, спальни, купить, москва, спб">

164<link rel="icon" href="/favicon.ico" type="image/x-icon">

165<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

166<link rel="apple-touch-icon" sizes="180x180" href="/favicon-180x180.png">

167<link rel="icon" sizes="192x192" href="/favicon-192x192.png" type="image/png">

168<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">

169<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">

170<link rel="manifest" href="/manifest.json">

171<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"><link rel="canonical" href="https://komodmsk.ru/cat/sale"/><meta property="og:locale" content="ru_RU">

172<meta property="og:site_name" content="КомодМск — производство и продажа мебели">

173<meta property="og:type" content="website">

174<meta property="og:title" content="Распродажа мебели! Большой выбор, низкие цены, доставка, сборка, гарантия.">

175<meta property="og:description" content="У нас распродажа! Весь ассортимент стеллажей «Билли», комодов и тумб «Нордик» и «Йорк» мы продаём с хорошей скидкой! Стиль, добротность, качество, гарантия два года, а теперь ещё и самые низкие цены!">

176<meta property="og:image" content="https://komodmsk.ru/pages/about/img/hight-quality.jpg">

177<meta property="og:image:alt" content="У нас распродажа! Весь ассортимент стеллажей «Билли», комодов и тумб «Нордик» и «Йорк» мы продаём с хорошей скидкой! Стиль, добротность, качество, гарантия два года, а теперь ещё и самые низкие цены!">

178<style>

179 .slider-top { min-height: 290px; background: #fff; }

180 @media(max-width:600px){ .slider-top { min-height: 180px; } }

181

182 /* Ссылки в тексте - синие и подчеркнутые */

183 .main-article a, .main-intro a { text-decoration: underline !important; color: #0056b3; }

184 .main-article a:hover, .main-intro a:hover { text-decoration: none !important; }

185

186 /* Стрелки навигации - черные */

187 #btn-nav-previous svg, #btn-nav-next svg { fill: #000; }

188

189 /* === ПРАВКИ ДЛЯ ПРОХОЖДЕНИЯ ТЕСТА (Accessibility) === */

190

191 /* 1. Боковое меню: больше отступы */

192 .cat-menu li a {

193 padding-top: 12px !important;

194 padding-bottom: 12px !important;

195 display: block;

196 }

197

198 /* 2. ТЕЛЕФОНЫ: Делаем абсолютно черными и жирными */

199 .navbar-default .navbar-nav > li > a {

200 color: #000000 !important;

201 font-weight: 600 !important;

202 }

203

204 /* 3. ЗАКАЗАТЬ ЗВОНОК: Темно-бордовый цвет (проходит все тесты) */

205 .navbar-nav > li > a.feedback-link {

206 color: #b30000 !important;

207 text-decoration: underline;

208 font-weight: 600 !important;

209 }

210</style>

211<link rel="stylesheet" href="/assets/libs/bootstrap-3.3.7.min.css">

212<link rel="stylesheet" href="/assets/build/build.css?v24442">

213<link rel="stylesheet" href="/assets/css/styles2.css?v422">

214<link rel="stylesheet" href="/assets/libs/fontawesome-4.7.0.min.css" media="print" onload="this.media='all'">

215<noscript><link rel="stylesheet" href="/assets/libs/fontawesome-4.7.0.min.css"></noscript>

216<link rel="stylesheet" href="/assets/libs/select2.min.css" media="print" onload="this.media='all'">

217<noscript><link rel="stylesheet" href="/assets/libs/select2.min.css"></noscript>

218<link rel="stylesheet" href="/assets/libs/owl.carousel.min.css" media="print" onload="this.media='all'">

219<noscript><link rel="stylesheet" href="/assets/libs/owl.carousel.min.css"></noscript>

220<script>

221setTimeout(function() {

222 (function(m,e,t,r,i,k,a){

223 m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};

224 m[i].l=1*new Date();

225 k=e.createElement(t),a=e.getElementsByTagName(t)[0];

226 k.async=1;

227 k.src=r;

228 a.parentNode.insertBefore(k,a)

229 })(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

230

231 ym(31590058, "init", {

232 clickmap:false,

233 trackLinks:false,

234 accurateTrackBounce:false,

235 webvisor:false,

236 ecommerce:"dataLayer"

237 });

238}, 1500);

239</script><link rel="preload" href="/assets/libs/jquery-2.2.4.min.js" as="script">

240<script src="/assets/libs/jquery-2.2.4.min.js" fetchpriority="high"></script><script>

241 $(function() {

242 $('#btn-nav-previous').click(function(){

243 $(".menu-inner-box").animate({scrollLeft: "-=100px"});

244 });

245 $('#btn-nav-next').click(function(){

246 $(".menu-inner-box").animate({scrollLeft: "+=100px"});

247 });

248 });

249 </script><script>

250 // Ждем полной загрузки страницы (картинки, стили)

251 window.addEventListener("load", function(){

252 // Ждем еще 2.5 секунды, чтобы браузер "отдохнул"

253 setTimeout(function() {

254 var t=document.createElement("script");

255 t.type="text/javascript";

256 t.async=true;

257 t.src="https://vk.com/js/api/openapi.js?169";

258 t.onload=function(){

259 // Проверка на существование VK, чтобы избежать ошибок

260 if (typeof VK !== 'undefined' && VK.Retargeting) {

261 VK.Retargeting.Init("VK-RTRG-1753336-4SKta");

262 VK.Retargeting.Hit();

263 }

264 };

265 document.head.appendChild(t);

266 }, 2500);

267 });

268 </script>

269</head>

270<body id="body">

271<noscript><img src="https://vk.com/rtrg?p=VK-RTRG-1753336-4SKta" style="position:fixed; left:-999px;" alt="vk"></noscript>

<noindex></noindex><nav class="navbar navbar-default navbar-fixed-top"><div class="container-fluid">

272<div class="navbar-header">

273<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-main-navbar-collapse" aria-expanded="false"><span class="sr-only">Toggle</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="https://komodmsk.ru"><img src="/img/logo-n.png" class="no-lazy" loading="eager" width="160" height="23" decoding="async" alt="KomodMsk.ru — мебельная фабрика и интернет-магазин с доставкой по всей России"></a>

274</div>

275<div class="collapse navbar-collapse" id="bs-main-navbar-collapse">

276<ul class="nav navbar-nav" style="vertical-align:middle;">

277<li><a href="#" class="city-chooser" rel="nofollow"><i class="fas fa-map-marker-alt"></i> 

<span class="city-chooser__city js-link">Москва</span></a></li>

278<li class="dropdown">

279<a href="#" class="dropdown-toggle nav-catalog" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Каталог мебели<span class="caret"></span></a><ul class="dropdown-menu">

280<li itemprop="name">

<a href="/cat/sale" itemprop="url" style="color:#cc0000"><img src="/images/cat/1799.svg" width="24" height="24" alt="Распродажа" class="menu-icon">Распродажа</a></li>

281<li itemprop="name"><a href="/cat/../constructor" itemprop="url"><img src="/images/cat/2051.jpg" width="24" height="24" alt="Конструктор" class="menu-icon">Конструктор</a></li>

282<li itemprop="name"><a href="/cat/komody" itemprop="url"><img src="/images/cat/1680.svg" width="24" height="24" alt="Комоды" class="menu-icon">Комоды</a></li>

283<li itemprop="name"><a href="/cat/kuhny" itemprop="url"><img src="/images/cat/2012.svg" width="24" height="24" alt="Кухни" class="menu-icon">Кухни</a></li>

284<li itemprop="name"><a href="/cat/tumby" itemprop="url"><img src="/images/cat/1725.svg" width="24" height="24" alt="Тумбы" class="menu-icon">Тумбы</a></li>

285<li itemprop="name"><a href="/cat/obuvnicy" itemprop="url"><img src="/images/cat/1700.svg" width="24" height="24" alt="Обувницы" class="menu-icon">Обувницы</a></li>

286<li itemprop="name"><a href="/cat/prihozhie" itemprop="url"><img src="/images/cat/1731.svg" width="24" height="24" alt="Прихожие" class="menu-icon">Прихожие</a></li>

287<li itemprop="name"><a href="/cat/stoly" itemprop="url"><img src="/images/cat/1701.svg" width="24" height="24" alt="Столы" class="menu-icon">Столы</a></li>

288<li itemprop="name"><a href="/cat/chairs" itemprop="url"><img src="/images/cat/2042.svg" width="24" height="24" alt="Стулья" class="menu-icon">Стулья</a></li>

289<li itemprop="name"><a href="/cat/shkafy" itemprop="url"><img src="/images/cat/1722.svg" width="24" height="24" alt="Шкафы" class="menu-icon">Шкафы</a></li>

290<li itemprop="name"><a href="/cat/stellazhi" itemprop="url"><img src="/images/cat/1703.svg" width="24" height="24" alt="Стеллажи" class="menu-icon">Стеллажи</a></li>

291<li itemprop="name"><a href="/cat/stenki" itemprop="url"><img src="/images/cat/1743.svg" width="24" height="24" alt="Стенки" class="menu-icon">Стенки</a></li>

292<li itemprop="name"><a href="/cat/mebel-dlya-spalni" itemprop="url"><img src="/images/cat/1749.svg" width="24" height="24" alt="Спальни" class="menu-icon">Спальни</a></li>

293</ul>

294</li>

295</ul>

296<form class="navbar-form navbar-left" name="form1" action="/search.php">

297<div class="form-group"><input type="text" name="q" class="form-control input-sm" placeholder="Поиск по названию или артикулу"></div>

298<button class="btn btn-default btn-sm">Найти</button>

299</form>

300<ul class="topm">

301<li itemprop="name"><a href="/cat/../constructor" itemprop="url"><img src="/images/cat/const.png" width="24" height="24" alt="Конструктор" class="menu-icon">Конструктор</a></li>

302<li itemprop="name"><a href="/cat/komody" itemprop="url"><img src="/images/cat/1680.svg" width="24" height="24" alt="Комоды" class="menu-icon">Комоды</a></li>

303<li itemprop="name"><a href="/cat/tumby" itemprop="url"><img src="/images/cat/1725.svg" width="24" height="24" alt="Тумбы" class="menu-icon">Тумбы</a></li>

304<li itemprop="name"><a href="/cat/stellazhi" itemprop="url"><img src="/images/cat/1703.svg" width="24" height="24" alt="Стеллажи" class="menu-icon">Стеллажи</a></li>

305<li itemprop="name"><a href="/cat/shkafy" itemprop="url"><img src="/images/cat/1722.svg" width="24" height="24" alt="Шкафы" class="menu-icon">Шкафы</a></li>

306<li itemprop="name"><a href="/cat/stenki" itemprop="url"><img src="/images/cat/1743.svg" width="24" height="24" alt="Стенки" class="menu-icon">Стенки</a></li>

307<li itemprop="name"><a href="/cat/prihozhie" itemprop="url"><img src="/images/cat/1731.svg" width="24" height="24" alt="Прихожие" class="menu-icon">Прихожие</a></li>

308<li itemprop="name"><a href="/cat/obuvnicy" itemprop="url"><img src="/images/cat/1700.svg" width="24" height="24" alt="Обувницы" class="menu-icon">Обувницы</a></li>

309<li itemprop="name"><a href="/cat/stoly" itemprop="url"><img src="/images/cat/1701.svg" width="24" height="24" alt="Столы" class="menu-icon">Столы</a></li>

310<li itemprop="name"><a href="/cat/chairs" itemprop="url"><img src="/images/cat/2042.svg" width="24" height="24" alt="Стулья" class="menu-icon">Стулья</a></li>

311<li itemprop="name"><a href="/cat/kuhny" itemprop="url"><img src="/images/cat/2012.svg" width="24" height="24" alt="Кухни" class="menu-icon">Кухни</a></li>

312<li itemprop="name"><a href="/cat/mebel-dlya-spalni" itemprop="url"><img src="/images/cat/1749.svg" width="24" height="24" alt="Спальни" class="menu-icon">Спальни</a></li>

313<li itemprop="name"><a href="/cat/sale" itemprop="url" style="color:#cc0000"><img src="/images/cat/1799.svg" width="24" height="24" alt="Распродажа" class="menu-icon">Распродажа</a></li>

314</ul>

315<ul class="nav navbar-nav navbar-right">

316<li>

<a rel="nofollow" class="feedback-link" href="/feedback/form" target="_blank">Заказать<br> звонок</a></li>

317<li><a href="https://t.me/+79915674335" rel="nofollow" aria-label="Написать нам в Telegram">

<i class="fa fa-telegram nav-msg-img" target="_blank" aria-hidden="true"></i></a></li>

318<li>

<a href="tel:88002002327" class="" rel="nofollow" aria-label="Позвонить нам">

<i class="fa fa-phone nav-msg-img" target="_blank" aria-hidden="true"></i>8 800 200–23–27</a></li>

319<li>

<noindex><div class="main-basket">

320<div class="main-basket-row">

321<a href="/basket/list" rel="nofollow" aria-label="Перейти в корзину" style="display:block;width:100%;height:100%;cursor:pointer;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" class="svg-shop" viewBox="0 484 516 516" enable-background="new 0 484 516 516" xml:space="preserve">

322

323 <polyline fill="none" stroke-width="30" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points=" 26.9,577.6 114,621.8 201.9,886.7 "></polyline>

324

325 <circle fill="none" stroke-width="30" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="218" cy="933.2" r="44.8"></circle>

326

327 <line fill="none" stroke-width="30" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="262.1" y1="918.1" x2="486.9" y2="844.2"></line>

328 <path fill="none" stroke-width="30" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M462.3,790.1l-206,67.2c-0.5,0.2-1-0.1-1.2-0.6l-67.2-206c-0.2-0.5,0.1-1,0.6-1.2l206-67.2c0.5-0.2,1,0.1,1.2,0.6l67.2,206 C463,789.4,462.8,789.9,462.3,790.1z"></path>

329

330 <line fill="none" stroke-width="30" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="312.3" y1="680.1" x2="291.8" y2="618.4"></line>

331 </svg></a><a id="basket_items_title"><span class="no-products-text"></span><span id="basket_items_txt" style="display:none;">товаров: 0</span></a>

332</div>

333<div class="main-basket-list">

334<div class="js-basket-list-container-top"></div>

335<center class="to-basket" style="display:none;"><a rel="/basket/list" href="/basket/list" class="btn btn-yellow-inline btn-lg" style="margin-right:0!important;">

336 Перейти в корзину

337 </a></center>

338</div>

339</div></noindex></li>

340</ul>

341</div>

342</div></nav><div class="main-block container-fluid"><div class="row" style="margin-right: unset;margin-left: unset;"><div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" style="padding-right:0px;padding-left:0px;background: white;box-shadow: 0 3px 1px rgba(0, 0, 0, .05), 0 2px 0 rgba(0, 0, 0, .05), 0 1px 0 rgba(0, 0, 0, .05);"><div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" style="padding-left: 0px;padding-right: 0px;"><div class="main-content">

343<nav id="menu-container" class="arrow"><div id="btn-nav-previous"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg></div>

344<div id="btn-nav-next"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg></div>

345<div class="menu-inner-box"><div class="menu">

346<a href="/cat/sale" class="menu-item" itemprop="url" style="color:#cc0000">Распродажа</a>

<a href="/cat/../constructor" class="menu-item" itemprop="url">Конструктор</a>

<a href="/cat/komody" class="menu-item" itemprop="url">Комоды</a>

<a href="/cat/kuhny" class="menu-item" itemprop="url">Кухни</a>

<a href="/cat/tumby" class="menu-item" itemprop="url">Тумбы</a>

<a href="/cat/obuvnicy" class="menu-item" itemprop="url">Обувницы</a>

<a href="/cat/prihozhie" class="menu-item" itemprop="url">Прихожие</a>

<a href="/cat/stoly" class="menu-item" itemprop="url">Столы</a>

<a href="/cat/chairs" class="menu-item" itemprop="url">Стулья</a>

<a href="/cat/shkafy" class="menu-item" itemprop="url">Шкафы</a>

<a href="/cat/stellazhi" class="menu-item" itemprop="url">Стеллажи</a>

<a href="/cat/stenki" class="menu-item" itemprop="url">Стенки</a>

<a href="/cat/mebel-dlya-spalni" class="menu-item last-item" itemprop="url">Спальни</a>

347</div></div></nav>

<div class="breadcrumbs" itemscope="itemscope" itemtype="//schema.org/BreadcrumbList">

348<span itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem"><meta itemprop="position" content="1">

349<a href="/" itemprop="item">

<span itemprop="name" class="breadcrumb-item">Главная</span></a></span>

350  / 

351 <span itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem"><meta itemprop="position" content="2">

352<a href="/cat/sale" itemprop="item">

<span class="breadcrumb-item" itemprop="name">Распродажа</span></a></span>

353  / 

354 <span class="breadcrumb-item"></span>

355</div>

356<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper/swiper-bundle.min.css">

357<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/swiper@9.1.1/swiper-bundle.min.js"></script>

<script type="text/javascript" src="/assets/js/card-swiper.js"></script><link rel="stylesheet" href="/assets/css/cat.css">

358<style>

359 @keyframes shimmer {

360 0% { background-position: -1000px 0; }

361 100% { background-position: 1000px 0; }

362 }

363

364 .cat-item-card-cover {

365 background: #f6f7f8;

366 background-image: linear-gradient(to right, #f6f7f8 0%, #edeef1 20%, #f6f7f8 40%, #f6f7f8 100%);

367 background-repeat: no-repeat;

368 background-size: 1000px 100%;

369 animation: shimmer 1.5s infinite linear forwards;

370 overflow: hidden;

371 position: relative;

372 display: block;

373 }

374

375 .cat-item-card-cover.img-loaded {

376 animation: none;

377 background: none;

378 }

379

380 .cat-item-cover-img {

381 opacity: 0;

382 transform: scale(1.03);

383 filter: blur(5px);

384 transition: opacity 0.5s ease-out, transform 0.7s ease-out, filter 0.5s ease-out;

385 width: 100%;

386 height: auto;

387 object-fit: contain;

388 display: block;

389 will-change: opacity, transform;

390 }

391

392 .cat-item-cover-img.loaded {

393 opacity: 1;

394 transform: scale(1);

395 filter: blur(0);

396 }

397

398 .cat-items.row {

399 min-height: 800px;

400 position: relative;

401 }

402

403 .pagination-wrapper {

404 position: -webkit-sticky;

405 position: sticky;

406 bottom: 0;

407 z-index: 990;

408 background: rgba(255, 255, 255, 0.98);

409 border-top: 1px solid #e5e5e5;

410 padding: 12px 0;

411 width: 100%;

412 box-shadow: 0 -4px 20px rgba(0,0,0,0.04);

413 display: flex;

414 justify-content: center;

415 align-items: center;

416 }

417

418 .pagination {

419 display: flex !important;

420 justify-content: center;

421 align-items: center;

422 flex-wrap: wrap;

423 margin: 0 !important;

424 padding: 0 !important;

425 float: none !important;

426 gap: 6px;

427 }

428

429 .pagination li {

430 display: block !important;

431 padding: 0 !important;

432 margin: 0 !important;

433 border: none !important;

434 background: none !important;

435 float: none !important;

436 }

437

438 .pagination li a {

439 display: flex;

440 align-items: center;

441 justify-content: center;

442 height: 40px;

443 min-width: 40px;

444 padding: 0 12px !important;

445 font-family: 'Montserrat', sans-serif;

446 font-size: 15px !important;

447 font-weight: 600;

448 color: #333 !important;

449 text-decoration: none !important;

450 background: #fff;

451 border: 1px solid #e0e0e0;

452 border-radius: 6px;

453 transition: all 0.2s ease;

454 }

455

456 .pagination li a:hover {

457 border-color: #ffda44;

458 background-color: #fffdf0;

459 color: #000 !important;

460 transform: translateY(-1px);

461 }

462

463 .pagination li.active a {

464 background-color: #ffda44 !important;

465 border-color: #ffda44 !important;

466 color: #000 !important;

467 pointer-events: none;

468 }

469

470 .pagination li.copy a {

471 background-color: #f8f9fa;

472 }

473

474 .pagination li.disabled a {

475 opacity: 0.4;

476 cursor: default;

477 pointer-events: none;

478 }

479

480 .pagination li.hidden { display: none; }

481

482 @keyframes fadeInUpCard {

483 0% {

484 opacity: 0;

485 transform: translateY(40px);

486 }

487 100% {

488 opacity: 1;

489 transform: translateY(0);

490 }

491 }

492

493 .cat-item-card.newly-added {

494 opacity: 0;

495 animation: fadeInUpCard 0.6s ease-out forwards;

496 }

497/* === PREMIUM THIN PROGRESS LINE (NEWS STYLE) === */

498 @media (max-width: 768px) {

499

500 /* 1. ТОВАРЫ - ОДИН СТОЛБЕЦ (Без изменений, оставляем как было красиво) */

501 .cat-items.row,

502 .catalogue-products.row {

503 display: block !important;

504 width: 100% !important;

505 margin: 0 !important;

506 padding: 0 10px !important;

507 box-sizing: border-box !important;

508 }

509

510 .cat-item-card,

511 .product-col,

512 .catalog-col,

513 .col-xs-12 {

514 width: 100% !important;

515 max-width: 100% !important;

516 display: block !important;

517 float: none !important;

518 margin: 0 0 35px 0 !important;

519 padding: 0 !important;

520 height: auto !important;

521 }

522

523 .cat-item-card-cover-block,

524 .product-col img {

525 margin: 0 auto !important;

526 display: block !important;

527 }

528

529 /* 2. СКРЫВАЕМ СТАРУЮ ПАГИНАЦИЮ */

530 .pagination-wrapper {

531 display: none !important;

532 }

533

534 /* 3. НОВАЯ ТОНКАЯ ЛИНИЯ */

535 #progress-line-container {

536 position: fixed;

537 bottom: 0;

538 left: 0;

539 width: 100%;

540 height: 5px; /* Толщина линии */

541 background: transparent; /* Фон прозрачный */

542 z-index: 99999; /* Поверх всего */

543 display: block !important;

544 pointer-events: none; /* Чтобы сквозь нее можно было кликать */

545 }

546

547 #progress-line-bar {

548 height: 100%;

549 background: #ffda44; /* Ваш желтый брендовый */

550 width: 0%;

551 box-shadow: 0 0 10px rgba(255, 218, 68, 0.7); /* Легкое свечение */

552 transition: width 0.1s linear; /* Плавность */

553 border-top-right-radius: 4px;

554 border-bottom-right-radius: 4px;

555 }

556 }

557

558 /* Скрываем на ПК */

559 #progress-line-container {

560 display: none;

561 }

562 </style>

563<div itemscope="" itemtype="https://schema.org/ItemList">

564<meta itemprop="name" content="Распродажа">

565<meta itemprop="numberOfItems" content="0">

566<div class="content-item"><div class="cat-heading">

<h1 class="h1">Распродажа в Москве</h1><span class="cat-total">

<sup>0</sup></span>

567</div></div>

568<div class="col-md-2">

<filter><filter><link rel="stylesheet" href="/assets/js/ion.rangeSlider/css/ion.rangeSlider.css">

569 <link rel="stylesheet" href="/assets/js/ion.rangeSlider/css/ion.rangeSlider.skinFlat.css">

570 <link rel="stylesheet" href="/assets/css/filters.css">

571 <script src="/assets/js/ion.rangeSlider/js/ion.rangeSlider.min.js"></script>

572 <script src="/assets/js/filters.js"></script>

573 <form class="fltr-form fltr-form-hidden">

574 <div class="sorting-filter">

575

<span class="compact-mode-hide">

576 Сортировка:

577 </span>

578 <div class="btn-group btn-group-toggle btn-group-sorting">

579 <div data-toggle="dropdown" class="btn btn-sm btn-default dropdown-toggle" aria-expanded="true">

580

<span>По популярности</span>

581 <i class="caret"></i>

582 </div>

583 <ul class="dropdown-menu">

584<li>

585

<a href="#" onclick="filterSortBy('По популярности', 'popular', 'asc');return false;">

586 По популярности

587 </a>

588 </li>

589<li>

590

<a href="#" onclick="filterSortBy('Сначала дешевле', 'price', 'asc');return false;">

591 Сначала дешевле

592 </a>

593 </li>

594<li>

595

<a href="#" onclick="filterSortBy('Сначала дороже', 'price', 'desc');return false;">

596 Сначала дороже

597 </a>

598 </li>

599<li>

600

<a href="#" onclick="filterSortBy('Название А — Я', 'model', 'asc');return false;">

601 Название А — Я

602 </a>

603 </li>

604<li>

605

<a href="#" onclick="filterSortBy('Название Я — А', 'model', 'desc');return false;">

606 Название Я — А

607 </a>

608 </li>

609<li>

610

<a href="#" onclick="filterSortBy('Сначала узкие', '187', 'asc');return false;">

611 Сначала узкие

612 </a>

613 </li>

614<li>

615

<a href="#" onclick="filterSortBy('Сначала широкие', '187', 'desc');return false;">

616 Сначала широкие

617 </a>

618 </li>

619<li>

620

<a href="#" onclick="filterSortBy('Сначала низкие', '188', 'asc');return false;">

621 Сначала низкие

622 </a>

623 </li>

624<li>

625

<a href="#" onclick="filterSortBy('Сначала высокие', '188', 'desc');return false;">

626 Сначала высокие

627 </a>

628 </li>

629<li>

630

<a href="#" onclick="filterSortBy('Сначала неглубокие', '189', 'asc');return false;">

631 Сначала неглубокие

632 </a>

633 </li>

634<li>

635

<a href="#" onclick="filterSortBy('Сначала глубокие', '189', 'desc');return false;">

636 Сначала глубокие

637 </a>

638 </li>

639</ul>

640 </div>

641 <input type="hidden" id="f-order" name="order" value="popular">

642 <input type="hidden" id="f-order_pos" name="order_pos" value="asc">

643 </div>

644<span class="compact-mode-hide fltr-title" style="display: inline-block;float: left;margin: 2px 5px 0 0;">

645 Фильтр:

646 </span>

647 <span class="filter-color-selector-wrapper">

648 <div class="btn-group btn-group-toggle filter-color-selector">

649 <button type="button" class="btn btn-sm btn-warning dropdown-toggle" data-toggle="dropdown" style="margin-right: 2px;">

650 <span class="compact-mode-hide">Фильтр по цветам </span>

651 <span class="compact-mode-show">Цвета </span>

652 <span class="caret"></span>

653 </button>

654 <ul class="dropdown-menu colors-dropdown"><li class="filter-color-selector-container"></ul>

655 </div>

656 </span>

657 <input type="hidden" name="f-colors" id="f-colors" value="">

658 <span class="filter-colors-selected"></span>

659

<div class="btn btn-warning btn-sm show-fltr-form-btn" style="margin: 0 1em 1em 0;float: left;">

660 Показать фильтры

661 </div>

662 <div class="fltrs">

663 <div class="row">

664 <div class="col-md-6 col-lg-3 fltr-attr-wr">

665

<div class="filter-name">

666 По цене, р.:

667 </div>

668 <div class="fltr-int-range-wr">

669

<input type="text" value="-to-" id="fprice-range" name="fprice" class="fltr-input fltr-int-range">

670 </div>

671 </div>

672 <script>

673 (function($) {

674 $(function() {

675 FILTER_INITIALIZATORS.push(function(){

676 $("#fprice-range").ionRangeSlider({

677 type: "double",

678 input_values_separator: "-to-",

679 disable: true,

680 min: 0,

681 max: 0,

682 prettify: function (num) {

683 return num;

684 }

685 });

686 });

687 });

688 })(jQuery);

689 </script>

690 <div class="col-md-6 col-lg-3 fltr-attr-wr">

691

<div class="filter-name">

692 Глубина, см:

693 </div>

694 <div class="fltr-int-range-wr">

695

<input type="text" value="0-to-0" id="f189-range" name="f189" class="fltr-input fltr-int-range">

696 </div>

697 </div>

698 <script>

699 (function($) {

700 $(function() {

701 FILTER_INITIALIZATORS.push(function(){

702 $("#f189-range").ionRangeSlider({

703 type: "double",

704 input_values_separator: "-to-",

705 disable: true,

706 min: 0,

707 max: 0,

708 prettify: function (num) {

709 return parseFloat(num / 10);

710 }

711 });

712 });

713 });

714 })(jQuery);

715 </script>

716 <div class="col-md-6 col-lg-3 fltr-attr-wr">

717

<div class="filter-name">

718 Высота, см:

719 </div>

720 <div class="fltr-int-range-wr">

721

<input type="text" value="0-to-0" id="f188-range" name="f188" class="fltr-input fltr-int-range">

722 </div>

723 </div>

724 <script>

725 (function($) {

726 $(function() {

727 FILTER_INITIALIZATORS.push(function(){

728 $("#f188-range").ionRangeSlider({

729 type: "double",

730 input_values_separator: "-to-",

731 disable: true,

732 min: 0,

733 max: 0,

734 prettify: function (num) {

735 return parseFloat(num / 10);

736 }

737 });

738 });

739 });

740 })(jQuery);

741 </script>

742 <div class="col-md-6 col-lg-3 fltr-attr-wr">

743

<div class="filter-name">

744 Ширина, см:

745 </div>

746 <div class="fltr-int-range-wr">

747

<input type="text" value="0-to-0" id="f187-range" name="f187" class="fltr-input fltr-int-range">

748 </div>

749 </div>

750 <script>

751 (function($) {

752 $(function() {

753 FILTER_INITIALIZATORS.push(function(){

754 $("#f187-range").ionRangeSlider({

755 type: "double",

756 input_values_separator: "-to-",

757 disable: true,

758 min: 0,

759 max: 0,

760 prettify: function (num) {

761 return parseFloat(num / 10);

762 }

763 });

764 });

765 });

766 })(jQuery);

767 </script>

768</div>

769<div class="form-group">

770 <button class="btn btn-warning btn-sm submit-filter-btn">Применить фильтры</button>

771

<a class="btn btn-link btn-sm" href="/cat/sale">

772 Сбросить

773 </a>

774

<a class="btn btn-link btn-sm hide-fltr-form-btn">

775 Скрыть фильтры

776 </a>

777 </div>

778</div>

779 </form></filter></filter></div>

780<div class="col-md-8"><div class="note note-info">

781<h2>К сожалению, этих товаров временно нет:(</h2>

782<h3>Заходите почаще, чтобы быть в курсе!</h3>

783</div></div>

784<div class="col-md-2">

785<div class="cat-main-text"></div>

786<div class="cat-main-text"><div class="sale">

<h2>Время покупать мебель сканди!</h2>

<p>Если вы приглядывались к&nbsp;качественной и&nbsp;стильной мебели и&nbsp;мечтали не&nbsp;только сэкономить, но&nbsp;и&nbsp;идеально вписать её в&nbsp;свой интерьер, вы оказались в&nbsp;нужном месте в&nbsp;нужное время!</p>

<p>Смотрите — у&nbsp;нас отличный выбор мебели с&nbsp;хорошей скидкой для людей со&nbsp;вкусом!</p>

<p>Сканди-мебель — строгая, функциональная, удобная, бесшумная, продуманная до&nbsp;мелочей, и&nbsp;эта классика в&nbsp;безупречном стиле окажется в&nbsp;вашем доме в&nbsp;любом из&nbsp;десятков цветов корпусов и&nbsp;фасадов, которые вы легко подберёте на&nbsp;нашем сайте. Не&nbsp;нуждающиеся в&nbsp;отдельном представлении модели ушедшей ИКЕА, корпусная мебель высочайшего качества и&nbsp;проверенная временем, комоды, стеллажи, тумбы — всё это по&nbsp;самым низким ценам.</p>

<p>Мы можем себе позволить порадовать вас, позвольте и&nbsp;вы себе добротную, красивую мебель, которая добавит уюта вашему дому на&nbsp;долгие годы!</p>

<p>Мы делаем мебель с&nbsp;2002&nbsp;года и гордимся тем, что умеем делать мебель лучше других.</p>

<p>Выбирайте, заказывайте, звоните, а&nbsp;мы привезём и&nbsp;соберём у&nbsp;вас дома эту прекрасную мебель.</p></div></div>

787</div>

788</div>

789<script>

790document.addEventListener("DOMContentLoaded", function() {

791 var containerSelector = '.cat-items.row';

792 var itemSelector = '.cat-item-card';

793 var paginationBlockSelector = '.pagination-wrapper';

794

795 var urlParams = new URLSearchParams(window.location.search);

796 var startPage = parseInt(urlParams.get('page'));

797 if (!startPage || startPage < 1) startPage = 1;

798

799 var minLoadedPage = startPage;

800 var maxLoadedPage = startPage;

801 var isLoading = false;

802 var scrollTimeout;

803

804 var paginationCache = {};

805 var currentPagEl = document.querySelector(paginationBlockSelector);

806 if (currentPagEl) {

807 paginationCache[startPage] = currentPagEl.innerHTML;

808 }

809

810 var initialItems = document.querySelectorAll(itemSelector);

811 for (var i = 0; i < initialItems.length; i++) {

812 initialItems[i].setAttribute('data-page', startPage);

813 }

814

815 var h1 = document.querySelector('h1');

816 if (h1) {

817 h1.innerHTML = h1.innerHTML.replace(/([.,-—])?\s*Страница\s*\d+/i, '').trim();

818 }

819

820 var originalTitle = document.title.replace(/ - Страница \d+/i, '').replace(/ - Page \d+/i, '');

821 var metaDescTag = document.querySelector('meta[name="description"]');

822 var originalDesc = "";

823 if (metaDescTag) {

824 originalDesc = metaDescTag.getAttribute('content').replace(/ - Страница \d+/i, '');

825 }

826

827 function updateState() {

828 if (window.scrollY < 100) {

829 setPageActive(minLoadedPage);

830 return;

831 }

832

833 var items = document.querySelectorAll(itemSelector);

834 var viewportHeight = window.innerHeight;

835

836 var pageWeights = {};

837

838 for (var i = 0; i < items.length; i++) {

839 var item = items[i];

840 var rect = item.getBoundingClientRect();

841

842 var visibleTop = Math.max(0, rect.top);

843 var visibleBottom = Math.min(viewportHeight, rect.bottom);

844 var visibleHeight = Math.max(0, visibleBottom - visibleTop);

845

846 if (visibleHeight > 0) {

847 var p = parseInt(item.getAttribute('data-page'));

848 if (p) {

849 if (!pageWeights[p]) pageWeights[p] = 0;

850 pageWeights[p] += visibleHeight;

851 }

852 }

853 }

854

855 var bestPage = -1;

856 var maxWeight = 0;

857 for (var key in pageWeights) {

858 if (pageWeights[key] > maxWeight) {

859 maxWeight = pageWeights[key];

860 bestPage = parseInt(key);

861 }

862 }

863

864 if (bestPage !== -1) {

865 setPageActive(bestPage);

866 }

867 }

868

869 function setPageActive(page) {

870 var currentUrlPage = parseInt(new URLSearchParams(window.location.search).get('page'));

871 if (!currentUrlPage) currentUrlPage = 1;

872

873 if (page !== currentUrlPage) {

874 var newUrl = new URL(window.location);

875 if (page === 1) newUrl.searchParams.delete('page');

876 else newUrl.searchParams.set('page', page);

877 window.history.replaceState(null, null, newUrl);

878

879 var suffix = (page > 1) ? (' - Страница ' + page) : '';

880 document.title = originalTitle + suffix;

881 if (metaDescTag) {

882 metaDescTag.setAttribute('content', originalDesc + suffix);

883 }

884

885 if (paginationCache[page]) {

886 var pagWrapper = document.querySelector(paginationBlockSelector);

887 if (pagWrapper && pagWrapper.innerHTML !== paginationCache[page]) {

888 pagWrapper.innerHTML = paginationCache[page];

889 }

890 }

891

892 var allActive = document.querySelectorAll('.pagination li.active');

893 for(var k=0; k < allActive.length; k++) allActive[k].classList.remove('active');

894

895 var activeLink = document.querySelector('.pagination li.number a[data-pagenumber="' + page + '"]');

896 if (activeLink) activeLink.parentElement.classList.add('active');

897 }

898 }

899

900 function loadNext() {

901 if (isLoading) return;

902

903 var nextPage = maxLoadedPage + 1;

904 var lastPagHtml = paginationCache[maxLoadedPage];

905 if (!lastPagHtml && document.querySelector(paginationBlockSelector)) {

906 lastPagHtml = document.querySelector(paginationBlockSelector).innerHTML;

907 }

908 if (!lastPagHtml) return;

909

910 var tempDiv = document.createElement('div');

911 tempDiv.innerHTML = lastPagHtml;

912

913 var nextLink = tempDiv.querySelector('.pagination li.next:not(.disabled) a');

914 if (!nextLink || nextLink.innerText.trim() === '...') return;

915

916 var nextUrl = nextLink.getAttribute('href');

917 if (!nextUrl || nextUrl === '#') return;

918

919 isLoading = true;

920 var container = document.querySelector(containerSelector);

921

922 var request = new XMLHttpRequest();

923 request.open('GET', nextUrl, true);

924

925 request.onload = function() {

926 if (this.status >= 200 && this.status < 400) {

927 var parser = new DOMParser();

928 var doc = parser.parseFromString(this.response, 'text/html');

929 var newItems = doc.querySelectorAll(containerSelector + ' ' + itemSelector);

930

931 if (newItems.length > 0) {

932 maxLoadedPage++;

933 var newPagEl = doc.querySelector(paginationBlockSelector);

934 if(newPagEl) paginationCache[nextPage] = newPagEl.innerHTML;

935

936 for (var i = 0; i < newItems.length; i++) {

937 var item = newItems[i];

938 item.setAttribute('data-page', nextPage);

939 item.classList.add('newly-added');

940 item.style.animationDelay = (i * 0.05) + 's';

941 container.appendChild(item);

942

943 var lazyImgs = item.querySelectorAll('img[loading="lazy"], img.js-lazy-src');

944 for(var j=0; j < lazyImgs.length; j++) {

945 if(lazyImgs[j].dataset.src) lazyImgs[j].src = lazyImgs[j].dataset.src;

946 }

947 }

948 updateState();

949 }

950 }

951 isLoading = false;

952 };

953 request.onerror = function() { isLoading = false; };

954 request.send();

955 }

956

957 function loadPrev() {

958 if (isLoading) return;

959 if (minLoadedPage <= 1) return;

960

961 var prevPage = minLoadedPage - 1;

962 var firstPagHtml = paginationCache[minLoadedPage];

963 if (!firstPagHtml && document.querySelector(paginationBlockSelector)) {

964 firstPagHtml = document.querySelector(paginationBlockSelector).innerHTML;

965 }

966

967 var tempDiv = document.createElement('div');

968 tempDiv.innerHTML = firstPagHtml;

969 var prevLink = tempDiv.querySelector('.pagination li.previous:not(.disabled) a');

970

971 var prevUrl = "";

972 if (prevLink) prevUrl = prevLink.getAttribute('href');

973 else {

974 var path = window.location.pathname;

975 if (prevPage > 1) prevUrl = path + '?page=' + prevPage;

976 else prevUrl = path;

977 }

978

979 isLoading = true;

980 var container = document.querySelector(containerSelector);

981 var prevH = container.scrollHeight;

982 var prevScroll = window.scrollY;

983

984 var request = new XMLHttpRequest();

985 request.open('GET', prevUrl, true);

986

987 request.onload = function() {

988 if (this.status >= 200 && this.status < 400) {

989 var parser = new DOMParser();

990 var doc = parser.parseFromString(this.response, 'text/html');

991 var newItems = doc.querySelectorAll(containerSelector + ' ' + itemSelector);

992

993 if (newItems.length > 0) {

994 minLoadedPage--;

995 var newPagEl = doc.querySelector(paginationBlockSelector);

996 if(newPagEl) paginationCache[prevPage] = newPagEl.innerHTML;

997

998 for (var i = newItems.length - 1; i >= 0; i--) {

999 var item = newItems[i];

1000 item.setAttribute('data-page', prevPage);

1001 container.insertBefore(item, container.firstChild);

1002

1003 var lazyImgs = item.querySelectorAll('img[loading="lazy"], img.js-lazy-src');

1004 for(var j=0; j < lazyImgs.length; j++) {

1005 if(lazyImgs[j].dataset.src) lazyImgs[j].src = lazyImgs[j].dataset.src;

1006 }

1007 }

1008

1009 var newH = container.scrollHeight;

1010 window.scrollTo(0, prevScroll + (newH - prevH));

1011 updateState();

1012 }

1013 }

1014 isLoading = false;

1015 };

1016 request.onerror = function() { isLoading = false; };

1017 request.send();

1018 }

1019

1020 var tick = false;

1021 window.addEventListener('scroll', function() {

1022 if (!tick) {

1023 window.requestAnimationFrame(function() {

1024 var container = document.querySelector(containerSelector);

1025 if (container) {

1026 var rect = container.getBoundingClientRect();

1027

1028 if (rect.bottom <= window.innerHeight + 2000) loadNext();

1029 if (window.scrollY < 400 && minLoadedPage > 1) loadPrev();

1030

1031 updateState();

1032 }

1033 tick = false;

1034 });

1035 tick = true;

1036 }

1037 });

1038

1039 updateState();

1040});

1041</script><div id="progress-line-container"><div id="progress-line-bar"></div></div>

1042<script type="text/javascript">

1043 var totalItemsGlobal = 0;

1044

1045 document.addEventListener("DOMContentLoaded", function() {

1046 var progressBar = document.getElementById('progress-line-bar');

1047

1048 // Основная функция расчета

1049 function updateScrollProgress() {

1050 if (!progressBar) return;

1051

1052 // 1. Сколько проскроллили на ТЕКУЩЕЙ странице (от 0 до 1)

1053 var winScroll = document.body.scrollTop || document.documentElement.scrollTop;

1054 var height = document.documentElement.scrollHeight - document.documentElement.clientHeight;

1055 var scrolledPercent = 0;

1056

1057 if (height > 0) {

1058 scrolledPercent = winScroll / height;

1059 }

1060

1061 // 2. Сколько товаров загружено относительно общего числа (от 0 до 1)

1062 var items = document.querySelectorAll('.cat-item-card, .product-col');

1063 var loadedCount = items.length;

1064

1065 // Защита от деления на ноль

1066 if (totalItemsGlobal < 1) totalItemsGlobal = 1;

1067

1068 var loadedRatio = loadedCount / totalItemsGlobal;

1069 if (loadedRatio > 1) loadedRatio = 1;

1070

1071 // 3. ИТОГОВАЯ ФОРМУЛА:

1072 // Мы умножаем текущий скролл на долю загруженного.

1073 // Пример: Скролл в самом низу (1.0) * Загружено полкаталога (0.5) = Полоска на 50% экрана.

1074 var finalWidth = (scrolledPercent * loadedRatio) * 100;

1075

1076 // Минимальная видимость (чтобы было видно, что бар есть)

1077 if (finalWidth < 1 && loadedCount > 0) finalWidth = 1;

1078

1079 progressBar.style.width = finalWidth + "%";

1080 }

1081

1082 // Слушаем скролл

1083 window.addEventListener('scroll', updateScrollProgress, {passive: true});

1084 window.addEventListener('resize', updateScrollProgress);

1085

1086 // Слушаем изменения DOM (когда подгрузились новые товары)

1087 var container = document.querySelector('.cat-items.row') || document.querySelector('.catalogue-products');

1088 if (container && window.MutationObserver) {

1089 var observer = new MutationObserver(function() {

1090 // Даем небольшую задержку, чтобы браузер пересчитал высоту страницы

1091 setTimeout(updateScrollProgress, 100);

1092 });

1093 observer.observe(container, { childList: true, subtree: true });

1094 }

1095

1096 // Инициализация

1097 updateScrollProgress();

1098 });

1099 </script>

1100</div></div></div></div></div>

1101<footer class="footer-m"><div class="x_menu_list">

1102<div class="x_menu_col footer-logo-col">

1103<div itemscope="" itemtype="https://schema.org/ImageObject" class="footer-logo-cell">

1104<meta itemprop="url" content="/assets/img/logo-w.png">

1105<a href="https://komodmsk.ru"><img src="/assets/img/logo-w.png" alt="КомодМск" title="КомодМск" width="120" height="17" itemprop="url" loading="lazy" class="footer-logo"></a>

1106</div>

1107<div class="footer-time">10:00 — 20:00</div>

1108<div class="copy" itemscope="" itemtype="https://schema.org/CreativeWork">

1109© <span itemprop="copyrightHolder"> КомодМск</span> <span itemprop="copyrightYear">2002–2026</span>

1110</div>

1111</div>

1112<div class="x_menu_col">

1113<div class="footer-phone">

1114<img src="/assets/img/phone.svg" width="18" height="16" alt="Телефон" loading="lazy"><a href="tel:88002002327" title="Бесплатно по России">8 800 200–23–27</a>

1115</div>

1116<div class="footer-phone">

1117<img src="/assets/img/phone.svg" width="18" height="16" alt="Телефон" loading="lazy"><a href="tel:+74994033617" title="Москва">+7 (499) 403–36–17</a>

1118</div>

1119<div class="footer-phone">

1120<img src="/assets/img/phone.svg" width="18" height="16" alt="Телефон" loading="lazy"><a href="tel:+78122411743" title="Санкт-Петербург">+7 (812) 241–17–43</a>

1121</div>

1122<div class="footer-email">

1123<img src="/assets/img/email.svg" width="18" height="16" alt="Email" loading="lazy"><a href="mailto:">zakaz@komodmsk.ru</a>

1124</div>

1125<div class="footer-phone">

1126<img src="/assets/img/wa.svg" width="18" height="16" alt="WhatsApp" loading="lazy"><a href="https://api.whatsapp.com/send?phone=79915674335" rel="nofollow">Написать в WhatsApp</a>

1127</div>

1128<div class="footer-phone">

1129<img src="/assets/img/tg.svg" width="18" height="16" alt="Telegram" loading="lazy"><a href="https://t.me/+79915674335" rel="nofollow">Написать в Telegram</a>

1130</div>

1131</div>

1132<ul class="x_menu_col" itemscope="" itemtype="https://schema.org/SiteNavigationElement">

1133<li class="x_menu_title" itemprop="name">Каталог</li>

1134<li class="x_menu_item" itemprop="name">

<a href="/cat/sale" rel="nofollow">Распродажа</a></li>

1135<li class="x_menu_item" itemprop="name">

<a href="/cat/kuhny" rel="nofollow">Кухни</a></li>

1136<li class="x_menu_item" itemprop="name">

<a href="/cat/komody" rel="nofollow">Комоды</a></li>

1137<li class="x_menu_item" itemprop="name">

<a href="/cat/tumby" rel="nofollow">Тумбы</a></li>

1138<li class="x_menu_item" itemprop="name">

<a href="/cat/obuvnicy" rel="nofollow">Обувницы</a></li>

1139<li class="x_menu_item" itemprop="name">

<a href="/cat/prihozhie" rel="nofollow">Прихожие</a></li>

1140<li class="x_menu_item" itemprop="name">

<a href="/cat/stoly" rel="nofollow">Столы</a></li>

1141<li class="x_menu_item" itemprop="name">

<a href="/cat/chairs" rel="nofollow">Стулья</a></li>

1142<li class="x_menu_item" itemprop="name">

<a href="/cat/shkafy" rel="nofollow">Шкафы</a></li>

1143<li class="x_menu_item" itemprop="name">

<a href="/cat/stellazhi" rel="nofollow">Стеллажи</a></li>

1144<li class="x_menu_item" itemprop="name">

<a href="/cat/stenki" rel="nofollow">Стенки</a></li>

1145<li class="x_menu_item" itemprop="name">

<a href="/cat/mebel-dlya-spalni" rel="nofollow">Спальни</a></li>

1146</ul>

1147<ul class="x_menu_col" itemscope="" itemtype="https://schema.org/SiteNavigationElement">

1148<li class="x_menu_title" itemprop="name">Информация</li>

1149<li class="x_menu_item" itemprop="name"><a href="/doc/about" itemprop="url">О компании</a></li>

1150<li class="x_menu_item" itemprop="name"><a href="/faq" itemprop="url">Вопросы и ответы</a></li>

1151<li class="x_menu_item" itemprop="name"><a href="/doc/vozvrat-obmen" itemprop="url">Возврат / обмен / гарантия</a></li>

1152<li class="x_menu_item" itemprop="name"><a href="/doc/oplata" itemprop="url">Как оплатить?</a></li>

1153<li class="x_menu_item" itemprop="name"><a href="/doc/dostavka/moskva-i-oblast" itemprop="url">Условия доставки и сборки</a></li>

1154<li class="x_menu_item" itemprop="name"><a href="/doc/contacts" itemprop="url">Контакты</a></li>

1155<li class="x_menu_item" itemprop="name"><a href="/oferta" itemprop="url">Публичная оферта</a></li>

1156</ul>

1157<ul class="x_menu_col" itemscope="" itemtype="https://schema.org/SiteNavigationElement">

1158<li class="x_menu_title" itemprop="name">Полезное</li>

1159<li class="x_menu_item" itemprop="name"><a href="/articles">Статьи</a></li>

1160<li class="x_menu_item" itemprop="name"><a href="/materials">Материалы</a></li>

1161<li class="x_menu_item" itemprop="name"><a href="/textures">Текстуры</a></li>

1162<li class="x_menu_item" itemprop="name"><a href="/series">Серии мебели</a></li>

1163<li class="x_menu_item" itemprop="name"><a href="/lacobel">Стекло Lacobel</a></li>

1164</ul>

1165<div class="x_menu_col"><div class="x-sn">

1166<a href="https://vk.com/komodmsk_ru" target="_blank" rel="nofollow noreferrer noopener"><img src="/assets/img/vk.svg" width="36" height="36" alt="КомодМск Вконтакте" title="КомодМск Вконтакте" loading="lazy" class="sn-img"></a>

<a href="https://ok.ru/komodmsk" target="_blank" rel="nofollow noreferrer noopener"><img src="/assets/img/ok.svg" width="36" height="36" alt="КомодМск в Одноклассниках" title="КомодМск в Одноклассниках" loading="lazy" class="sn-img"></a>

<a href="https://www.youtube.com/@komodmsk" target="_blank" rel="nofollow noreferrer noopener"><img src="/assets/img/yt.svg" width="36" height="36" alt="КомодМск на Ютубе" title="КомодМск на Ютубе" loading="lazy" class="sn-img"></a>

<a href="https://www.instagram.com/komodmsk.ru/" target="_blank" rel="nofollow noreferrer noopener"><img src="/assets/img/insta.svg" width="36" height="36" alt="КомодМск в Инстаграме" title="КомодМск в Инстаграме" loading="lazy" class="sn-img"></a>

<a href="https://dzen.ru/komodmsk.ru" target="_blank" rel="nofollow noreferrer noopener"><img src="/assets/img/zn.svg" width="36" height="36" alt="КомодМск в Дзене" title="КомодМск в Дзене" loading="lazy" class="sn-img"></a>

1167</div></div>

1168</div></footer><div id="helper"></div>

1169<div id="message" style="display: none; text-align: center;"><div id="messageText"></div></div>

1170<div id="after-order" class="after-order" style="display:none;width:300px">

1171<a href="/basket/list" rel="nofollow">

1172 Перейти в корзину

1173 </a><br><a href="#" class="simplemodal-close" rel="nofollow">

1174 Продолжить покупки

1175 </a>

1176</div>

1177<div style="display:none;" class="item-colors-select-modal">

1178<div class="item-colors-select-modal-content">

<center style="font-weight: 500;margin-top: 20px;font-size: 20px;">Товар добавлен в корзину!</center></div>

1179<div class="error"></div>

1180<br><br><div class="modal-close-btn" onclick="Basket.hideActionsForm();return false;"></div>

1181<noindex><div class="f-l-h">

1182<button type="button" onclick="Basket.addAndOpenCart();return false;" class="btn btn-yellow-inline btn-lg">

1183 Оформить заказ

1184 </button><button type="button" onclick="Basket.addAndHideActionsForm();return false;" class="btn btn-grey btn-lg">

1185 Продолжить покупки

1186 </button>

1187</div></noindex>

1188</div>

1189<div id="msgBox" onclick="$(this).hide();">...</div>

1190<div style="display:none;" id="js-popup-container"></div>

1191<div href="#" class="scrollToTop" title="В начало"></div>

1192<div id="note-content"></div>

1193<div class="modal fade out" id="modal-main" tabindex="-1" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"></div></div></div>

1194<script src="/assets/libs/owl.carousel.min.js"></script><script src="/assets/libs/select2.min.js"></script><script>

1195 if (typeof ymaps === 'undefined') {

1196 var ymaps = {

1197 ready: function(callback) {

1198 }

1199 };

1200 }

1201 </script><script src="/assets/build/build.js?28648"></script><script>

1202 (function() {

1203 function init() {

1204 var images = document.getElementsByTagName('img');

1205

1206 function loadVisible() {

1207 for (var i = 0; i < images.length; i++) {

1208 var img = images[i];

1209 var dataSrc = img.getAttribute('data-src');

1210

1211 if (!dataSrc) continue;

1212 var rect = img.getBoundingClientRect();

1213 if (rect.top >= 0 && rect.left >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight)) {

1214 img.src = dataSrc;

1215 img.removeAttribute('data-src');

1216 }

1217 }

1218 }

1219

1220 if (window.addEventListener) {

1221 window.addEventListener('scroll', loadVisible);

1222 window.addEventListener('resize', loadVisible);

1223 window.addEventListener('load', loadVisible);

1224 } else {

1225 window.attachEvent('onscroll', loadVisible);

1226 window.attachEvent('onload', loadVisible);

1227 }

1228

1229 loadVisible();

1230 }

1231 init();

1232 })();

1233 </script><script src="/assets/js/shop.js"></script><script src="/assets/js/cardColors.min.js"></script><script src="/assets/js/modules/basket.js"></script><script src="/assets/build/newkm.js"></script><script>

1234 (function ($) {

1235 var GEO = {

1236 init: function () {

1237 GEO.$modal = window.Modal && new Modal(

1238 '.modal-container',

1239 { small: true }

1240 );

1241

1242 GEO.openCityPopupClickHandler = function (e) {

1243 e.preventDefault();

1244 e.stopPropagation();

1245 requestAnimationFrame(GEO.openCityPopup);

1246 return false;

1247 };

1248

1249 GEO.collectElements();

1250

1251 GEO.$input = null;

1252 GEO.region = "Москва";

1253 GEO.city = "Москва";

1254 GEO.data = {

1255 "utm_param_name": "utm_label",

1256 "phones": {

1257 "default": "+7 (499) 403-36-17",

1258 "region": {

1259 "Санкт-Петербург и Ленинградская область": "+7 (812) 241-17-43",

1260 "Санкт-Петербург": "+7 (812) 241-17-43",

1261 "Ленинградская область": "+7 (499) 403-36-17",

1262 "Москва и Московская область": "+7 (499) 403-36-17",

1263 "Москва": "+7 (499) 403-36-17",

1264 "Московская область": "+7 (499) 403-36-17"

1265 },

1266 "utm": {

1267 "test_test_1": "+7 (495) 777-77-77",

1268 "test_test_2": "+7 (812) 777-77-77"

1269 }

1270 }

1271};

1272 GEO.utm = "";

1273 GEO.needsClientSetup = "yes";

1274 GEO.updateDOM();

1275

1276 if (GEO.data && GEO.region) {

1277 GEO.updateDOM();

1278 }

1279 /** if (GEO.needsClientSetup == 'yes') { */

1280 if (false) {

1281 ymaps.ready(function () {

1282 if (!ymaps.geolocation) {

1283 console.error('Не подключен ymaps.geolocation');

1284 return;

1285 }

1286 GEO.getYandex();

1287 setTimeout(GEO.getAuto.bind(GEO), 2000);

1288 });

1289 }

1290 },

1291

1292 getAuto: function () {

1293 ymaps.geolocation.get({

1294 provider: 'auto',

1295 }).then(function (res) {

1296 return ymaps.geocode(res.geoObjects.get(0).geometry.getCoordinates());

1297 })

1298 .then(function (res) {

1299 var aa = res.geoObjects.get(0).getAdministrativeAreas();

1300 var l = res.geoObjects.get(0).getLocalities();

1301 return {

1302 region: aa && aa[ 0 ] ? aa[ 0 ] : null,

1303 city: l && l[ 0 ] ? l[ 0 ] : false

1304 };

1305 })

1306 .then(function (data) {

1307 var region = data.region;

1308 var city = data.city;

1309 if (city && typeof region != 'undefined') {

1310 if (GEO.region !== region || GEO.city !== city) {

1311 GEO.region = region;

1312 GEO.city = city;

1313 GEO.updateDOM();

1314 var reload = false;

1315 GEO.updateGeo(GEO.region, GEO.city, reload);

1316 }

1317 }

1318 });

1319 },

1320

1321 getYandex: function () {

1322 ymaps.geolocation.get({

1323 provider: 'yandex',

1324 autoReverseGeocode: false

1325 })

1326 .then(function (res) {

1327 return ymaps.geocode(res.geoObjects.get(0).geometry.getCoordinates());

1328 })

1329 .then(function (res) {

1330 var aa = res.geoObjects.get(0).getAdministrativeAreas();

1331 var l = res.geoObjects.get(0).getLocalities();

1332 return {

1333 region: aa && aa[ 0 ] ? aa[ 0 ] : null,

1334 city: l && l[ 0 ] ? l[ 0 ] : false

1335 };

1336 })

1337 .then(function (data) {

1338 var region = data.region;

1339 var city = data.city;

1340 if (city && typeof region != 'undefined') {

1341 GEO.region = region;

1342 GEO.city = city;

1343 GEO.updateDOM();

1344 var reload = false;

1345 GEO.updateGeo(GEO.region, GEO.city, reload);

1346 }

1347 })

1348 .catch(function (err) {

1349 if(err)console.error(err);

1350 });

1351 },

1352

1353 collectElements: function () {

1354 GEO.$el = $('.city-chooser');

1355 GEO.$el.off('click', GEO.openCityPopupClickHandler);

1356 GEO.$el.on('click', GEO.openCityPopupClickHandler);

1357 GEO.$city = $('.city-chooser__city');

1358 GEO.$region = $('.js-region');

1359 GEO.$phone = $('.js-phone');

1360 },

1361

1362 openCityPopup: function () {

1363 $.get('/ajax.handler.php?location', function (data) {

1364 requestAnimationFrame(function () {

1365

1366 $('#modal-main .modal-content').html(data);

1367 $('#modal-main').modal('show');

1368

1369 GEO.$input = $('#cityChooserInput');

1370 GEO.$input.focus();

1371 requestAnimationFrame(function () {

1372 GEO.$input.focus();

1373 });

1374 });

1375 });

1376 },

1377

1378 setCity: function (city) {

1379 GEO.city = city;

1380 GEO.updateCity();

1381 },

1382

1383 saveCity: function (city) {

1384 $.post('/ajax.handler.php', {

1385 action: 'setCity',

1386 city: city

1387 }, function (data) {

1388 if (data == 'success') {

1389 GEO.setCity(city);

1390 GEO.$modal.close();

1391 } else {

1392 alert('Что-то пошло не так. Попробуйте другой город.');

1393 }

1394 });

1395 },

1396

1397 /**

1398 * Обновить DOM согласно текущим данным.

1399 */

1400 updateDOM: function () {

1401 GEO.setPhone(GEO.data, GEO.region, GEO.utm);

1402 GEO.updateCity();

1403 },

1404

1405 /**

1406 * Отобразить город в DOM.

1407 */

1408 updateCity: function () {

1409 GEO.$city.html(GEO.city);// + ' (' + GEO.region + ')');

1410 if (GEO.region) {

1411 GEO.$city.attr('title', GEO.region);

1412 }

1413 },

1414

1415 selectGeo: function (region, city) {

1416 GEO._region = region;

1417 GEO._city = city;

1418 },

1419

1420 updateGeo: function (region, city) {

1421 region = region || GEO._region;

1422 city = city || GEO._city;

1423 if (!city) {

1424 return;

1425 }

1426 $.post('/ajax.handler.php', {

1427 action: 'setGeo',

1428 region: region,

1429 city: city,

1430 }, function (data) {

1431 if (data == 'success') {

1432 GEO.setRegion(region);

1433 GEO.setCity(city);

1434 GEO.updateInfoFromServer();

1435 GEO.closePopup();

1436

1437 var catid = $('.catid').text();

1438 if (catid && catid != 0) {

1439 $.ajax({

1440 url: '/location/index.php',

1441 data: {itemId : catid, quant: Number($('.quant').text())},

1442 success: function(data){

1443 //var deliveryrespons = data != "" ? $.parseJSON(data) : {};

1444 var deliveryrespons = $.parseJSON(data);

1445 if (deliveryrespons.nopek != 'Y') {

1446 $('.topdelivery').empty().append(deliveryrespons.delivery_varchar_nopek);

1447 $('.middelivery').empty().append(deliveryrespons.delivery_text_nopek);

1448 }

1449 }

1450 });

1451 }

1452

1453 } else {

1454 console.error('Что-то пошло не так.');

1455 }

1456 });

1457 },

1458

1459 /**

1460 * Получает с сервера текущую информацию

1461 * по городу, региону и т.д.

1462 *

1463 * Нужно вызывать после установки на клиенте местоположния, т.к.

1464 * сгенерированная на сервере информация не может быть обновлена

1465 * только на клиенте и требует дополнительного запроса.

1466 */

1467 updateInfoFromServer: function (section, data) {

1468 $.post('/ajax.handler.php', {

1469 action: 'getGeoInfo',

1470 section: section || 'main',

1471 data: data || {},

1472 }, function (data) {

1473 });

1474

1475 var url = window.location.href;

1476 $.post(url, {}, function (data) {

1477 $.each([

1478 'deliveryBlock',

1479 'payments',

1480 'ratingSmall',

1481 'services',

1482 ], function (index, type) {

1483 var $container = $('.js-' + type + '-container');

1484 if (data[ type ] && $container.length) {

1485 $container.replaceWith(data[ type ]);

1486 }

1487 });

1488

1489 /**

1490 * После обновления DOM

1491 * надо заново собрать элементы

1492 */

1493 GEO.collectElements();

1494 GEO.updateDOM();

1495 if (window.CheckOnScrollElements) {

1496 /**

1497 * После обновления сразу проверем, есть ли

1498 * зависимые от скролла элементы.

1499 */

1500 CheckOnScrollElements();

1501 }

1502

1503 /**

1504 * Шлем event о необходимости поменять

1505 * состояние все зависимых компонентов.

1506 */

1507 $('body').trigger('geo-changed');

1508 })

1509 },

1510

1511 closePopup: function () {

1512 GEO.$input = null;

1513 $('#modal-main').modal('hide');

1514 },

1515

1516 setPhone: function (data, region, utm) {

1517 var phone = data.phones.default;

1518 if (utm && data.phones && data.phones.utm) {

1519 for (var i in data.phones.utm) {

1520 if (i == utm) {

1521 phone = data.phones.utm[ i ];

1522 GEO.$phone.attr('href', 'tel:' + phone)

1523 .text(phone);

1524 return;

1525 }

1526 }

1527 }

1528 if (region && data.phones && data.phones.region) {

1529 for (var i in data.phones.region) {

1530 var r = i.toLowerCase();

1531 if (r == region.toLowerCase()) {

1532 phone = data.phones.region[ i ];

1533 GEO.$phone.attr('href', 'tel:' + phone)

1534 .text(phone);

1535 return;

1536 }

1537 }

1538 }

1539 GEO.$phone.attr('href', 'tel:' + phone)

1540 .text(phone);

1541 },

1542

1543 setRegion: function (region) {

1544 GEO.region = region;

1545 GEO.$region.text(region);

1546 },

1547

1548 };

1549

1550 window.GEO = GEO;

1551 })(jQuery);

1552

1553 jQuery(function () {

1554 requestAnimationFrame(GEO.init.bind(GEO));

1555 });

1556</script><script>

1557 document.addEventListener("DOMContentLoaded", function() {

1558 let envyboxLoaded = false;

1559

1560 // Функция загрузки (запустится только от действий человека)

1561 function loadEnvybox() {

1562 if (envyboxLoaded) return;

1563 envyboxLoaded = true;

1564

1565 // 1. Грузим стили

1566 var style = document.createElement('link');

1567 style.rel = 'stylesheet';

1568 style.href = "https://cdn.envybox.io/widget/cbk.css";

1569

1570 // 2. Внутренняя функция запуска JS

1571 function runWidgetScript() {

1572 // Ждем 500 мс, чтобы стили успели примениться

1573 setTimeout(function() {

1574 var script = document.createElement('script');

1575 script.src = "https://cdn.envybox.io/widget/cbk.js?wcb_code=d1b2985288776e9024eb86254eae9201";

1576 script.async = true;

1577 document.body.appendChild(script);

1578 }, 500);

1579 }

1580

1581 style.onload = runWidgetScript;

1582 style.onerror = runWidgetScript;

1583 document.head.appendChild(style);

1584

1585 // Убираем слушатели

1586 ['mousemove', 'touchstart', 'scroll', 'click'].forEach(function(e) {

1587 window.removeEventListener(e, loadEnvybox);

1588 });

1589 }

1590

1591 // Загрузка ТОЛЬКО по физическому взаимодействию.

1592 ['mousemove', 'touchstart', 'scroll', 'click'].forEach(function(e) {

1593 window.addEventListener(e, loadEnvybox, { passive: true, once: true });

1594 });

1595 });

1596 </script>

1597</body>

1598</html>