Sections
Marquee photo gallery
20 Sep 2022
HTML
SCSS
PostCSS
JS
<section class="marquee-photo-gallery">
<div class="cont">
<h2>See what we are up to</h2>
<div class="social-media-wrapper">
<a
href="https://www.linkedin.com/company/tria-recruitment/"
class="circled-btn socials"
>
<i class="icon-linkedin"></i>
</a>
<a
href="https://www.instagram.com/triarecruitment/"
class="circled-btn socials"
>
<i class="icon-instagram"></i>
</a>
<a href="https://twitter.com/triarecruitment" class="circled-btn socials">
<i class="icon-twitter"></i>
</a>
<a
href="https://m.facebook.com/TriaRecruitment/"
class="circled-btn socials"
>
<i class="icon-facebook"></i>
</a>
</div>
</div>
<div class="marquee-photo-gallery-block first">
<div class="element small">
<img src="../../images/gallery/photo-gallery-8.png" alt loading="lazy" />
</div>
<div class="element large">
<img src="../../images/gallery/photo-gallery-1.png" alt loading="lazy" />
</div>
<div class="element medium">
<img src="../../images/gallery/photo-gallery-6.png" alt loading="lazy" />
</div>
<div class="element large">
<img src="../../images/gallery/photo-gallery-5.png" alt loading="lazy" />
</div>
</div>
<div class="marquee-photo-gallery-block second">
<div class="element large">
<img src="../../images/gallery/photo-gallery-2.png" alt loading="lazy" />
</div>
<div class="element medium">
<img src="../../images/gallery/photo-gallery-4.png" alt loading="lazy" />
</div>
<div class="element large">
<img src="../../images/gallery/photo-gallery-3.png" alt loading="lazy" />
</div>
<div class="element small">
<img src="../../images/gallery/photo-gallery-7.png" alt loading="lazy" />
</div>
</div>
<div class="cont">
<a href="#" class="btn meet-the-team">Meet the Team</a>
</div>
</section>
.marquee-photo-gallery {
padding-top: ac(100px, 50px);
margin-bottom: ac(210px, 70px);
.social-media-wrapper {
display: flex;
align-items: center;
justify-content: center;
margin: ac(30px, 20px) auto ac(46px, 30px);
a:not(:last-child) {
margin-right: 16px;
}
}
.cont > h2 {
text-align: center;
}
&-block {
position: relative;
height: ac(375px, 146.4844px);
.element {
border-radius: ac(20px, 10px);
overflow: hidden;
margin-right: ac(34px, 20px);
position: relative;
height: 100%;
flex-shrink: 0;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
&.small {
width: ac(320px, 125px);
max-width: 320px;
}
&.medium {
width: ac(375px, 146.4844px);
max-width: 375px;
}
&.large {
width: ac(660px, 257.8125px);
max-width: 660px;
}
}
.js-marquee {
display: flex;
height: 100%;
flex-shrink: 0;
margin-right: 0 !important;
&-wrapper {
height: 100% !important;
display: flex;
}
}
&.first {
margin-bottom: 25px;
}
}
.btn.meet-the-team {
margin: ac(62px, 30px) auto 0;
}
}
.circled-btn {
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
border-width: ac(3px, 2px);
border-style: solid;
border-color: var(--white);
@include transition-all;
&:hover {
background-color: var(--white);
i {
color: var(--black);
}
}
i {
color: var(--white);
@include transition-all;
}
&.socials {
width: ac(54px, 30px);
height: ac(54px, 30px);
font-size: ac(20px, 12px);
}
}
.marquee-photo-gallery {
padding-top: ac(100px, 50px);
margin-bottom: ac(210px, 70px);
.social-media-wrapper {
display: flex;
align-items: center;
justify-content: center;
margin: ac(30px, 20px) auto ac(46px, 30px);
a:not(:last-child) {
margin-right: 16px;
}
}
.cont > h2 {
text-align: center;
}
&-block {
position: relative;
height: ac(375px, 146.4844px);
.element {
border-radius: ac(20px, 10px);
overflow: hidden;
margin-right: ac(34px, 20px);
position: relative;
height: 100%;
flex-shrink: 0;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
&.small {
width: ac(320px, 125px);
max-width: 320px;
}
&.medium {
width: ac(375px, 146.4844px);
max-width: 375px;
}
&.large {
width: ac(660px, 257.8125px);
max-width: 660px;
}
}
.js-marquee {
display: flex;
height: 100%;
flex-shrink: 0;
margin-right: 0 !important;
&-wrapper {
height: 100% !important;
display: flex;
}
}
&.first {
margin-bottom: 25px;
}
}
.btn.meet-the-team {
margin: ac(62px, 30px) auto 0;
}
}
.circled-btn {
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
border-width: ac(3px, 2px);
border-style: solid;
border-color: var(--white);
@mixin transition-all;
&:hover {
background-color: var(--white);
i {
color: var(--black);
}
}
i {
color: var(--white);
@mixin transition-all;
}
&.socials {
width: ac(54px, 30px);
height: ac(54px, 30px);
font-size: ac(20px, 12px);
}
}
(function (factory) {
"use strict";
if (typeof define === "function" && define.amd) {
define(["jquery"], factory);
} else if (typeof exports !== "undefined") {
module.exports = factory(require("jquery"));
} else {
factory(jQuery);
}
})(function ($) {
$.fn.marquee = function (options) {
return this.each(function () {
var o = $.extend({}, $.fn.marquee.defaults, options),
$this = $(this),
$marqueeWrapper,
containerWidth,
animationCss,
verticalDir,
elWidth,
loopCount = 3,
playState = "animation-play-state",
css3AnimationIsSupported = false,
_prefixedEvent = function (element, type, callback) {
var pfx = ["webkit", "moz", "MS", "o", ""];
for (var p = 0; p < pfx.length; p++) {
if (!pfx[p]) type = type.toLowerCase();
element.addEventListener(pfx[p] + type, callback, false);
}
},
_objToString = function (obj) {
var tabjson = [];
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
tabjson.push(p + ":" + obj[p]);
}
}
tabjson.push();
return "{" + tabjson.join(",") + "}";
},
_startAnimationWithDelay = function () {
$this.timer = setTimeout(animate, o.delayBeforeStart);
},
methods = {
pause: function () {
if (css3AnimationIsSupported && o.allowCss3Support) {
$marqueeWrapper.css(playState, "paused");
} else {
if ($.fn.pause) {
$marqueeWrapper.pause();
}
}
$this.data("runningStatus", "paused");
$this.trigger("paused");
},
resume: function () {
if (css3AnimationIsSupported && o.allowCss3Support) {
$marqueeWrapper.css(playState, "running");
} else {
if ($.fn.resume) {
$marqueeWrapper.resume();
}
}
$this.data("runningStatus", "resumed");
$this.trigger("resumed");
},
toggle: function () {
methods[
$this.data("runningStatus") === "resumed" ? "pause" : "resume"
]();
},
destroy: function () {
clearTimeout($this.timer);
$this.find("*").addBack().off();
$this.html($this.find(".js-marquee:first").html());
},
};
if (typeof options === "string") {
if ($.isFunction(methods[options])) {
if (!$marqueeWrapper) {
$marqueeWrapper = $this.find(".js-marquee-wrapper");
}
if ($this.data("css3AnimationIsSupported") === true) {
css3AnimationIsSupported = true;
}
methods[options]();
}
return;
}
var dataAttributes = {},
attr;
$.each(o, function (key) {
attr = $this.attr("data-" + key);
if (typeof attr !== "undefined") {
switch (attr) {
case "true":
attr = true;
break;
case "false":
attr = false;
break;
}
o[key] = attr;
}
});
if (o.speed) {
o.duration = (parseInt($this.width(), 10) / o.speed) * 1e3;
}
verticalDir = o.direction === "up" || o.direction === "down";
o.gap = o.duplicated ? parseInt(o.gap) : 0;
$this.wrapInner('<div class="js-marquee"></div>');
var $el = $this
.find(".js-marquee")
.css({ "margin-right": o.gap, float: "left" });
if (o.duplicated) {
$el.clone(true).appendTo($this);
}
$this.wrapInner(
'<div style="width:100000px" class="js-marquee-wrapper"></div>'
);
$marqueeWrapper = $this.find(".js-marquee-wrapper");
if (verticalDir) {
var containerHeight = $this.height();
$marqueeWrapper.removeAttr("style");
$this.height(containerHeight);
$this
.find(".js-marquee")
.css({ float: "none", "margin-bottom": o.gap, "margin-right": 0 });
if (o.duplicated) {
$this.find(".js-marquee:last").css({ "margin-bottom": 0 });
}
var elHeight = $this.find(".js-marquee:first").height() + o.gap;
if (o.startVisible && !o.duplicated) {
o._completeDuration =
((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) /
parseInt(containerHeight, 10)) *
o.duration;
o.duration =
(parseInt(elHeight, 10) / parseInt(containerHeight, 10)) *
o.duration;
} else {
o.duration =
((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) /
parseInt(containerHeight, 10)) *
o.duration;
}
} else {
elWidth = $this.find(".js-marquee:first").width() + o.gap;
containerWidth = $this.width();
if (o.startVisible && !o.duplicated) {
o._completeDuration =
((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) /
parseInt(containerWidth, 10)) *
o.duration;
o.duration =
(parseInt(elWidth, 10) / parseInt(containerWidth, 10)) * o.duration;
} else {
o.duration =
((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) /
parseInt(containerWidth, 10)) *
o.duration;
}
}
if (o.duplicated) {
o.duration = o.duration / 2;
}
if (o.allowCss3Support) {
var elm = document.body || document.createElement("div"),
animationName = "marqueeAnimation-" + Math.floor(Math.random() * 1e7),
domPrefixes = "Webkit Moz O ms Khtml".split(" "),
animationString = "animation",
animationCss3Str = "",
keyframeString = "";
if (elm.style.animation !== undefined) {
keyframeString = "@keyframes " + animationName + " ";
css3AnimationIsSupported = true;
}
if (css3AnimationIsSupported === false) {
for (var i = 0; i < domPrefixes.length; i++) {
if (elm.style[domPrefixes[i] + "AnimationName"] !== undefined) {
var prefix = "-" + domPrefixes[i].toLowerCase() + "-";
animationString = prefix + animationString;
playState = prefix + playState;
keyframeString =
"@" + prefix + "keyframes " + animationName + " ";
css3AnimationIsSupported = true;
break;
}
}
}
if (css3AnimationIsSupported) {
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s " +
o.delayBeforeStart / 1e3 +
"s infinite " +
o.css3easing;
$this.data("css3AnimationIsSupported", true);
}
}
var _rePositionVertically = function () {
$marqueeWrapper.css(
"transform",
"translateY(" +
(o.direction === "up"
? containerHeight + "px"
: "-" + elHeight + "px") +
")"
);
},
_rePositionHorizontally = function () {
$marqueeWrapper.css(
"transform",
"translateX(" +
(o.direction === "left"
? containerWidth + "px"
: "-" + elWidth + "px") +
")"
);
};
if (o.duplicated) {
if (verticalDir) {
if (o.startVisible) {
$marqueeWrapper.css("transform", "translateY(0)");
} else {
$marqueeWrapper.css(
"transform",
"translateY(" +
(o.direction === "up"
? containerHeight + "px"
: "-" + (elHeight * 2 - o.gap) + "px") +
")"
);
}
} else {
if (o.startVisible) {
$marqueeWrapper.css("transform", "translateX(0)");
} else {
$marqueeWrapper.css(
"transform",
"translateX(" +
(o.direction === "left"
? containerWidth + "px"
: "-" + (elWidth * 2 - o.gap) + "px") +
")"
);
}
}
if (!o.startVisible) {
loopCount = 1;
}
} else if (o.startVisible) {
loopCount = 2;
} else {
if (verticalDir) {
_rePositionVertically();
} else {
_rePositionHorizontally();
}
}
var animate = function () {
if (o.duplicated) {
if (loopCount === 1) {
o._originalDuration = o.duration;
if (verticalDir) {
o.duration =
o.direction === "up"
? o.duration + containerHeight / (elHeight / o.duration)
: o.duration * 2;
} else {
o.duration =
o.direction === "left"
? o.duration + containerWidth / (elWidth / o.duration)
: o.duration * 2;
}
if (animationCss3Str) {
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s " +
o.delayBeforeStart / 1e3 +
"s " +
o.css3easing;
}
loopCount++;
} else if (loopCount === 2) {
o.duration = o._originalDuration;
if (animationCss3Str) {
animationName = animationName + "0";
keyframeString = $.trim(keyframeString) + "0 ";
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s 0s infinite " +
o.css3easing;
}
loopCount++;
}
}
if (verticalDir) {
if (o.duplicated) {
if (loopCount > 2) {
$marqueeWrapper.css(
"transform",
"translateY(" +
(o.direction === "up" ? 0 : "-" + elHeight + "px") +
")"
);
}
animationCss = {
transform:
"translateY(" +
(o.direction === "up" ? "-" + elHeight + "px" : 0) +
")",
};
} else if (o.startVisible) {
if (loopCount === 2) {
if (animationCss3Str) {
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s " +
o.delayBeforeStart / 1e3 +
"s " +
o.css3easing;
}
animationCss = {
transform:
"translateY(" +
(o.direction === "up"
? "-" + elHeight + "px"
: containerHeight + "px") +
")",
};
loopCount++;
} else if (loopCount === 3) {
o.duration = o._completeDuration;
if (animationCss3Str) {
animationName = animationName + "0";
keyframeString = $.trim(keyframeString) + "0 ";
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s 0s infinite " +
o.css3easing;
}
_rePositionVertically();
}
} else {
_rePositionVertically();
animationCss = {
transform:
"translateY(" +
(o.direction === "up"
? "-" + $marqueeWrapper.height() + "px"
: containerHeight + "px") +
")",
};
}
} else {
if (o.duplicated) {
if (loopCount > 2) {
$marqueeWrapper.css(
"transform",
"translateX(" +
(o.direction === "left" ? 0 : "-" + elWidth + "px") +
")"
);
}
animationCss = {
transform:
"translateX(" +
(o.direction === "left" ? "-" + elWidth + "px" : 0) +
")",
};
} else if (o.startVisible) {
if (loopCount === 2) {
if (animationCss3Str) {
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s " +
o.delayBeforeStart / 1e3 +
"s " +
o.css3easing;
}
animationCss = {
transform:
"translateX(" +
(o.direction === "left"
? "-" + elWidth + "px"
: containerWidth + "px") +
")",
};
loopCount++;
} else if (loopCount === 3) {
o.duration = o._completeDuration;
if (animationCss3Str) {
animationName = animationName + "0";
keyframeString = $.trim(keyframeString) + "0 ";
animationCss3Str =
animationName +
" " +
o.duration / 1e3 +
"s 0s infinite " +
o.css3easing;
}
_rePositionHorizontally();
}
} else {
_rePositionHorizontally();
animationCss = {
transform:
"translateX(" +
(o.direction === "left"
? "-" + elWidth + "px"
: containerWidth + "px") +
")",
};
}
}
$this.trigger("beforeStarting");
if (css3AnimationIsSupported) {
$marqueeWrapper.css(animationString, animationCss3Str);
var keyframeCss =
keyframeString + " { 100% " + _objToString(animationCss) + "}",
$styles = $marqueeWrapper.find("style");
if ($styles.length !== 0) {
$styles.filter(":last").html(keyframeCss);
} else {
$("head").append("<style>" + keyframeCss + "</style>");
}
_prefixedEvent($marqueeWrapper[0], "AnimationIteration", function () {
$this.trigger("finished");
});
_prefixedEvent($marqueeWrapper[0], "AnimationEnd", function () {
animate();
$this.trigger("finished");
});
} else {
$marqueeWrapper.animate(
animationCss,
o.duration,
o.easing,
function () {
$this.trigger("finished");
if (o.pauseOnCycle) {
_startAnimationWithDelay();
} else {
animate();
}
}
);
}
$this.data("runningStatus", "resumed");
};
$this.on("pause", methods.pause);
$this.on("resume", methods.resume);
if (o.pauseOnHover) {
$this.on("mouseenter", methods.pause);
$this.on("mouseleave", methods.resume);
}
if (css3AnimationIsSupported && o.allowCss3Support) {
animate();
} else {
_startAnimationWithDelay();
}
});
};
$.fn.marquee.defaults = {
allowCss3Support: true,
css3easing: "linear",
easing: "linear",
delayBeforeStart: 1e3,
direction: "left",
duplicated: false,
duration: 5e3,
speed: 0,
gap: 20,
pauseOnCycle: false,
pauseOnHover: false,
startVisible: false,
};
});
const marqueePhotoGallery = document.getElementsByClassName(
"marquee-photo-gallery"
)[0];
if (marqueePhotoGallery) {
function makeMarquee(element, directionOption = "left") {
var $mg = $(element).marquee({
duration: 100000,
delayBeforeStart: 0,
direction: directionOption,
duplicated: true,
startVisible: true,
});
}
const firstGallery = marqueePhotoGallery.querySelector(".first");
const secondGallery = marqueePhotoGallery.querySelector(".second");
if (firstGallery) {
makeMarquee(firstGallery);
}
if (secondGallery) {
makeMarquee(secondGallery, "right");
}
}
const marqueeTestimonials = document.getElementsByClassName("testimonials")[0];
if (marqueeTestimonials) {
const marqueeArr = marqueeTestimonials.querySelectorAll(
".testimonials-wrapper .element"
);
let flagMarqueeTestimonials = false;
let flagMarqueeTestimonials_WindowWidth = window.innerWidth;
if (marqueeArr.length <= 2) {
marqueeTestimonials
.getElementsByClassName("testimonials-wrapper")[0]
.classList.add("disabled-marquee");
flagMarqueeTestimonials = true;
}
if (
!flagMarqueeTestimonials &&
flagMarqueeTestimonials_WindowWidth >= 650 &&
marqueeArr.length > 2
) {
flagMarqueeTestimonials = true;
$(".testimonials-wrapper").marquee({
duration: 50000,
delayBeforeStart: 0,
direction: "left",
duplicated: true,
startVisible: true,
pauseOnHover: true,
});
}
window.addEventListener("resize", function () {
if (
window.innerWidth === flagMarqueeTestimonials_WindowWidth ||
flagMarqueeTestimonials
)
return;
flagMarqueeTestimonials_WindowWidth = window.innerWidth;
flagMarqueeTestimonials = true;
$(".testimonials-wrapper").marquee({
duration: 50000,
delayBeforeStart: 0,
direction: "left",
duplicated: true,
startVisible: true,
pauseOnHover: true,
});
});
}
// Adaptive calculation for pcss
const maxWidth = 1440;
const minWidth = 768;
export function ac( startSize, endSize, minBreakpoint = minWidth, maxBreakpoint = maxWidth) {
const startSizeFormatted = startSize.replace("px", "");
const endSizeFormatted = endSize.replace("px", "");
const difference = startSizeFormatted - endSizeFormatted;
if (difference > 0) {
return `min(max(calc(${endSize} + ${difference} * ((100vw - ${minBreakpoint}px) / ${maxBreakpoint - minBreakpoint})),${endSize}),${startSize})`;
} else {
return `min(max(calc(${endSize} + ${difference} * ((100vw - ${minBreakpoint}px) / ${maxBreakpoint - minBreakpoint})),${startSize}),${endSize})`;
}
}