1 2 3<!DOCTYPE html> 4<html lang="sv-SE" class="no-js" data-gui-base="/gui/"> 5<head><title> 6 Benders â Svenska byggprodukter i betong och granit 7</title><meta charset="utf-8" /><meta http-equiv="x-ua-compatible" content="ie=edge" /><meta name="viewport" content="width=device-width,initial-scale=1.0" /><link rel="shortcut icon" href="/gui/i/ico/benders.ico" type="image/ico" /> 8
8<script> 9 document.documentElement.className = document.documentElement.className.replace(/(\s|^)no-js(\s|$)/, '$1js$2'); 10 </script>
10 11 <link rel="stylesheet" href="/gui/css/build/main.min.css?v=7" /> 12 <style type="text/css"> 13 .product-details .sku-details img.iconBox { 14 float: right; 15 width: auto; 16 height: 35px; 17 margin: 0 0 0 5px; 18 display: inline-block; 19 padding: 5px; 20 border:1px solid #ddd; 21 } 22 23 .product-details .sku-details img.iconBox:hover { 24 border:1px solid #58595b; 25 } 26 .smallIconBox { 27 border:1px solid #fff; 28 } 29 30 .smallIconBox:hover { 31 border:1px solid #58595b; 32 } 33 /* Product specifications two-column layout */ 34 .product-specifications { 35 margin: 3px 0; 36 padding: 10px; 37 border: 1px solid #ddd; 38 } 39 40 .product-specifications h2 { 41 margin-bottom: 20px; 42 font-size: 18px; 43 color: #333; 44 font-weight: bold; 45 text-transform: uppercase; 46 } 47 48 .spec-container { 49 display: flex; 50 gap: 30px; 51 52 } 53 54 .spec-image { 55 flex: 0 0 150px; 56 background: #e0e0e0; 57 height: 120px; 58 display: flex; 59 align-items: center; 60 justify-content: center; 61 color: #666; 62 font-size: 12px; 63 text-align: center; 64 border: 1px solid #ccc; 65 } 66 67 .spec-details { 68 flex: 1; 69 } 70 71 .spec-grid { 72 display: grid; 73 grid-template-columns: auto 1fr; 74 gap: 4px 40px; 75 align-items: start; 76 width: 90%; 77 } 78 79 .spec-item { 80 display: contents; 81 } 82 83 .spec-item::after { 84 content: ""; 85 grid-column: 1 / -1; 86 border-bottom: 1px solid #ddd; 87 margin: 1px 0; 88 } 89 90 .spec-label { 91 font-weight: bold; 92 color: #666; 93 font-size: 14px; 94 font-family: Helvetica,Arial,sans-serif; 95 padding: 2px 0 1px 0; 96 } 97 98 .spec-value { 99 font-weight: normal; 100 color: #333; 101 font-size: 14px; 102 font-family: Helvetica,Arial,sans-serif; 103 padding: 2px 0 1px 0; 104 } 105 106 .spec-description { 107 display: contents; 108 } 109 110 .spec-description::after { 111 content: ""; 112 grid-column: 1 / -1; 113 border-bottom: 1px solid #ddd; 114 margin: 1px 0; 115 } 116 117 .spec-description .spec-label { 118 font-weight: bold; 119 color: #666; 120 font-size: 14px; 121 padding: 2px 0 1px 0; 122 } 123 124 .spec-description .spec-value { 125 line-height: 1.6; 126 font-weight: normal; 127 color: #333; 128 font-size: 14px; 129 padding: 2px 0 1px 0; 130 } 131 132 /* Mobile styles for image positioning - simple approach without affecting icons */ 133 @media (max-width: 768px) { 134 .sku-details .image-container { 135 float: none !important; 136 clear: both; 137 margin-bottom: 15px; 138 text-align: center; 139 /* Move to top using negative margin - simple and clean */ 140 margin-top: -10px; 141 position: relative; 142 z-index: 2; 143 padding: 10px 0; 144 } 145 } 146 147 /* Mobile responsive - single column layout */ 148 @media (max-width: 768px) { 149 .product-specifications { 150 padding: 5px; 151 margin: 15px 0; 152 border: 1px solid #ddd; 153 } 154 155 .product-specifications h2 { 156 font-size: 15px; 157 margin-bottom: 15px; 158 text-transform: none; 159 color: #333; 160 } 161 162 .spec-container { 163 flex-direction: column; 164 gap: 0; 165 } 166 167 .spec-image { 168 display: none; 169 } 170 171 .spec-grid { 172 display: block; 173 gap: 0; 174 } 175 176 .spec-item { 177 display: flex; 178 padding: 10px 0; 179 border-bottom: 1px solid #ddd; 180 gap: 15px; 181 align-items: flex-start; 182 } 183 184 .spec-item:last-child { 185 border-bottom: none; 186 } 187 188 .spec-item .spec-label { 189 font-weight: bold; 190 color: #666; 191 font-size: 14px; 192 padding: 0; 193 flex: 0 0 140px; 194 text-align: left; 195 line-height: 1.3; 196 } 197 198 .spec-item .spec-value { 199 word-wrap: break-word; 200 word-break: break-word; 201 text-align: left; 202 flex: 1; 203 min-width: 0; 204 font-weight: normal; 205 color: #333; 206 font-size: 14px; 207 padding: 0; 208 line-height: 1.3; 209 } 210 211 /* CSS class-based approach for server-side detection */ 212 .spec-item.long-text { 213 flex-direction: column; 214 gap: 5px; 215 padding: 12px 0; 216 } 217 218 .spec-item.long-text .spec-label { 219 flex: none; 220 width: 100%; 221 margin-bottom: 5px; 222 } 223 224 .spec-item.long-text .spec-value { 225 text-align: left; 226 width: 112%; 227 flex: none; 228 margin: 0; 229 padding: 0; 230 } 231 232 .spec-item::after { 233 display: none; 234 } 235 } 236 237 /*image Modal*/ 238 .image-container { 239 display: block; 240 float: left; 241 margin-bottom: 20px; 242 max-width: 180px; /* Constrain width to prevent pushing content */ 243 } 244 245 .image-item { 246 display: block; /* Stack vertically instead of inline-block */ 247 margin-bottom: 10px; /* Add space between stacked images */ 248 /*border-radius: 5px;*/ 249 overflow: hidden; 250 cursor: pointer; 251 transition: transform 0.2s ease; 252 position: relative; /* For magnifier overlay */ 253 } 254 255 .image-item:last-child { 256 margin-bottom: 0; /* Remove margin from last image */ 257 } 258 259 .image-item:hover { 260 transform: scale(1.05); 261 } 262 263 .image-item img { 264 display: block; 265 width: 150px!important; 266 height: 170px; 267 object-fit: cover; 268 margin-bottom: 5px!important; 269 } 270 271 /* Magnifier overlay */ 272 /* Custom magnifier icon overlay */ 273 .image-item::after { 274 content: ""; 275 position: absolute; 276 top: 8px; 277 left: 8px;
278 width: 20px; 279 height: 20px; 280 background-image: url('/gui/i/magnifier4.png'); 281 background-size: contain; 282 background-repeat: no-repeat; 283 background-position: center; 284 opacity: 0.8; 285 transition: opacity 0.3s ease; 286 pointer-events: none; 287 } 288 289 .image-item::before { 290 display: none; /* Remove the separate handle element */ 291 } 292 293 .image-item:hover::after { 294 opacity: 1; /* Keep same opacity on hover */ 295 } 296 297 /* Modal styles */ 298 .modal { 299 display: none; 300 position: fixed; 301 top: 0; 302 left: 0; 303 width: 100%; 304 height: 100%; 305 background-color: rgba(0, 0, 0, 0.9); 306 z-index: 1000; 307 } 308 309 .modal-content { 310 position: relative; 311 width: 100%; 312 height: 100%; 313 display: flex; 314 justify-content: center; 315 align-items: center; 316 overflow: hidden; 317 } 318 319 .modal img { 320 max-width: 90vw; 321 max-height: 90vh; 322 border-radius: 5px; 323 transition: transform 0.3s ease; 324 cursor: zoom-in; 325 transform-origin: center; 326 } 327 328 .modal img.zoomed { 329 cursor: zoom-out; 330 } 331 332 .nav-arrow { 333 position: absolute; 334 top: 50%; 335 transform: translateY(-50%); 336 font-size: 3rem; 337 color: white; 338 cursor: pointer; 339 user-select: none; 340 background: rgba(0, 0, 0, 0.5); 341 padding: 10px 15px; 342 border-radius: 5px; 343 transition: background 0.3s ease; 344 } 345 346 .nav-arrow:hover { 347 background: rgba(0, 0, 0, 0.8); 348 } 349 350 .nav-arrow.prev { 351 left: 20px; 352 } 353 354 .nav-arrow.next { 355 right: 20px; 356 } 357 358 .close-btn { 359 position: absolute; 360 top: 20px; 361 right: 20px; 362 font-size: 2.5rem; 363 color: white; 364 cursor: pointer; 365 user-select: none; 366 background: rgba(0, 0, 0, 0.5); 367 padding: 5px 12px; 368 border-radius: 5px; 369 transition: background 0.3s ease; 370 } 371 372 .close-btn:hover { 373 background: rgba(0, 0, 0, 0.8); 374 } 375 376 .zoom-controls { 377 position: absolute; 378 bottom: 30px; 379 left: 50%; 380 transform: translateX(-50%); 381 display: flex; 382 gap: 10px; 383 background: rgba(0, 0, 0, 0.7); 384 padding: 10px; 385 border-radius: 25px; 386 } 387 388 .zoom-btn { 389 background: rgba(255, 255, 255, 0.2); 390 border: 1px solid rgba(255, 255, 255, 0.3); 391 color: white; 392 padding: 8px 16px; 393 border-radius: 20px; 394 cursor: pointer; 395 font-size: 0.9rem; 396 user-select: none; 397 transition: all 0.3s ease; 398 min-width: 60px; 399 } 400 401 .zoom-btn:hover { 402 background: rgba(255, 255, 255, 0.4); 403 transform: translateY(-2px); 404 } 405 406 .zoom-info { 407 position: absolute; 408 top: 20px; 409 left: 20px; 410 color: white; 411 background: rgba(0, 0, 0, 0.5); 412 padding: 8px 12px; 413 border-radius: 5px; 414 font-size: 0.9rem; 415 } 416 417 </style> 418 <!--[if lt IE 9]> 419 <link rel="stylesheet" href="/gui/css/ie.css" /> 420
420<script type="text/javascript" src="/gui/js/vendor/respond.min.js"></script>
420 421 <![endif]--> 422 <!--[if IE 9]> 423 <link rel="stylesheet" href="/gui/css/ie9.css" /> 424 <![endif]--> 425
425<script src="//use.typekit.net/qcc0noq.js"></script>
425 426
426<script>try { Typekit.load(); } catch (e) { }</script>
426 427 428 429<!-- Consent mode v2 default script -->
430<script data-cookieconsent="ignore"> 431 window.dataLayer = window.dataLayer || []; 432 function gtag() { 433 dataLayer.push(arguments); 434 } 435 gtag('consent', 'default', { 436 'ad_personalization': 'denied', 437 'ad_storage': 'denied', 438 'ad_user_data': 'denied', 439 'analytics_storage': 'denied', 440 'functionality_storage': 'denied', 441 'personalization_storage': 'denied', 442 'security_storage': 'granted', 443 'wait_for_update': 500, 444 }); 445 gtag("set", "ads_data_redaction", true); 446 gtag("set", "url_passthrough", false); 447</script>
447 448<!-- Usercentrics script -->
449<script id="usercentrics-cmp" src="https://web.cmp.usercentrics.eu/ui/loader.js" data-draft="true" data-settings-id="b0fh8r7XPLiup6" async=""></script>
449 450<!-- Google Tag Manager -->
451<script>
vendor: 327 bytes, lines 451-455
451(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 452new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 453j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 454'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 455})(window,document,'script','dataLayer','
455GTM-WC23RQ4
vendor: 3 bytes, line 455
455');
455</script>
455 456<!-- End Google Tag Manager --><meta name="description" content="Benders är idag en av de ledande nordiska leverantörerna av produkter i natursten, betong och lertegel. Vi har ett brett utbud och erbjuder produkter inom sortimenten Tak, Mark, Natursten, Infrastruktur, Grund och Vägg." /></head> 457<body class=""> 458 <div id="body" data-lang="SE"> 459 460 461 <div id="header" role="banner"> 462 <div class="container"> 463 <div id="skip"> 464 <a href="#content-primary">Hoppa till innehÃ¥ll</a> 465 </div> 466 <div id="logo"> 467 <a href="/" title="Ga till webbplatsens startsida"> 468 <img src="/gui/i/logo.png" alt="Benders" /> 469 </a> 470 </div> 471 472 <div class="nav-supp"> 473 <h2 class="structural">Hjälplänkar:</h2> 474 <ul> 475 476 <li class="markets" data-has-children="true"> 477 <a href="#">Country (Sverige)</a> 478 <ul> 479 480 <li class="two"><img src="/gui/i/flags/se.png" alt="Default (Sweden North-East)" /><ul><li><a href="https://www.benders.se/en-gb/?market=DEFAULT">English </a></li><li><a href="https://www.benders.se/?market=DEFAULT">Svenska </a></li></ul></li> 481 482 <li><img src="/gui/i/flags/de.png" alt="Germany" /><a href="https://www.benders.se/de-de/?market=WDEGE">Deutsch </a></li> 483 484 <li><img src="/gui/i/flags/ee.png" alt="Estonia" /><a href="https://www.benders.se/et-ee/?market=WEEGE">Eesti </a></li> 485 486 <li><img src="/gui/i/flags/fi.png" alt="Finland" /><a href="https://www.benders.se/fi-fi/?market=WFIGE">Suomi </a></li> 487 488 <li><img src="/gui/i/flags/lt.png" alt="Lithuanian" /><a href="https://www.benders.se/lt-lt/?market=WLIGE">Lietuvių </a></li> 489 490 <li><img src="/gui/i/flags/no.png" alt="Norway Kongsvinger" /><a href="https://www.benders.se/nb-no/?market=WNOKV">Norsk, bokmÃ¥l </a></li> 491 492 493 494 <li> 495 496 <img src="/gui/i/flags/lv.png" alt="Latvijas" /> 497 498 <a href="/lv-lv/" target="_self">Latvijas</a> 499 </li> 500 501 <li> 502 503 <img src="/gui/i/flags/cs.png" alt="ÄeÅ¡tina" /> 504 505 <a href="http://www.ldevelop.cz/" target="_blank">ÄeÅ¡tina</a> 506 </li> 507 508 <li> 509 510 <img src="/gui/i/flags/da.png" alt="Dansk" /> 511 512 <a href="http://www.bmc-danmark.com/" target="_blank">Dansk</a> 513 </li> 514 515 <li> 516 517 <img src="/gui/i/flags/gr.png" alt="ελληνικά" /> 518 519 <a href="http://www.tziotzios.gr/" target="_blank">ελληνικά</a> 520 </li> 521 522 <li> 523 524 <img src="/gui/i/flags/pl.png" alt="Polski" /> 525 526 <a href="http://bauart.pl/benders-polska" target="_blank">Polski</a> 527 </li> 528 529 <li> 530 531 <img src="/gui/i/flags/nl.png" alt="Nederland" /> 532 533 <a href="https://www.atlanticadvies.nl/dak/" target="_blank">Nederland</a> 534 </li> 535 536 <li> 537 538 <img src="/gui/i/flags/be.png" alt="België" /> 539 540 <a href="http://betondakpannen.be/" target="_blank">België</a> 541 </li> 542 543 544 </ul> 545 </li> 546 547 <ul><li><a href="/sok-aterforsaljare/">Sök återförsäljare</a></li><li><a target="_blank" href="https://portal.benders.se/login">Kundportal</a></li><li><a href="https://bendersbyggkraft.se/">Benders Byggkraft</a></li></ul> 548 549 550 </ul> 551 552 553 554 555 <h2 class="structural">Verktyg</h2> 556 <ul class="tools"> 557 558 <li><a class="search" href="/sok/">Sök</a></li> 559 560 561 </ul> 562 </div> 563 564 <div class="nav-main cf" role="navigation"> 565 566 <ul> 567 568 <li data-has-children="true"><a href="/sortiment/"><span>Sortiment</span></a> 569 570 <ul> 571 572 <li> 573 <a href="/sortiment/tak/"> 574 <img src="/filtered/2408/rszww340h300-60/meny-sortiment-tak170x150-57556447-rszww340h300-60.jpg" height="150" width="170" alt="Ett vitt hus med Benders takpannor pÃ¥." /> 575 <div> 576 <strong>Tak</strong> 577 <span>Takpannor i betong och lera för snygga och funktionella tak</span> 578 </div> 579 </a> 580 </li> 581 582 <li> 583 <a href="/sortiment/mark/"> 584 <img src="/filtered/2407/rszww340h300-60/meny-sortiment-mark170x150-1103800415-rszww340h300-60.jpg" height="150" width="170" alt="TrädgÃ¥rd med murar, trappa, trädgÃ¥rdsgÃ¥ng och dekormaterial." /> 585 <div> 586 <strong>Mark</strong> 587 <span>Marknadens bredaste utbud av produkter för din utemiljö</span> 588 </div> 589 </a> 590 </li> 591 592 <li> 593 <a href="/sortiment/natursten/"> 594 <img src="/filtered/2406/rszww340h300-60/meny-sortiment-natursten170x150-1668843359-rszww340h300-60.jpg" height="150" width="170" alt="Rubbelmur i Bohusgranit." /> 595 <div> 596 <strong>Natursten</strong> 597 <span>Exklusiva granit- och skifferprodukter med naturlig och rustik känsla</span> 598 </div> 599 </a> 600 </li> 601 602 <li> 603 <a href="/sortiment/infrastruktur/"> 604 <img src="/filtered/2411/rszww340h300-60/meny-sortiment-infrastruktur170x150--2017998497-rszww340h300-60.jpg" height="150" width="170" alt="Bender Spikma Mittstöd avgränsar trafikmiljö." /> 605 <div> 606 <strong>Infrastruktur</strong> 607 <span>Produkter för bl.a. väg- och järnvägsmiljöer</span> 608 </div> 609 </a> 610 </li> 611 612 <li> 613 <a href="/sortiment/va-system/"> 614 <img src="/filtered/23922/rszww340h300-60/meny-sortiment-va170x150--1262476833-rszww340h300-60.jpg" height="150" width="170" alt="Bender Betongrör staplade pÃ¥ en lagergÃ¥rd." /> 615 <div> 616 <strong>VA-System</strong> 617 <span>Beständiga lösningar och produkter för vatten- och avloppssystem</span> 618 </div> 619 </a> 620 </li> 621 622 <li> 623 <a href="/sortiment/grund/"> 624 <img src="/filtered/2409/rszww340h300-60/meny-sortiment-grund170x150--341119777-rszww340h300-60.jpg" height="150" width="170" alt="Ett hörn pÃ¥ Bender Sockelelement vid husbyggnation." /> 625 <div> 626 <strong>Grund</strong> 627 <span>Marknadsledande inom grund med kompletta grundpaket, egentillverkade sockelelement, Albabalk, cellplast och Modulgrund</span> 628 </div> 629 </a> 630 </li> 631 632 <li> 633 <a href="/sortiment/murblock/"> 634 <img src="/filtered/31063/rszww340h300-60/meny-sortiment-murblock-170x150-993136480-rszww340h300-60.jpg" height="150" width="170" alt="Vitt hus byggt med murblock och med Benders svarta takpannor pÃ¥ taket." /> 635 <div> 636 <strong>Murblock</strong> 637 <span>Klassiska och ergonomiska murblock för murning av bl.a. grunder och väggar</span> 638 </div> 639 </a> 640 </li> 641 642 <li> 643 <a href="/sortiment/dorr/"> 644 <img src="/filtered/37034/rszww340h300-60/meny-sortiment-dorr-170x150--755506152-rszww340h300-60.jpg" height="150" width="170" /> 645 <div> 646 <strong>Dörr</strong> 647 <span>Brett utbud av stÃ¥ldörrar</span> 648 </div> 649 </a> 650 </li> 651 652 </ul> 653 654 </li> 655 656 <li><a href="/inspiration/"><span>Inspiration</span></a> 657 658 </li> 659 660 <li><a href="/arkitekt/"><span>
660Arkitekt</span></a> 661 662 </li> 663 664 <li><a href="/om-oss/"><span>Om oss</span></a> 665 666 </li> 667 668 <li><a href="/support/kontakt/"><span>Support</span></a> 669 670 </li> 671 672 <li><a href="/hallbarhet/"><span>Hållbarhet</span></a> 673 674 </li> 675 676 </ul> 677 678 </div> 679 </div> 680 </div> 681 682 683 <form role="search" method="get" action="/sok/" id="search"> 684 <div class="container"> 685 <label for="searchtext" class="structural"></label> 686 <input type="search" id="searchtext" name="q" placeholder="Ange sökord" /> 687 <button type="submit"> 688 <img src="/gui/i/icon-search.png" width="24" height="24" alt="Sök" /> 689 </button> 690 </div> 691 </form> 692 693 694 <div id="main" class=""> 695 696 697 698 699 <div class="section full"> 700 <div class="hero flexslider"> 701 <ul class="slides"><li class="slide"> 702 703<div class="s-i "> 704 705 <img src="/filtered/37549/rszww3200h920-60/header-dorr-nytt-sortiment-1600x460--1943244006-rszww3200h920-60.jpg" height="460" width="1600" data-id="37549" loading="lazy" /> 706 707 708</div> 709 710<div class="s-w"> 711 <div class="s-c "> 712 <div class="s-b"> 713 714 <h2>Välkommen vÃ¥rt Ã¥ttonde sortiment - Dörr</h2> 715 716 717 718 <a href="/sortiment/dorr/" class="button">Se sortimentet här. </a> 719 720 </div> 721 </div> 722</div> 723</li><li class="slide"> 724 725<div class="s-i "> 726 727 <img src="/filtered/36829/rszww3200h920-60/bildspel-evozero-folder-1600x460-1767671003-rszww3200h920-60.jpg" height="460" width="1600" data-id="36829" loading="lazy" alt="Fyra stycken silos vid Benders fabrik i Uddevalla." /> 728 729 730</div> 731 732<div class="s-w"> 733 <div class="s-c "> 734 <div class="s-b"> 735 736 <h2>HÃ¥llbara produkter med EvoZero</h2> 737 738 739 740 <a href="https://issuu.com/benders/docs/se-evozero-folder-2025-7-hu?fr=xKAE9_zMzMw" class="button">Läs mer om EvoZero i vår folder!</a> 741 742 </div> 743 </div> 744</div> 745</li><li class="slide"> 746 747<div class="s-i "> 748 749 <img src="/filtered/34282/rszww3200h920-60/header-newlinesittbank-1600x460-1545629019-rszww3200h920-60.jpg" height="460" width="1600" data-id="34282" loading="lazy" alt="Stilren sittbänk i betong och trä i offentlig miljö." /> 750 751 752</div> 753 754<div class="s-w"> 755 <div class="s-c "> 756 <div class="s-b"> 757 <p class="tagline">Skapar stilren & säker miljö</p> 758 <h2>Nord sittbänk</h2> 759 760 761 762 <a href="/sortiment/infrastruktur/barriarer/betongmobler/" class="button">Till betongmöbler</a> 763 764 </div> 765 </div> 766</div> 767</li><li class="slide"> 768 769<div class="s-i "> 770 771 <img src="/filtered/32682/rszww3200h920-60/691a8243red1600x460-1043995994-rszww3200h920-60.jpg" height="460" width="1600" data-id="32682" loading="lazy" alt="Sicuras trafiksäkra planteringslÃ¥dor med vÃ¥rblommor, i stadsmiljö." /> 772 773 774</div> 775 776<div class="s-w"> 777 <div class="s-c "> 778 <div class="s-b"> 779 780 <h2>Sicura â Benders trafiksäkra möbelserie</h2> 781 782 783 784 <a href="/om-oss/artikelarkiv/2024/sicura-mobelserie/" class="button">Läs mer</a> 785 786 </div> 787 </div> 788</div> 789</li></ul> 790 </div> 791 </div> 792 793 794 <div class="section" id="content-primary"> 795 <div class="container"> 796 <div class="row tile-row"><div class="col col-6"> 797 798 799<div class="m m-tile m-2x1"> 800 <div class="m-w "> 801 802 <div class="m-i"> 803 <img src="/filtered/38422/rszw-60/puff-takpannefabrik-i-edsvara-610x348-1177174134-rszw-60.jpg" data-id="38422" loading="lazy" /> 804 </div> 805 806 807 <div class="m-c"> 808 809 <a class="m-b" href="/om-oss/nyheter/2026/benders-bygger-europas-modernaste-takpannefabrik/"> 810 811 <h2>Benders tar första spadtaget â bygger Europas modernaste takp
811annefabrik</h2> 812 813 </a> 814 815 </div> 816 817 </div> 818</div> 819 820</div><div class="col-3 grid-size"></div><div class="col col-6"> 821 822 823<div class="m m-tile m-2x1"> 824 <div class="m-w "> 825 826 <div class="m-i"> 827 <img src="/filtered/38954/rszw-60/puff-bendersforvarvartimrabetong-610x348-1620672083-rszw-60.jpg" data-id="38954" loading="lazy" /> 828 </div> 829 830 831 <div class="m-c"> 832 833 <a class="m-b" href="/om-oss/nyheter/2026/benders-forvarvar-timra-betong/"> 834 835 <h2>Benders Sverige AB förvärvar Timrå Betong</h2> 836 837 </a> 838 839 </div> 840 841 </div> 842</div> 843 844</div><div class="col-3 grid-size"></div><div class="col col-6"> 845 846 847<div class="m m-tile m-tile--bg-video m-2x1"> 848 <div class="m-w "> 849 850 <div class="m-i"> 851 <img src="/filtered/34469/rszw-60/puff-naturstensfilm-hallbara-610x348-1205292765-rszw-60.jpg" data-id="34469" loading="lazy" alt="Illustration över att Benders Bohusgranit både bryts, produceras, förädlas och transporteras inom Sverige." /> 852 </div> 853 854 855 <div class="m-c"> 856 857 <a class="m-b" href="https://www.youtube.com/watch?v=NZPLtRgpWWs"> 858 <p class="tagline">Se vår naturstensfilm!</p> 859 <h2>En helsvensk natursten helt enkelt</h2> 860 861 </a> 862 863 </div> 864 865 </div> 866</div> 867 868</div><div class="col-3 grid-size"></div><div class="col col-3"> 869 870 871<div class="m m-tile m-1x1"> 872 <div class="m-w "> 873 874 <div class="m-i"> 875 <img src="/filtered/36647/rszw-60/artikel-smart-stadsutveckling-puff-290x348--1760389668-rszw-60.jpg" data-id="36647" loading="lazy" alt="Flera cyklar står parkerade på Benders dränerande marksten Bender Bas Drain fasad." /> 876 </div> 877 878 879 <div class="m-c"> 880 881 <a class="m-b" href="/om-oss/artikelarkiv/2025/smart-stadsutveckling-for-trygghet-och-miljo/"> 882 883 <h2>Smart stadsutveckling för trygghet och miljö</h2> 884 885 </a> 886 887 </div> 888 889 </div> 890</div> 891 892</div><div class="col-3 grid-size"></div><div class="col col-3"> 893 894 895<div class="m m-tile m-1x1"> 896 <div class="m-w "> 897 898 <div class="m-i"> 899 <img src="/filtered/571/rszw-60/mark-offentlig-miljo290x348-2--1746191138-rszw-60.jpg" data-id="571" loading="lazy" alt="Benders marksten Bender Labyrint Antik leder fram till slänggungorna på Skara Sommarland." /> 900 </div> 901 902 903 <div class="m-c"> 904 905 <a class="m-b" href="/sortiment/offentliga-miljoer/"> 906 907 <h2>Offentliga miljöer</h2> 908 <div> 909 <p>Idag är Benders en komplett helhetsleverantör för såväl offentliga som privata miljöer</p> 910 </div> 911 </a> 912 913 </div> 914 915 </div> 916</div> 917 918</div><div class="col-3 grid-size"></div><div class="col col-6"> 919 920 921<div class="m m-tile m-2x1"> 922 <div class="m-w "> 923 924 <div class="m-i"> 925 <img src="/filtered/34333/rszw-60/puff-film-busshallplatsstod-star-610x348--1856714147-rszw-60.jpg" data-id="34333" loading="lazy" alt="En busshållplats med Bender Busshållplatsstöd Star." /> 926 </div> 927 928 929 <div class="m-c"> 930 931 <a class="m-b" href="https://www.youtube.com/watch?v=Re3eCDiQs2w"> 932 <p class="tagline">INFORMATIONSFILM</p> 933 934 <div> 935 <h2>Bättre Buss i Bålsta med<br />Busshållplatsstöd Star</h2> 936 </div> 937 </a> 938 939 </div> 940 941 </div> 942</div> 943 944</div><div class="col-3 grid-size"></div><div class="col col-6"> 945 946 947<div class="m m-tile m-2x1"> 948 <div class="m-w c1"> 949 950 <div class="m-c"> 951 952 <a class="m-b" href="/support/berakningsprogram/"> 953 954 <h2>Beräkningsprogram</h2> 955 <div> 956 <p>Våra olika beräkningsprogram hjälper dig t.ex. med att beräkna antalet pannor till ditt tak eller murstenar till din mur. </p> 957 </div> 958 </a> 959 960 </div> 961 962 </div> 963</div> 964 965</div><div class="col-3 grid-size"></div></div> 966 </div> 967 </div> 968 969
970 <div class="section alt"> 971 <div class="container"> 972 <div class="section-intro"> 973 <h2>Vårt sortiment</h2> 974 </div> 975 <div class="row promo-container"><div class="col col-4"> 976 977 978<div class="m m-promo"> 979 <a href="/sortiment/tak/" class="m-h"> 980 <img src="/filtered/2408/rszww340h300-60/meny-sortiment-tak170x150-57556447-rszww340h300-60.jpg" height="150" width="170" data-id="2408" loading="lazy" alt="Ett vitt hus med Benders takpannor på." /> 981 <h3>Tak</h3> 982 </a> 983 984 <div class="m-c"> 985 <p>Takpannor i betong och lera för snygga och funktionella tak</p> 986 </div> 987 988</div> 989</div><div class="col col-4"> 990 991 992<div class="m m-promo"> 993 <a href="/sortiment/mark/" class="m-h"> 994 <img src="/filtered/2407/rszww340h300-60/meny-sortiment-mark170x150-1103800415-rszww340h300-60.jpg" height="150" width="170" data-id="2407" loading="lazy" alt="Trädgård med murar, trappa, trädgårdsgång och dekormaterial." /> 995 <h3>Mark</h3> 996 </a> 997 998 <div class="m-c"> 999 <p>Marknadens bredaste utbud av produkter för din utemiljö</p> 1000 </div> 1001 1002</div> 1003</div><div class="col col-4"> 1004 1005 1006<div class="m m-promo"> 1007 <a href="/sortiment/natursten/" class="m-h"> 1008 <img src="/filtered/2406/rszww340h300-60/meny-sortiment-natursten170x150-1668843359-rszww340h300-60.jpg" height="150" width="170" data-id="2406" loading="lazy" alt="Rubbelmur i Bohusgranit." /> 1009 <h3>Natursten</h3> 1010 </a> 1011 1012 <div class="m-c"> 1013 <p>Exklusiva granit- och skifferprodukter med naturlig och rustik känsla</p> 1014 </div> 1015 1016</div> 1017</div><div class="col col-4"> 1018 1019 1020<div class="m m-promo"> 1021 <a href="/sortiment/infrastruktur/" class="m-h"> 1022 <img src="/filtered/2411/rszww340h300-60/meny-sortiment-infrastruktur170x150--2017998497-rszww340h300-60.jpg" height="150" width="170" data-id="2411" loading="lazy" alt="Bender Spikma Mittstöd avgränsar trafikmiljö." /> 1023 <h3>Infrastruktur</h3> 1024 </a> 1025 1026 <div class="m-c"> 1027 <p>Produkter för bl.a. väg- och järnvägsmiljöer</p> 1028 </div> 1029 1030</div> 1031</div><div class="col col-4"> 1032 1033 1034<div class="m m-promo"> 1035 <a href="/sortiment/va-system/" class="m-h"> 1036 <img src="/filtered/23922/rszww340h300-60/meny-sortiment-va170x150--1262476833-rszww340h300-60.jpg" height="150" width="170" data-id="23922" loading="lazy" alt="Bender Betongrör staplade på en lagergård." /> 1037 <h3>VA-System</h3> 1038 </a> 1039 1040 <div class="m-c"> 1041 <p>Beständiga lösningar och produkter för vatten- och avloppssystem</p> 1042 </div> 1043 1044</div> 1045</div><div class="col col-4"> 1046 1047 1048<div class="m m-promo"> 1049 <a href="/sortiment/grund/" class="m-h"> 1050 <img src="/filtered/2409/rszww340h300-60/meny-sortiment-grund170x150--341119777-rszww340h300-60.jpg" height="150" width="170" data-id="2409" loading="lazy" alt="Ett hörn på Bender Sockelelement vid husbyggnation." /> 1051 <h3>Grund</h3> 1052 </a> 1053 1054 <div class="m-c"> 1055 <p>Marknadsledande inom grund med kompletta grundpaket, egentillverkade sockelelement, Albabalk, cellplast och Modulgrund</p> 1056 </div> 1057 1058</div> 1059</div><div class="col col-4"> 1060 1061 1062<div class="m m-promo"> 1063 <a href="/sortiment/murblock/" class="m-h"> 1064 <img src="/filtered/31063/rszww340h300-60/meny-sortiment-murblock-170x150-993136480-rszww340h300-60.jpg" height="150" width="170" data-id="31063" loading="lazy" alt="Vitt hus byggt med murblock och med Benders svarta takpannor på taket." /> 1065 <h3>Murblock</h3> 1066 </a> 1067 1068 <div class="m-c"> 1069 <p>Klassiska och ergonomiska murblock för murning av bl.a. grunder och väggar</p> 1070 </div> 1071 1072</div> 1073</div><div class="col col-4"> 1074 1075 1076<div class="m m-promo"> 1077 <a href="/sortiment/dorr/" class="m-h"> 1078 <img src="/filtered/37034/rszww340h300-60/meny-sortiment-dorr-170x150--755506152-rszww340h300-60.jpg" height="150" width="170" data-id="37034" loading="lazy" /> 1079 <h3>Dörr</h3> 1080 </a> 1081 1082 <div class="m-c"> 1083 <p>Brett utbud av ståldörrar</p> 1084 </div> 1085 1086</div> 1087</div></div> 1088 <div class="button-bar"> 1089 1090<a class="button" href="/sortiment/"><span>Visa sortiment</span></a> 1091</div> 1092 </div> 1093 </div> 1094 1095 1096 <div class="section full"><div class="m m-feature right cf"> 1097 1098 1099<div class="m-i"> 1100 <img src="/filtered/538/rszww1484h838-60/natursten-kampanj768x425-348751078-rszww1484h838-60.jpg" height="419" width="742" data-id="538" loading="lazy" alt="Flera hus på bergsklippor vid havet." /> 1101</div> 1102 1103<div class="container"> 1104 <div class="m-c c4">
1105 <h2>Granit - ett material med eviga värden</h2> 1106 1107 <div> 1108 <p>Granit är Sveriges vanligaste bergart och Ã¥terfinns i hela landet. Bergarten är extremt stark och tÃ¥l sÃ¥väl slag som värme betydligt bättre än de flesta andra stensorter och material. Dess utseende och egenskaper växlar med skiftande kornstorlek och färg beroende pÃ¥ var i världen den bryts. </p> 1109 </div> 1110 1111 1112 <a href="/om-oss/artikelarkiv/2016/granit-ett-material-med-eviga-varden/" class="button">Läs mer</a> 1113 1114 </div> 1115</div> 1116</div></div> 1117 1118 1119 <div class="section full"> 1120 <div class="m m-stub"> 1121 <div Class="m-i"> 1122 <img src="/filtered/2655/rszww2560h880-60/benders-fabrik-edsvara1600x396-509894502-rszww2560h880-60.jpg" height="440" width="1280" data-id="2655" loading="lazy" alt="Benders fabrik och huvudkontor i Edsvära. Fabriken ligger bredvid damm och grönomrÃ¥de. " /> 1123 <span class="quality-stamp">Guaranteed Benders Quality Since 1960</span> 1124 </div> 1125 <div class="m-c container"> 1126 <h2><span data-mce-mark="1">Välkommen till Benders</span></h2> 1127<p><span>Allt sedan starten Ã¥r 1960 har vÃ¥r ambition varit att tillfredsställa vÃ¥ra kunders behov. VÃ¥rt företagande präglas av ett lokalt affärsmannaskap, som tillsammans med lyhördhet är en grund för lÃ¥nga och starka relationer med bÃ¥de kunder, leverantörer och inte minst personal. En positiv utveckling </span><span>sedan dess </span><span>har bidragit till att Benders idag arbetar inom f</span><span>lera</span><span> skilda affärsomrÃ¥den och är en av de marknadsledande producenterna av betong- och naturstensprodukter i Norden. Samtidigt blir andelarna pÃ¥ de nya marknaderna ute i Europa större och större och vÃ¥ra sortiment inom byggprodukter och byggsystem växer för varje säsong.</span></p> 1128</div> 1129 </div> 1130 </div> 1131 1132 1133 1134 <div class="section features alt"> 1135 <div class="row start-promo-row"> 1136 <div class="container"><div class="col col-4"> 1137 1138 1139<div class="m m-promo"> 1140 1141<a href="/takgaranti/" class="m-h"> 1142 <img src="/gui/i/icon-30.svg" alt="" /> 1143 1144 <h3>Trettio Ã¥r takgaranti</h3> 1145</a> 1146 1147 <div class="m-c"> 1148 <div> 1149 <p>Vi lämnar 30 Ã¥rs garanti pÃ¥ betongtakpannor vid köp av ett komplett tak med Benders originaltillbehör, gällande hÃ¥llfasthet, vattentäthet och frostbeständighet.</p> 1150 </div> 1151 </div> 1152</div> 1153</div><div class="col col-4"> 1154 1155 1156<div class="m m-promo"> 1157 1158<a href="/materialgaranti/" class="m-h"> 1159 <img src="/gui/i/icon-15.svg" alt="" /> 1160 1161 <h3>Tio Ã¥r materialgaranti</h3> 1162</a> 1163 1164 <div class="m-c"> 1165 <div> 1166 <p>VÃ¥ra sortiment hÃ¥ller en hög och jämn kvalitet som tÃ¥l mÃ¥nga Ã¥rs slitage under tuffa förhÃ¥llanden. PÃ¥ vÃ¥ra egenproducerade produkter fÃ¥r du hela 10 Ã¥rs garanti.</p> 1167 </div> 1168 </div> 1169</div> 1170</div><div class="col col-4"> 1171 1172 1173<div class="m m-promo"> 1174 1175<div class="m-h"> 1176 <img src="/gui/i/icon-worldwide.svg" alt="" /> 1177 1178 <h3>Effektiv logistik</h3> 1179</div> 1180 1181 <div class="m-c"> 1182 <div> 1183 <p>Vi har alltid stora lager för snabba leveranser. VÃ¥r erfarenhet av logistik ger möjlighet till effektiva, säkra och miljömässiga transporter.</p> 1184 </div> 1185 </div> 1186</div> 1187</div></div> 1188 </div> 1189 </div> 1190 1191 1192 </div> 1193 1194 1195 <div class="section divide"> 1196 <div class="inspiration-row"> 1197 <div class="container"><div class="col col-3"> 1198 1199 1200<div class="m m-tile m-16x10"> 1201 <div class="m-w"> 1202 <div class="m-i"> 1203 <img src="/filtered/2304/rszww580h326-60/tips-sok-aterforsaljare280x163-1125682406-rszww580h326-60.jpg" height="163" width="290" data-id="2304" loading="lazy" alt="TvÃ¥ personer stÃ¥r och diskuterar om en takpanna." /> 1204 </div> 1205 <div class="m-c"> 1206 <a class="m-b" href="/sok-aterforsaljare/"> 1207 <h3>Sök Ã¥terförsäljare</h3> 1208 </a> 1209 </div> 1210 </div> 1211</div> 1212</div><div class="col col-3"> 1213 1214 1215<div class="m m-tile m-16x10"> 1216 <div class="m-w"> 1217 <div class="m-i"> 1218 <img src="/filtered/26474/rszww580h326-60/tips-inspiration-2022-280x163--1684834074-rszww580h326-60.jpg" height="163" width="290" data-id="26474" loading="lazy" alt="TrädgÃ¥rdsmiljö med plattor, kantsten och blommor framför ett hus." /> 1219 </div> 1220 <div class="m-c"> 1221 <a class="m-b" href="/inspiration/"> 1222 <h3>Inspireras</h3> 1223 </a> 1224 </div> 1225 </div> 1226</div> 1227</div><div class="col col-3"> 1228 1229 1230<div class="m m-tile m-16x10"> 1231 <div class="m-w"> 1232 <div class="m-i"> 1233 <img src="/filtered/2311/rszww580h326-60/tips-behover-du-hjalp280x163-2089847526-rszww580h326-60.jpg" height="163" width="290" data-id="2311" loading="lazy" alt="TvÃ¥ personer kollar pÃ¥ en karta och funderar pÃ¥ vilken väg de ska gÃ¥." /> 1234 </div> 1235 <div class="m-c"> 1236 <a class="m-b" href="/support/vanliga-fragor/"> 1237 <h3>Behöver du hjälp?</h3> 1238 </a> 1239 </div> 1240 </div> 1241</div> 1242</div><div class="col col-3"> 1243 1244 1245<div class="m m-tile m-16x10"> 1246 <div class="m-w"> 1247 <div class="m-i"> 1248 <img src="/filtered/2315/rszww580h326-60/tips-dokument280x163--1634334618-rszww580h326-60.jpg" height="163" width="290" data-id="2315" loading="lazy" alt="Benders broschyrer och dokument ligger i en hög." /> 1249 </div> 1250 <div class="m-c"> 1251 <a class="m-b" href="/support/dokument/"> 1252 <h3>Dokument</h3> 1253 </a> 1254 </div> 1255 </div> 1256</div> 1257</div></div> 1258 </div> 1259 </div> 1260 1261 1262 <div id="footer" role="contentinfo"> 1263 <div class="container"> 1264 1265 1266<div id="go-to-top"><a href="#">Topp</a></div> 1267<div class="row"> 1268 <div class="col col-2"> 1269 <h2> 1270 <span>Sortiment</span> 1271 </h2> 1272 <ul><li><a href="/sortiment/tak/">Tak</a></li><li><a href="/sortiment/mark/">Mark</a></li><li><a href="/sortiment/natursten/">Natursten</a></li><li><a href="/sortiment/infrastruktur/">Infrastruktur</a></li><li><a href="/sortiment/va-system/">VA-System</a></li><li><a href="/sortiment/grund/">Grund</a></li><li><a href="/sortiment/murblock/">Murblock</a></li><li><a href="/sortiment/dorr/">Dörr</a></li></ul> 1273 1274 </div> 1275 <div class="col col-2"> 1276 <h2> 1277 <span>Benders</span> 1278 </h2> 1279 <ul><li><a href="/om-oss/nyheter/">Nyheter</a></li><li><a href="/om-oss/artikelarkiv/">Artikelarkiv</a></li><li><a target="_blank" href="https://issuu.com/benders/docs/foretagspresentation-2026?fr=sMTFmYzg0MjE3NTc">Företagspresentation</a></li><li><a href="https://issuu.com/benders/docs/benders-retursystem-2021-lu?fr=sN2RiNTE4OTgwMA">Benders Retursystem</a></li><li><a href="/kma/">KMA - Kvalitet, Miljö och Arbetsmiljö</a></li><li><a href="/visselblasning/">Visselblåsning</a></li><li><a href="/lediga-tjanster/">Lediga tjänster</a></li></ul> 1280 1281 </div> 1282 <div class="col col-2"> 1283 <h2> 1284 <span>Support</span> 1285 </h2> 1286 <ul><li><a href="/support/vanliga-fragor/">Vanliga frågor</a></li><li><a href="/support/kontakt/">Kontakt</a></li><li><a href="/support/dokument/">Dokument</a></li><li><a href="/support/broschyrer/">Broschyrer</a></li><li><a href="/support/monteringsfilmer/">Monteringsfilmer</a></li><li><a href="/support/berakningsprogram/">Beräkningsprogram</a></li><li><a href="/press/">Press</a></li><li><a href="/for-leverantorer/">Leverantör</a></li></ul> 1287 1288 </div> 1289 <div class="col col-4">
1290 <div class="contact"> 1291 <h2>Kontakt</h2> 1292<p>Tel 010-888 00 00</p> 1293<p>E-post <a href="mailto:[email protected]">[email protected]</a></p> 1294 </div> 1295 <address><p><strong>Benders Sverige AB</strong> <span>Box 20</span> <span>535 21 Kvänum</span></p></address> 1296 </div> 1297 <div class="col col-2"> 1298 <h2>Sök Ã¥terförsäljare</h2> 1299<p>Närmsta Ã¥terförsäljare där du kan hitta Benders produktutbud. </p> 1300<p><a class="button" href="/sok-aterforsaljare/">Sök Ã¥f</a></p> 1301 </div> 1302</div> 1303</div> 1304 <div class="footer-info"> 1305 <div class="container"> 1306 <div> 1307 <p>© 2019 Benders Sverige AB <a href="/anvandarvillkor/">Användarvillkor</a><a href="/integritetspolicy/">Integritetspolicy</a><a href="/webbplatskarta/">Webbplatskarta</a></p> 1308<p>Vi reserverar oss för färgavvikelser i vÃ¥ra bilder. Skärmar visar färger olika, vilket medför att vÃ¥ra bilder kan bli missvisande. Besök alltid en Ã¥terförsäljare för exakt färggivning.</p> 1309</div> 1310 1311 1312 <ul class="social-links"> 1313 1314 <li><a class="instagram" href="https://www.instagram.com/benderssverige/">Instagram</a></li> 1315 1316 <li><a class="linkedin" href="https://www.linkedin.com/company/benders-sverige-ab">LinkedIn</a></li> 1317 1318 <li><a class="facebook" href="https://www.facebook.com/benderssverige/">Facebook</a></li> 1319 1320 <li><a class="youtube" href="https://www.youtube.com/user/benderstv">Youtube</a></li> 1321 1322 </ul> 1323 1324 1325 1326 </div> 1327 </div> 1328 </div> 1329 </div> 1330 1331 <!-- Modal --> 1332 <div class="modal" id="imageModal"> 1333 <div class="modal-content"> 1334 <div class="close-btn" id="closeBtn">×</div> 1335 <div class="zoom-info" id="zoomInfo">100%</div> 1336 <div class="nav-arrow prev" id="prevBtn">❮</div> 1337 <img id="modalImage" src="" alt="Large View" /> 1338 <div class="nav-arrow next" id="nextBtn">❯</div> 1339 <div class="zoom-controls"> 1340 <button class="zoom-btn" id="zoomOutBtn">Zooma ut</button> 1341 <button class="zoom-btn" id="resetZoomBtn">à terställ</button> 1342 <button class="zoom-btn" id="zoomInBtn">Zooma in</button> 1343 </div> 1344 </div> 1345 </div> 1346 1347 1348 1349
1349<script> 1350 // Vanilla JavaScript Image Viewer with Zoom 1351 (function() { 1352 'use strict'; 1353 1354 // Get DOM elements 1355 const modal = document.getElementById('imageModal'); 1356 const modalImage = document.getElementById('modalImage'); 1357 const closeBtn = document.getElementById('closeBtn'); 1358 const prevBtn = document.getElementById('prevBtn'); 1359 const nextBtn = document.getElementById('nextBtn'); 1360 const zoomInBtn = document.getElementById('zoomInBtn'); 1361 const zoomOutBtn = document.getElementById('zoomOutBtn'); 1362 const resetZoomBtn = document.getElementById('resetZoomBtn'); 1363 const zoomInfo = document.getElementById('zoomInfo'); 1364 1365 // State variables 1366 let currentImageIndex = 0; 1367 let images = []; 1368 let currentContainerImages = []; // Images from the current container only 1369 let currentZoom = 1; 1370 1371 // Initialize the viewer 1372 function init() { 1373 scanForImages(); 1374 setupMutationObserver(); 1375 addEventListeners(); 1376 } 1377 1378 // Configuration - Dynamic container detection 1379 // This will automatically find ALL containers that have .image-item elements 1380 const DYNAMIC_DETECTION = true; // Set to true for automatic detection of multiple containers 1381 const FALLBACK_CONTAINER_SELECTOR = '#imageContainer'; // Used only if no containers are found 1382 1383 function scanForImages() { 1384 let containers = []; 1385 let allImageElements = []; 1386 1387 // First, try to find .image-container elements (new structure) 1388 const imageContainers = document.querySelectorAll('.image-container'); 1389 if (imageContainers.length > 0) { 1390 containers = Array.from(imageContainers); 1391 containers.forEach((container) => { 1392 const imageElements = container.querySelectorAll('.image-item img'); 1393 allImageElements.push(...imageElements); 1394 }); 1395 } else { 1396 // Fallback: Look for the existing Benders structure 1397 // Find .m-i containers (model image containers in your HTML) 1398 const modelContainers = document.querySelectorAll('.m-i'); 1399 if (modelContainers.length > 0) { 1400 containers = Array.from(modelContainers); 1401 containers.forEach((container) => { 1402 const imageElements = container.querySelectorAll('img[data-src]'); 1403 allImageElements.push(...imageElements); 1404 }); 1405 } 1406 1407 // Also check for direct images with data-src 1408 if (allImageElements.length === 0) { 1409 const directImages = document.querySelectorAll('img[data-src]'); 1410 allImageElements = Array.from(directImages); 1411 // Create virtual containers for direct images 1412 containers = allImageElements.map(img => img.closest('.m') || img.parentElement); 1413 } 1414 } 1415 1416 // Build images array from DOM 1417 images = Array.from(allImageElements).map((img, index) => ({ 1418 element: img, 1419 src: img.getAttribute('data-src') || img.src, 1420 id: img.getAttribute('data-id') || `img_${index}`, 1421 index: index, 1422 container: img.closest('.image-container') || img.closest('.m') || img.parentElement 1423 })); 1424 1425 // Add click handlers using event delegation on document body 1426 // Remove any existing global listener 1427 if (window._imageViewerGlobalHandler) { 1428 document.removeEventListener('click', window._imageViewerGlobalHandler); 1429 } 1430 1431 // Create new global event handler 1432 const globalClickHandler = (e) => { 1433 let img = null; 1434 1435 // Check if the clicked element is an image inside .image-item (for Benders structure) 1436 if (e.target.tagName === 'IMG' && e.target.closest('.image-item')) { 1437 img = e.target; 1438 } 1439 // Also check for images with data-src (fallback structure) 1440 else if (e.target.tagName === 'IMG' && e.target.hasAttribute('data-src')) { 1441 img = e.target; 1442 } 1443 1444 if (img) { 1445 const imageIndex = images.findIndex(imageData => imageData.element === img); 1446 if (imageIndex !== -1) { 1447 e.preventDefault(); 1448 openModal(imageIndex); 1449 } 1450 } 1451 }; 1452 1453 document.addEventListener('click', globalClickHandler); 1454 window._imageViewerGlobalHandler = globalClickHandler; 1455 1456 // Store containers for the mutation observer 1457 window.imageViewerContainers = containers; 1458 1459 //console.log(`Found ${images.length} images in ${containers.length} containers`); 1460 } 1461 1462 function setupMutationObserver() { 1463 // Watch for changes in the entire document to catch dynamically added content 1464 const observer = new MutationObserver((mutations) => { 1465 let shouldRescan = false; 1466 1467 mutations.forEach((mutation) => { 1468 // Check if new nodes were added 1469 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
1470 // Check if any added nodes contain images in .image-item or images with data-src 1471 mutation.addedNodes.forEach((node) => { 1472 if (node.nodeType === Node.ELEMENT_NODE) { 1473 if (node.tagName === 'IMG' && (node.closest('.image-item') || node.hasAttribute('data-src'))) { 1474 shouldRescan = true; 1475 } else if (node.querySelector && (node.querySelector('.image-item img') || node.querySelector('img[data-src]'))) { 1476 shouldRescan = true; 1477 } 1478 } 1479 }); 1480 } 1481 1482 // Check for style/class changes that might affect visibility 1483 if (mutation.type === 'attributes' && 1484 (mutation.attributeName === 'style' || mutation.attributeName === 'class')) { 1485 const target = mutation.target; 1486 if (target.querySelector && target.querySelector('img[data-src]')) { 1487 shouldRescan = true; 1488 } 1489 } 1490 }); 1491 1492 if (shouldRescan) { 1493 setTimeout(() => { 1494 //console.log('Rescanning for images due to DOM changes...'); 1495 scanForImages(); 1496 }, 100); 1497 } 1498 }); 1499 1500 // Start observing the entire document body for dynamic content changes 1501 observer.observe(document.body, { 1502 childList: true, 1503 subtree: true, 1504 attributes: true, 1505 attributeFilter: ['style', 'class'] 1506 }); 1507 } 1508 1509 function addEventListeners() { 1510 // Close modal 1511 closeBtn.addEventListener('click', closeModal); 1512 1513 // Navigation 1514 prevBtn.addEventListener('click', showPrevious); 1515 nextBtn.addEventListener('click', showNext); 1516 1517 // Zoom controls 1518 zoomInBtn.addEventListener('click', zoomIn); 1519 zoomOutBtn.addEventListener('click', zoomOut); 1520 resetZoomBtn.addEventListener('click', resetZoom); 1521 1522 // Modal background click 1523 modal.addEventListener('click', (e) => { 1524 if (e.target === modal) closeModal(); 1525 }); 1526 1527 // Keyboard navigation 1528 document.addEventListener('keydown', handleKeyboard); 1529 1530 // Double click to zoom 1531 modalImage.addEventListener('dblclick', (e) => { 1532 e.preventDefault(); 1533 if (currentZoom > 1) { 1534 resetZoom(); 1535 } else { 1536 zoomIn(); 1537 } 1538 }); 1539 1540 // Single click to zoom 1541 modalImage.addEventListener('click', (e) => { 1542 e.preventDefault(); 1543 e.stopPropagation(); // Prevent modal from closing 1544 if (currentZoom >= 5) { 1545 // At max zoom, zoom out 1546 zoomOut(); 1547 } else { 1548 // Not at max zoom, zoom in 1549 zoomIn(); 1550 } 1551 }); 1552 1553 // Mouse wheel zoom 1554 modalImage.addEventListener('wheel', (e) => { 1555 e.preventDefault(); 1556 if (e.deltaY < 0) { 1557 zoomIn(); 1558 } else { 1559 zoomOut(); 1560 } 1561 }); 1562 1563 // Touch events for mobile 1564 let touchStartX = 0; 1565 let touchStartY = 0; 1566 1567 modalImage.addEventListener('touchstart', (e) => { 1568 touchStartX = e.touches[0].clientX; 1569 touchStartY = e.touches[0].clientY; 1570 }); 1571 1572 modalImage.addEventListener('touchend', (e) => { 1573 const touchEndX = e.changedTouches[0].clientX; 1574 const touchEndY = e.changedTouches[0].clientY; 1575 const diffX = touchStartX - touchEndX; 1576 const diffY = touchStartY - touchEndY; 1577 1578 // Swipe detection 1579 if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 50) { 1580 if (diffX > 0) { 1581 showNext(); 1582 } else { 1583 showPrevious(); 1584 } 1585 } 1586 }); 1587 } 1588 1589 function openModal(index) { 1590 currentImageIndex = index; 1591 1592 // Get the container of the clicked image 1593 const clickedImage = images[index]; 1594 const currentContainer = clickedImage.container; 1595 1596 // Filter images to only those from the same container 1597 currentContainerImages = images.filter(img => img.container === currentContainer); 1598 1599 // Find the index within the current container's images 1600 const containerIndex = currentContainerImages.findIndex(img => img.element === clickedImage.element); 1601 currentImageIndex = containerIndex; 1602 1603 resetZoom(); 1604 modalImage.src = currentContainerImages[currentImageIndex].src; 1605 1606 // Show/hide navigation arrows based on number of images 1607 updateNavigationVisibility(); 1608 1609 modal.style.display = 'block'; 1610 document.body.style.overflow = 'hidden'; 1611 } 1612 1613 function updateNavigationVisibility() { 1614 if (currentContainerImages.length <= 1) { 1615 // Hide arrows if only one image or no images 1616 prevBtn.classList.add('hidden'); 1617 nextBtn.classList.add('hidden'); 1618 } else { 1619 // Show arrows if multiple images 1620 prevBtn.classList.remove('hidden'); 1621 nextBtn.classList.remove('hidden'); 1622 } 1623 } 1624 1625 function closeModal() { 1626 modal.style.display = 'none'; 1627 document.body.style.overflow = ''; 1628 resetZoom(); 1629 } 1630 1631 function showPrevious() { 1632 currentImageIndex = (currentImageIndex - 1 + currentContainerImages.length) % currentContainerImages.length; 1633 modalImage.src = currentContainerImages[currentImageIndex].src; 1634 resetZoom(); 1635 updateNavigationVisibility(); 1636 } 1637 1638 function showNext() { 1639 currentImageIndex = (currentImageIndex + 1) % currentContainerImages.length; 1640 modalImage.src = currentContainerImages[currentImageIndex].src; 1641 resetZoom(); 1642 updateNavigationVisibility(); 1643 } 1644 1645 function updateZoom() { 1646 const transform = `scale(${currentZoom})`; 1647 modalImage.style.transform = transform; 1648 zoomInfo.textContent = Math.round(currentZoom * 100) + '%'; 1649 1650 // Update cursor based on zoom level and behavior 1651 if (currentZoom >= 5) { 1652 // At max zoom, show zoom-out cursor since next click will zoom out 1653 modalImage.classList.add('zoomed'); 1654 } else { 1655 // Not at max zoom, show zoom-in cursor since next click will zoom in 1656 modalImage.classList.remove('zoomed'); 1657 } 1658 } 1659 1660 function zoomIn() { 1661 currentZoom = Math.min(currentZoom * 1.25, 5); 1662 updateZoom(); 1663 } 1664 1665 function zoomOut() { 1666 currentZoom = Math.max(currentZoom / 1.25, 0.25); 1667 updateZoom(); 1668 } 1669 1670 function resetZoom() { 1671 currentZoom = 1; 1672 updateZoom(); 1673 } 1674 1675 function handleKeyboard(e) { 1676 if (modal.style.display !== 'block') return; 1677 1678 switch(e.key) { 1679 case 'Escape': 1680 closeModal(); 1681 break; 1682 case 'ArrowLeft': 1683 showPrevious(); 1684 break; 1685 case 'ArrowRight': 1686 showNext(); 1687 break; 1688 case '+': 1689 case '=': 1690 zoomIn(); 1691 break; 1692 case '-': 1693 zoomOut(); 1694 break; 1695 case '0': 1696 resetZoom(); 1697 break; 1698 } 1699 } 1700 1701 // Public function to manually rescan for images (useful for dynamic content) 1702 window.rescanImages = function() { 1703 scanForImages(); 1704 }; 1705 1706 // Function to handle ASP.NET AJAX postbacks 1707 window.handleAspNetAjaxUpdate = function() { 1708 //console.log('ASP.NET AJAX postback detected, rescanning images...'); 1709 // Delay the rescan to ensure DOM is fully updated 1710 setTimeout(() => { 1711 scanForImages(); 1712 }, 250); 1713 }; 1714 1715 // Hook into ASP.NET AJAX if available 1716 if (typeof Sys !== 'undefined' && Sys.WebForms && Sys.WebForms.PageRequestManager) { 1717 const prm = Sys.WebForms.PageRequestManager.getInstance(); 1718 prm.add_endRequest(function() { 1719 window.handleAspNetAjaxUpdate(); 1720 }); 1721 //console.log('Hooked into ASP.NET AJAX PageRequestManager'); 1722 } 1723 1724 // Also hook into jQuery AJAX if available (for custom AJAX calls) 1725 if (typeof $ !== 'undefined') { 1726 $(document).ajaxComplete(function() { 1727 //console.log('jQuery AJAX complete, rescanning images...'); 1728 setTimeout(() => scanForImages(), 250); 1729 }); 1730 } 1731 1732 // Hook into the showDiv function used by your ASP.NET page 1733 if (typeof showDiv === 'function') { 1734 const originalShowDiv = window.showDiv; 1735 window.showDiv = function(id) { 1736 const result = originalShowDiv.apply(this, arguments); 1737 setTimeout(() => { 1738 //console.log('showDiv called, rescanning images...'); 1739 scanForImages(); 1740 }, 100); 1741 return result; 1742 }; 1743 } 1744 1745 // Also hook into sku-toggle clicks that show/hide image containers 1746 document.addEventListener('click', function(e) { 1747 if (e.target.classList && e.target.classList.contains('sku-toggle')) { 1748 setTimeout(() => { 1749 //console.log('sku-toggle clicked, rescanning images...'); 1750 scanForImages(); 1751 }, 100); 1752 } 1753 }); 1754 1755 // Initialize when DOM is ready - more robust approach 1756 function initializeViewer() { 1757 // Look for either .image-container elements or images with data-src attributes
1758 const testContainers = document.querySelectorAll('.image-container'); 1759 const testImages = document.querySelectorAll('img[data-src]'); 1760 if (testContainers.length === 0 && testImages.length === 0) { 1761 // If we still can't find images, try again in a bit 1762 setTimeout(initializeViewer, 50); 1763 return; 1764 } 1765 console.log('Initializing image viewer...'); 1766 init(); 1767 } 1768 1769 // Try multiple initialization approaches 1770 if (document.readyState === 'loading') { 1771 document.addEventListener('DOMContentLoaded', initializeViewer); 1772 } else { 1773 initializeViewer(); 1774 } 1775 1776 // Also try after window load as a backup 1777 window.addEventListener('load', function() { 1778 setTimeout(initializeViewer, 100); 1779 }); 1780 })(); 1781 </script>
1781 1782 1783
1783<script> 1784 var netrTranslatedStrings = { 1785 general: { 1786 close: 'Stäng', 1787 error: 'Oj, nÃ¥got gick fel!', 1788 more: 'Merâ¦' 1789 }, 1790 product: { 1791 infolabel: 'Produktinformation', 1792 selectmsg: 'Välj en modell ovan för att fÃ¥ detaljerad produktinformation.' 1793 }, 1794 article: { 1795 printThisPage: 'Skriv ut' 1796 }, 1797 findstore: { 1798 findingNearby: 'Söker Ã¥terförsäljare i närheten' 1799 } 1800 }; 1801 </script>
1801 1802
1802<script src="//maps.google.com/maps/api/js?libraries=places&language=sv-SE&key=AIzaSyCl9BUPCXWudVABP_nLqihBXv3jZ-IUQiQ"></script>
1802 1803 <!--
1803<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCl9BUPCXWudVABP_nLqihBXv3jZ-IUQiQ&callback=initMap" type="text/javascript"></script>
1803--> 1804 1805 1806
1806<script src="/gui/js/build/main.min.js"></script>
1806 1807 1808</body> 1809</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.